From 0647251d9b919713c27b959f31a4048c25142736 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Mon, 24 Oct 2022 03:42:01 +0300 Subject: [PATCH 01/28] On-chainVoting --- deploy/02-deploy-timelock.js | 8 +- deploy/04-setup-governance-contract.js | 35 +- deploy/05-deploy-box.js | 32 + deployments/localhost/.chainId | 1 + deployments/localhost/Box.json | 185 ++ deployments/localhost/GovernanceToken.json | 922 +++++++++ deployments/localhost/GovernerContract.json | 1779 +++++++++++++++++ deployments/localhost/TimeLock.json | 1173 +++++++++++ .../0a567a41a96dc2d81abbf99faae0732b.json | 146 ++ helper-config.js | 10 + proposals.json | 1 + scripts/propose.js | 46 + scripts/queue-and-execute.js | 57 + scripts/vote.js | 37 + utils/move-blocks.js | 20 + utils/move-time.js | 8 + 16 files changed, 4434 insertions(+), 26 deletions(-) create mode 100644 deploy/05-deploy-box.js create mode 100644 deployments/localhost/.chainId create mode 100644 deployments/localhost/Box.json create mode 100644 deployments/localhost/GovernanceToken.json create mode 100644 deployments/localhost/GovernerContract.json create mode 100644 deployments/localhost/TimeLock.json create mode 100644 deployments/localhost/solcInputs/0a567a41a96dc2d81abbf99faae0732b.json create mode 100644 proposals.json create mode 100644 scripts/propose.js create mode 100644 scripts/queue-and-execute.js create mode 100644 scripts/vote.js create mode 100644 utils/move-blocks.js create mode 100644 utils/move-time.js diff --git a/deploy/02-deploy-timelock.js b/deploy/02-deploy-timelock.js index 2f75886..515587f 100644 --- a/deploy/02-deploy-timelock.js +++ b/deploy/02-deploy-timelock.js @@ -7,20 +7,20 @@ module.exports = async ({ getNamedAccounts, deployments }) => { const { deployer } = await getNamedAccounts(); args = [MIN_DELAY, [], []]; - const timelock = await deploy("TimeLock", { + const timeLock = await deploy("TimeLock", { from: deployer, args: args, log: true, waitConfirmations: network.config.blockConfirmations || 1, }); - log(`timelock deployed at ${timelock.address}`); + log(`timelock deployed at ${timeLock.address}`); if ( !developmentChains.includes(network.name) && process.env.ETHERSCAN_API_KEY ) { - await verify(timelock.address, args); + await verify(timeLock.address, args); } }; -module.exports.tags = ["all", "governanceToken"]; +module.exports.tags = ["all", "timeLock"]; diff --git a/deploy/04-setup-governance-contract.js b/deploy/04-setup-governance-contract.js index 1b90ec9..7ac7b23 100644 --- a/deploy/04-setup-governance-contract.js +++ b/deploy/04-setup-governance-contract.js @@ -4,37 +4,28 @@ const { VOTING_PERIOD, VOTING_DELAY, QUORUM_PERCENTAGE, + ADDRESS_ZERO, } = require("../helper-config"); const { verify } = require("../utils/verify"); module.exports = async ({ getNamedAccounts, deployments }) => { const { deploy, log } = deployments; const { deployer } = await getNamedAccounts(); - const governanceToken = await ethers.getContract("GovernanceToken", deployer); + const governor = await ethers.getContract("GovernerContract", deployer); const timelock = await ethers.getContract("TimeLock", deployer); console.log("Setting up roles..."); - args = [ - governanceToken.address, - timelock.address, - VOTING_DELAY, - VOTING_PERIOD, - QUORUM_PERCENTAGE, - ]; - const governorContract = await deploy("GovernerContract", { - from: deployer, - args: args, - log: true, - waitConfirmations: network.config.blockConfirmations || 1, - }); - log(`governorContract deployed at ${governorContract.address}`); - if ( - !developmentChains.includes(network.name) && - process.env.ETHERSCAN_API_KEY - ) { - await verify(governorContract.address, args); - } + const proposerRole = await timelock.PROPOSER_ROLE(); + const executorRole = await timelock.EXECUTOR_ROLE(); + const adminRole = await timelock.TIMELOCK_ADMIN_ROLE(); + + const proposerTx = await timelock.grantRole(proposerRole, governor.address); + await proposerTx.wait(1); + const executorTx = await timelock.grantRole(executorRole, ADDRESS_ZERO); + await executorTx.wait(1); + const revokeTx = await timelock.revokeRole(adminRole, deployer); + await revokeTx.wait(1); }; -module.exports.tags = ["all", "governorContract"]; +module.exports.tags = ["all", "setupGovernanceContract"]; diff --git a/deploy/05-deploy-box.js b/deploy/05-deploy-box.js new file mode 100644 index 0000000..19ea5b2 --- /dev/null +++ b/deploy/05-deploy-box.js @@ -0,0 +1,32 @@ +const { getNamedAccounts, deployments, network, ethers } = require("hardhat"); +const { developmentChains } = require("../helper-config"); +const { verify } = require("../utils/verify"); + +module.exports = async ({ getNamedAccounts, deployments }) => { + const { deploy, log } = deployments; + const { deployer } = await getNamedAccounts(); + + args = []; + log("deploying box contract..."); + const box = await deploy("Box", { + from: deployer, + args: args, + log: true, + waitConfirmations: network.config.blockConfirmations || 1, + }); + log(`Box deployed at ${box.address}`); + + if ( + !developmentChains.includes(network.name) && + process.env.ETHERSCAN_API_KEY + ) { + await verify(box.address, args); + } + const timeLock = await ethers.getContract("TimeLock"); + const boxContract = await ethers.getContractAt("Box", box.address); + const transferOwnerTx = await boxContract.transferOwnership(timeLock.address); + await transferOwnerTx.wait(1); + log("Ownership transfered!"); +}; + +module.exports.tags = ["all", "box"]; diff --git a/deployments/localhost/.chainId b/deployments/localhost/.chainId new file mode 100644 index 0000000..027791f --- /dev/null +++ b/deployments/localhost/.chainId @@ -0,0 +1 @@ +31337 \ No newline at end of file diff --git a/deployments/localhost/Box.json b/deployments/localhost/Box.json new file mode 100644 index 0000000..7aab306 --- /dev/null +++ b/deployments/localhost/Box.json @@ -0,0 +1,185 @@ +{ + "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", + "abi": [ + { + "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": "newValue", + "type": "uint256" + } + ], + "name": "ValueChanged", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "retrieve", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], + "name": "store", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xe759be377cccb4d14a49409d0f87a72c7e4dbf9ed206ca3faa53c285962bfab5", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", + "transactionIndex": 0, + "gasUsed": "398269", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000010000000010000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7c8f5e00e408d18e9921c8b39d00034ec04075bd2f81eeca0384c6bb96b3ae6c", + "transactionHash": "0xe759be377cccb4d14a49409d0f87a72c7e4dbf9ed206ca3faa53c285962bfab5", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 8, + "transactionHash": "0xe759be377cccb4d14a49409d0f87a72c7e4dbf9ed206ca3faa53c285962bfab5", + "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x7c8f5e00e408d18e9921c8b39d00034ec04075bd2f81eeca0384c6bb96b3ae6c" + } + ], + "blockNumber": 8, + "cumulativeGasUsed": "398269", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "0a567a41a96dc2d81abbf99faae0732b", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"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\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"ValueChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"retrieve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"store\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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/Box.sol\":\"Box\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/Box.sol\":{\"content\":\"// contracts/Box.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract Box is Ownable {\\n uint256 private value;\\n\\n // Emitted when the stored value changes\\n event ValueChanged(uint256 newValue);\\n\\n // Stores a new value in the contract\\n function store(uint256 newValue) public onlyOwner {\\n value = newValue;\\n emit ValueChanged(newValue);\\n }\\n\\n // Reads the last stored value\\n function retrieve() public view returns (uint256) {\\n return value;\\n }\\n}\\n\",\"keccak256\":\"0x40a0d691a6280d5bb9416106951c86399591fd77ea274f1e02b6baa7d68a29af\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6105c38061010d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632e64cec11461005c5780636057361d1461007a578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b6100646100da565b6040516100719190610350565b60405180910390f35b610094600480360381019061008f919061039c565b6100e4565b005b61009e61012d565b005b6100a8610141565b6040516100b5919061040a565b60405180910390f35b6100d860048036038101906100d39190610451565b61016a565b005b6000600154905090565b6100ec6101ed565b806001819055507f93fe6d397c74fdf1402a8b72e47b68512f0510d7b98a4bc4cbdf6ac7108b3c59816040516101229190610350565b60405180910390a150565b6101356101ed565b61013f600061026b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101726101ed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d890610501565b60405180910390fd5b6101ea8161026b565b50565b6101f561032f565b73ffffffffffffffffffffffffffffffffffffffff16610213610141565b73ffffffffffffffffffffffffffffffffffffffff1614610269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609061056d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b600080fd5b61037981610337565b811461038457600080fd5b50565b60008135905061039681610370565b92915050565b6000602082840312156103b2576103b161036b565b5b60006103c084828501610387565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103f4826103c9565b9050919050565b610404816103e9565b82525050565b600060208201905061041f60008301846103fb565b92915050565b61042e816103e9565b811461043957600080fd5b50565b60008135905061044b81610425565b92915050565b6000602082840312156104675761046661036b565b5b60006104758482850161043c565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006104eb60268361047e565b91506104f68261048f565b604082019050919050565b6000602082019050818103600083015261051a816104de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061055760208361047e565b915061056282610521565b602082019050919050565b600060208201905081810360008301526105868161054a565b905091905056fea2646970667358221220934c0892f5e2c6e47639ed174f5093dcdc2264c605fc741014286f50f87e0e5064736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80632e64cec11461005c5780636057361d1461007a578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b6100646100da565b6040516100719190610350565b60405180910390f35b610094600480360381019061008f919061039c565b6100e4565b005b61009e61012d565b005b6100a8610141565b6040516100b5919061040a565b60405180910390f35b6100d860048036038101906100d39190610451565b61016a565b005b6000600154905090565b6100ec6101ed565b806001819055507f93fe6d397c74fdf1402a8b72e47b68512f0510d7b98a4bc4cbdf6ac7108b3c59816040516101229190610350565b60405180910390a150565b6101356101ed565b61013f600061026b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101726101ed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d890610501565b60405180910390fd5b6101ea8161026b565b50565b6101f561032f565b73ffffffffffffffffffffffffffffffffffffffff16610213610141565b73ffffffffffffffffffffffffffffffffffffffff1614610269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609061056d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b600080fd5b61037981610337565b811461038457600080fd5b50565b60008135905061039681610370565b92915050565b6000602082840312156103b2576103b161036b565b5b60006103c084828501610387565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103f4826103c9565b9050919050565b610404816103e9565b82525050565b600060208201905061041f60008301846103fb565b92915050565b61042e816103e9565b811461043957600080fd5b50565b60008135905061044b81610425565b92915050565b6000602082840312156104675761046661036b565b5b60006104758482850161043c565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006104eb60268361047e565b91506104f68261048f565b604082019050919050565b6000602082019050818103600083015261051a816104de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061055760208361047e565b915061056282610521565b602082019050919050565b600060208201905081810360008301526105868161054a565b905091905056fea2646970667358221220934c0892f5e2c6e47639ed174f5093dcdc2264c605fc741014286f50f87e0e5064736f6c63430008110033", + "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": 400, + "contract": "contracts/Box.sol:Box", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 10088, + "contract": "contracts/Box.sol:Box", + "label": "value", + "offset": 0, + "slot": "1", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json new file mode 100644 index 0000000..78a8eb2 --- /dev/null +++ b/deployments/localhost/GovernanceToken.json @@ -0,0 +1,922 @@ +{ + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fromDelegate", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "toDelegate", + "type": "address" + } + ], + "name": "DelegateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "delegate", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "previousBalance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newBalance", + "type": "uint256" + } + ], + "name": "DelegateVotesChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint32", + "name": "pos", + "type": "uint32" + } + ], + "name": "checkpoints", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "fromBlock", + "type": "uint32" + }, + { + "internalType": "uint224", + "name": "votes", + "type": "uint224" + } + ], + "internalType": "struct ERC20Votes.Checkpoint", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + } + ], + "name": "delegate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "delegatee", + "type": "address" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiry", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "delegateBySig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "delegates", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "getPastTotalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "getPastVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "numCheckpoints", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "s_maxSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xb8f0de4fcc87e4427b9fe6041bf9561796a975ac1aa775b9965647538cf07a40", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "transactionIndex": 0, + "gasUsed": "3321476", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x13ff0dee3da41f58f622201ceed8b866bcbf30486f2ac58f24c25a8c5717b70f", + "transactionHash": "0xb8f0de4fcc87e4427b9fe6041bf9561796a975ac1aa775b9965647538cf07a40", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 1, + "transactionHash": "0xb8f0de4fcc87e4427b9fe6041bf9561796a975ac1aa775b9965647538cf07a40", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", + "logIndex": 0, + "blockHash": "0x13ff0dee3da41f58f622201ceed8b866bcbf30486f2ac58f24c25a8c5717b70f" + } + ], + "blockNumber": 1, + "cumulativeGasUsed": "3321476", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "0a567a41a96dc2d81abbf99faae0732b", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes {\\n uint256 public s_maxSupply = 1000000000000000000000000;\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n _mint(msg.sender, s_maxSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount) internal override(ERC20Votes) {\\n super._mint(to, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0x08987915caee863c7aa445cf3ca3c8887e57683daca51d0934d8ce4855edb253\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x61014060405269d3c21bcecceda1000000600a553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000dca565b5080600490816200011d919062000dca565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a0818152505062000189818484620001ed60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505050620001e733600a546200022960201b60201c565b620012e8565b600083838346306040516020016200020a95949392919062000f22565b6040516020818303038152906040528051906020012090509392505050565b6200024082826200024460201b62000eaa1760201c565b5050565b6200025b82826200030260201b62000f371760201c565b6200026b6200047a60201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620002996200049e60201b60201c565b1115620002dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d49062001006565b60405180910390fd5b620002fc6009620004a860201b620010961783620004c060201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000374576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036b9062001078565b60405180910390fd5b62000388600083836200077160201b60201c565b80600260008282546200039c9190620010c9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620003f39190620010c9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200045a919062001104565b60405180910390a362000476600083836200077660201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b60008183620004b89190620010c9565b905092915050565b60008060008580549050905060008114620005355785600182620004e5919062001121565b81548110620004f957620004f86200115c565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000538565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200056483858760201c565b9150600081118015620005bd5750438660018362000583919062001121565b815481106200059757620005966200115c565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156200065e57620005d9826200079360201b620010ac1760201c565b86600183620005e9919062001121565b81548110620005fd57620005fc6200115c565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000768565b85604051806040016040528062000680436200080160201b620011171760201c565b63ffffffff168152602001620006a1856200079360201b620010ac1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b6200078e8383836200085760201b6200116a1760201c565b505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f09062001201565b60405180910390fd5b819050919050565b600063ffffffff80168211156200084f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008469062001299565b60405180910390fd5b819050919050565b6200086f838383620008a760201b620011951760201c565b620008a26200088484620008ac60201b60201c565b6200089584620008ac60201b60201c565b836200091560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620009525750600081115b1562000b3357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000a4557600080620009ec600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000b3860201b6200119a1785620004c060201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000a3a929190620012bb565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000b325760008062000ad9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620004a860201b620010961785620004c060201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000b27929190620012bb565b60405180910390a250505b5b505050565b6000818362000b48919062001121565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd257607f821691505b60208210810362000be85762000be762000b8a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c13565b62000c5e868362000c13565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cab62000ca562000c9f8462000c76565b62000c80565b62000c76565b9050919050565b6000819050919050565b62000cc78362000c8a565b62000cdf62000cd68262000cb2565b84845462000c20565b825550505050565b600090565b62000cf662000ce7565b62000d0381848462000cbc565b505050565b5b8181101562000d2b5762000d1f60008262000cec565b60018101905062000d09565b5050565b601f82111562000d7a5762000d448162000bee565b62000d4f8462000c03565b8101602085101562000d5f578190505b62000d7762000d6e8562000c03565b83018262000d08565b50505b505050565b600082821c905092915050565b600062000d9f6000198460080262000d7f565b1980831691505092915050565b600062000dba838362000d8c565b9150826002028217905092915050565b62000dd58262000b50565b67ffffffffffffffff81111562000df15762000df062000b5b565b5b62000dfd825462000bb9565b62000e0a82828562000d2f565b600060209050601f83116001811462000e42576000841562000e2d578287015190505b62000e39858262000dac565b86555062000ea9565b601f19841662000e528662000bee565b60005b8281101562000e7c5784890151825560018201915060208501945060208101905062000e55565b8683101562000e9c578489015162000e98601f89168262000d8c565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000ec68162000eb1565b82525050565b62000ed78162000c76565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000f0a8262000edd565b9050919050565b62000f1c8162000efd565b82525050565b600060a08201905062000f39600083018862000ebb565b62000f48602083018762000ebb565b62000f57604083018662000ebb565b62000f66606083018562000ecc565b62000f75608083018462000f11565b9695505050505050565b600082825260208201905092915050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b600062000fee60308362000f7f565b915062000ffb8262000f90565b604082019050919050565b60006020820190508181036000830152620010218162000fdf565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062001060601f8362000f7f565b91506200106d8262001028565b602082019050919050565b60006020820190508181036000830152620010938162001051565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010d68262000c76565b9150620010e38362000c76565b9250828201905080821115620010fe57620010fd6200109a565b5b92915050565b60006020820190506200111b600083018462000ecc565b92915050565b60006200112e8262000c76565b91506200113b8362000c76565b92508282039050818111156200115657620011556200109a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620011e960278362000f7f565b9150620011f6826200118b565b604082019050919050565b600060208201905081810360008301526200121c81620011da565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006200128160268362000f7f565b91506200128e8262001223565b604082019050919050565b60006020820190508181036000830152620012b48162001272565b9050919050565b6000604082019050620012d2600083018562000ecc565b620012e1602083018462000ecc565b9392505050565b60805160a05160c05160e051610100516101205161372362001338600039600061173a0152600061177c0152600061175b01526000611690015260006116e60152600061170f01526137236000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80636fcfff45116100c3578063a457c2d71161007c578063a457c2d714610402578063a9059cbb14610432578063c3cda52014610462578063d505accf1461047e578063dd62ed3e1461049a578063f1127ed8146104ca5761014d565b80636fcfff45146102f457806370a08231146103245780637ecebe00146103545780638e539e8c1461038457806395d89b41146103b45780639ab24eb0146103d25761014d565b80633644e515116101155780633644e5151461020c578063395093511461022a5780633a46b1a81461025a578063587cde1e1461028a5780635c19a95c146102ba5780635d641847146102d65761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a6104fa565b6040516101679190612376565b60405180910390f35b61018a60048036038101906101859190612431565b61058c565b604051610197919061248c565b60405180910390f35b6101a86105af565b6040516101b591906124b6565b60405180910390f35b6101d860048036038101906101d391906124d1565b6105b9565b6040516101e5919061248c565b60405180910390f35b6101f66105e8565b6040516102039190612540565b60405180910390f35b6102146105f1565b6040516102219190612574565b60405180910390f35b610244600480360381019061023f9190612431565b610600565b604051610251919061248c565b60405180910390f35b610274600480360381019061026f9190612431565b610637565b60405161028191906124b6565b60405180910390f35b6102a4600480360381019061029f919061258f565b6106cb565b6040516102b191906125cb565b60405180910390f35b6102d460048036038101906102cf919061258f565b610734565b005b6102de610748565b6040516102eb91906124b6565b60405180910390f35b61030e6004803603810190610309919061258f565b61074e565b60405161031b9190612605565b60405180910390f35b61033e6004803603810190610339919061258f565b6107a2565b60405161034b91906124b6565b60405180910390f35b61036e6004803603810190610369919061258f565b6107ea565b60405161037b91906124b6565b60405180910390f35b61039e60048036038101906103999190612620565b61083a565b6040516103ab91906124b6565b60405180910390f35b6103bc610890565b6040516103c99190612376565b60405180910390f35b6103ec60048036038101906103e7919061258f565b610922565b6040516103f991906124b6565b60405180910390f35b61041c60048036038101906104179190612431565b610a33565b604051610429919061248c565b60405180910390f35b61044c60048036038101906104479190612431565b610aaa565b604051610459919061248c565b60405180910390f35b61047c600480360381019061047791906126a5565b610acd565b005b61049860048036038101906104939190612732565b610bd1565b005b6104b460048036038101906104af91906127d4565b610d13565b6040516104c191906124b6565b60405180910390f35b6104e460048036038101906104df9190612840565b610d9a565b6040516104f191906128f5565b60405180910390f35b6060600380546105099061293f565b80601f01602080910402602001604051908101604052809291908181526020018280546105359061293f565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b6000806105976111b0565b90506105a48185856111b8565b600191505092915050565b6000600254905090565b6000806105c46111b0565b90506105d1858285611381565b6105dc85858561140d565b60019150509392505050565b60006012905090565b60006105fb61168c565b905090565b60008061060b6111b0565b905061062c81858561061d8589610d13565b610627919061299f565b6111b8565b600191505092915050565b600043821061067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067290612a1f565b60405180910390fd5b6106c3600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836117a6565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61074561073f6111b0565b826118b2565b50565b600a5481565b600061079b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611117565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610833600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206119cc565b9050919050565b600043821061087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612a1f565b60405180910390fd5b6108896009836117a6565b9050919050565b60606004805461089f9061293f565b80601f01602080910402602001604051908101604052809291908181526020018280546108cb9061293f565b80156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a0a57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001826109be9190612a3f565b815481106109cf576109ce612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a0d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610a3e6111b0565b90506000610a4c8286610d13565b905083811015610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890612b14565b60405180910390fd5b610a9e82868684036111b8565b60019250505092915050565b600080610ab56111b0565b9050610ac281858561140d565b600191505092915050565b83421115610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790612b80565b60405180910390fd5b6000610b72610b6a7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610b4f9493929190612ba0565b604051602081830303815290604052805190602001206119da565b8585856119f4565b9050610b7d81611a1f565b8614610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590612c31565b60405180910390fd5b610bc881886118b2565b50505050505050565b83421115610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90612c9d565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c438c611a1f565b89604051602001610c5996959493929190612cbd565b6040516020818303038152906040528051906020012090506000610c7c826119da565b90506000610c8c828787876119f4565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390612d6a565b60405180910390fd5b610d078a8a8a6111b8565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610da26122a8565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610df957610df8612a73565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610eb48282610f37565b610ebc611a7d565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610ee26105af565b1115610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90612dfc565b60405180910390fd5b610f31600961109683611aa1565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612e68565b60405180910390fd5b610fb260008383611d19565b8060026000828254610fc4919061299f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611019919061299f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161107e91906124b6565b60405180910390a361109260008383611d1e565b5050565b600081836110a4919061299f565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110690612efa565b60405180910390fd5b819050919050565b600063ffffffff8016821115611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990612f8c565b60405180910390fd5b819050919050565b611175838383611195565b611190611181846106cb565b61118a846106cb565b83611d2e565b505050565b505050565b600081836111a89190612a3f565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e9061301e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906130b0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161137491906124b6565b60405180910390a3505050565b600061138d8484610d13565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461140757818110156113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f09061311c565b60405180910390fd5b61140684848484036111b8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906131ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290613240565b60405180910390fd5b6114f6838383611d19565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561157c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611573906132d2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160f919061299f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167391906124b6565b60405180910390a3611686848484611d1e565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561170857507f000000000000000000000000000000000000000000000000000000000000000046145b15611735577f000000000000000000000000000000000000000000000000000000000000000090506117a3565b6117a07f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611f27565b90505b90565b6000808380549050905060005b818110156118255760006117c78284611f61565b9050848682815481106117dd576117dc612a73565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561180f5780925061181f565b60018161181c919061299f565b91505b506117b3565b60008214611887578460018361183b9190612a3f565b8154811061184c5761184b612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661188a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006118bd836106cb565b905060006118ca846107a2565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46119c6828483611d2e565b50505050565b600081600001549050919050565b60006119ed6119e761168c565b83611f87565b9050919050565b6000806000611a0587878787611fba565b91509150611a12816120c6565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611a6c816119cc565b9150611a7781612292565b50919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611b0f5785600182611ac39190612a3f565b81548110611ad457611ad3612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611b12565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611b4083858763ffffffff16565b9150600081118015611b9357504386600183611b5c9190612a3f565b81548110611b6d57611b6c612a73565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611c2057611ba1826110ac565b86600183611baf9190612a3f565b81548110611bc057611bbf612a73565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611d10565b856040518060400160405280611c3543611117565b63ffffffff168152602001611c49856110ac565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611d2983838361116a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d6a5750600081115b15611f2257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e4857600080611df1600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061119a85611aa1565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611e3d9291906132f2565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f2157600080611eca600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061109685611aa1565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611f169291906132f2565b60405180910390a250505b5b505050565b60008383834630604051602001611f4295949392919061331b565b6040516020818303038152906040528051906020012090509392505050565b60006002828418611f72919061339d565b828416611f7f919061299f565b905092915050565b60008282604051602001611f9c929190613446565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611ff55760006003915091506120bd565b601b8560ff161415801561200d5750601c8560ff1614155b1561201f5760006004915091506120bd565b600060018787878760405160008152602001604052604051612044949392919061347d565b6020604051602081039080840390855afa158015612066573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120b4576000600192509250506120bd565b80600092509250505b94509492505050565b600060048111156120da576120d96134c2565b5b8160048111156120ed576120ec6134c2565b5b031561228f5760016004811115612107576121066134c2565b5b81600481111561211a576121196134c2565b5b0361215a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121519061353d565b60405180910390fd5b6002600481111561216e5761216d6134c2565b5b816004811115612181576121806134c2565b5b036121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b8906135a9565b60405180910390fd5b600360048111156121d5576121d46134c2565b5b8160048111156121e8576121e76134c2565b5b03612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f9061363b565b60405180910390fd5b60048081111561223b5761223a6134c2565b5b81600481111561224e5761224d6134c2565b5b0361228e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612285906136cd565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612320578082015181840152602081019050612305565b60008484015250505050565b6000601f19601f8301169050919050565b6000612348826122e6565b61235281856122f1565b9350612362818560208601612302565b61236b8161232c565b840191505092915050565b60006020820190508181036000830152612390818461233d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c88261239d565b9050919050565b6123d8816123bd565b81146123e357600080fd5b50565b6000813590506123f5816123cf565b92915050565b6000819050919050565b61240e816123fb565b811461241957600080fd5b50565b60008135905061242b81612405565b92915050565b6000806040838503121561244857612447612398565b5b6000612456858286016123e6565b92505060206124678582860161241c565b9150509250929050565b60008115159050919050565b61248681612471565b82525050565b60006020820190506124a1600083018461247d565b92915050565b6124b0816123fb565b82525050565b60006020820190506124cb60008301846124a7565b92915050565b6000806000606084860312156124ea576124e9612398565b5b60006124f8868287016123e6565b9350506020612509868287016123e6565b925050604061251a8682870161241c565b9150509250925092565b600060ff82169050919050565b61253a81612524565b82525050565b60006020820190506125556000830184612531565b92915050565b6000819050919050565b61256e8161255b565b82525050565b60006020820190506125896000830184612565565b92915050565b6000602082840312156125a5576125a4612398565b5b60006125b3848285016123e6565b91505092915050565b6125c5816123bd565b82525050565b60006020820190506125e060008301846125bc565b92915050565b600063ffffffff82169050919050565b6125ff816125e6565b82525050565b600060208201905061261a60008301846125f6565b92915050565b60006020828403121561263657612635612398565b5b60006126448482850161241c565b91505092915050565b61265681612524565b811461266157600080fd5b50565b6000813590506126738161264d565b92915050565b6126828161255b565b811461268d57600080fd5b50565b60008135905061269f81612679565b92915050565b60008060008060008060c087890312156126c2576126c1612398565b5b60006126d089828a016123e6565b96505060206126e189828a0161241c565b95505060406126f289828a0161241c565b945050606061270389828a01612664565b935050608061271489828a01612690565b92505060a061272589828a01612690565b9150509295509295509295565b600080600080600080600060e0888a03121561275157612750612398565b5b600061275f8a828b016123e6565b97505060206127708a828b016123e6565b96505060406127818a828b0161241c565b95505060606127928a828b0161241c565b94505060806127a38a828b01612664565b93505060a06127b48a828b01612690565b92505060c06127c58a828b01612690565b91505092959891949750929550565b600080604083850312156127eb576127ea612398565b5b60006127f9858286016123e6565b925050602061280a858286016123e6565b9150509250929050565b61281d816125e6565b811461282857600080fd5b50565b60008135905061283a81612814565b92915050565b6000806040838503121561285757612856612398565b5b6000612865858286016123e6565b92505060206128768582860161282b565b9150509250929050565b612889816125e6565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6128c08161288f565b82525050565b6040820160008201516128dc6000850182612880565b5060208201516128ef60208501826128b7565b50505050565b600060408201905061290a60008301846128c6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061295757607f821691505b60208210810361296a57612969612910565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006129aa826123fb565b91506129b5836123fb565b92508282019050808211156129cd576129cc612970565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612a09601f836122f1565b9150612a14826129d3565b602082019050919050565b60006020820190508181036000830152612a38816129fc565b9050919050565b6000612a4a826123fb565b9150612a55836123fb565b9250828203905081811115612a6d57612a6c612970565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612afe6025836122f1565b9150612b0982612aa2565b604082019050919050565b60006020820190508181036000830152612b2d81612af1565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612b6a601d836122f1565b9150612b7582612b34565b602082019050919050565b60006020820190508181036000830152612b9981612b5d565b9050919050565b6000608082019050612bb56000830187612565565b612bc260208301866125bc565b612bcf60408301856124a7565b612bdc60608301846124a7565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612c1b6019836122f1565b9150612c2682612be5565b602082019050919050565b60006020820190508181036000830152612c4a81612c0e565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612c87601d836122f1565b9150612c9282612c51565b602082019050919050565b60006020820190508181036000830152612cb681612c7a565b9050919050565b600060c082019050612cd26000830189612565565b612cdf60208301886125bc565b612cec60408301876125bc565b612cf960608301866124a7565b612d0660808301856124a7565b612d1360a08301846124a7565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612d54601e836122f1565b9150612d5f82612d1e565b602082019050919050565b60006020820190508181036000830152612d8381612d47565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000612de66030836122f1565b9150612df182612d8a565b604082019050919050565b60006020820190508181036000830152612e1581612dd9565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612e52601f836122f1565b9150612e5d82612e1c565b602082019050919050565b60006020820190508181036000830152612e8181612e45565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000612ee46027836122f1565b9150612eef82612e88565b604082019050919050565b60006020820190508181036000830152612f1381612ed7565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000612f766026836122f1565b9150612f8182612f1a565b604082019050919050565b60006020820190508181036000830152612fa581612f69565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006130086024836122f1565b915061301382612fac565b604082019050919050565b6000602082019050818103600083015261303781612ffb565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061309a6022836122f1565b91506130a58261303e565b604082019050919050565b600060208201905081810360008301526130c98161308d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613106601d836122f1565b9150613111826130d0565b602082019050919050565b60006020820190508181036000830152613135816130f9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131986025836122f1565b91506131a38261313c565b604082019050919050565b600060208201905081810360008301526131c78161318b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061322a6023836122f1565b9150613235826131ce565b604082019050919050565b600060208201905081810360008301526132598161321d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006132bc6026836122f1565b91506132c782613260565b604082019050919050565b600060208201905081810360008301526132eb816132af565b9050919050565b600060408201905061330760008301856124a7565b61331460208301846124a7565b9392505050565b600060a0820190506133306000830188612565565b61333d6020830187612565565b61334a6040830186612565565b61335760608301856124a7565b61336460808301846125bc565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133a8826123fb565b91506133b3836123fb565b9250826133c3576133c261336e565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061340f6002836133ce565b915061341a826133d9565b600282019050919050565b6000819050919050565b61344061343b8261255b565b613425565b82525050565b600061345182613402565b915061345d828561342f565b60208201915061346d828461342f565b6020820191508190509392505050565b60006080820190506134926000830187612565565b61349f6020830186612531565b6134ac6040830185612565565b6134b96060830184612565565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006135276018836122f1565b9150613532826134f1565b602082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613593601f836122f1565b915061359e8261355d565b602082019050919050565b600060208201905081810360008301526135c281613586565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006136256022836122f1565b9150613630826135c9565b604082019050919050565b6000602082019050818103600083015261365481613618565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b76022836122f1565b91506136c28261365b565b604082019050919050565b600060208201905081810360008301526136e6816136aa565b905091905056fea2646970667358221220a4e67c94e67bdf69a40e485f7d3b1c2a087478f314230704056ca9b1d7c83f5f64736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80636fcfff45116100c3578063a457c2d71161007c578063a457c2d714610402578063a9059cbb14610432578063c3cda52014610462578063d505accf1461047e578063dd62ed3e1461049a578063f1127ed8146104ca5761014d565b80636fcfff45146102f457806370a08231146103245780637ecebe00146103545780638e539e8c1461038457806395d89b41146103b45780639ab24eb0146103d25761014d565b80633644e515116101155780633644e5151461020c578063395093511461022a5780633a46b1a81461025a578063587cde1e1461028a5780635c19a95c146102ba5780635d641847146102d65761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a6104fa565b6040516101679190612376565b60405180910390f35b61018a60048036038101906101859190612431565b61058c565b604051610197919061248c565b60405180910390f35b6101a86105af565b6040516101b591906124b6565b60405180910390f35b6101d860048036038101906101d391906124d1565b6105b9565b6040516101e5919061248c565b60405180910390f35b6101f66105e8565b6040516102039190612540565b60405180910390f35b6102146105f1565b6040516102219190612574565b60405180910390f35b610244600480360381019061023f9190612431565b610600565b604051610251919061248c565b60405180910390f35b610274600480360381019061026f9190612431565b610637565b60405161028191906124b6565b60405180910390f35b6102a4600480360381019061029f919061258f565b6106cb565b6040516102b191906125cb565b60405180910390f35b6102d460048036038101906102cf919061258f565b610734565b005b6102de610748565b6040516102eb91906124b6565b60405180910390f35b61030e6004803603810190610309919061258f565b61074e565b60405161031b9190612605565b60405180910390f35b61033e6004803603810190610339919061258f565b6107a2565b60405161034b91906124b6565b60405180910390f35b61036e6004803603810190610369919061258f565b6107ea565b60405161037b91906124b6565b60405180910390f35b61039e60048036038101906103999190612620565b61083a565b6040516103ab91906124b6565b60405180910390f35b6103bc610890565b6040516103c99190612376565b60405180910390f35b6103ec60048036038101906103e7919061258f565b610922565b6040516103f991906124b6565b60405180910390f35b61041c60048036038101906104179190612431565b610a33565b604051610429919061248c565b60405180910390f35b61044c60048036038101906104479190612431565b610aaa565b604051610459919061248c565b60405180910390f35b61047c600480360381019061047791906126a5565b610acd565b005b61049860048036038101906104939190612732565b610bd1565b005b6104b460048036038101906104af91906127d4565b610d13565b6040516104c191906124b6565b60405180910390f35b6104e460048036038101906104df9190612840565b610d9a565b6040516104f191906128f5565b60405180910390f35b6060600380546105099061293f565b80601f01602080910402602001604051908101604052809291908181526020018280546105359061293f565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b6000806105976111b0565b90506105a48185856111b8565b600191505092915050565b6000600254905090565b6000806105c46111b0565b90506105d1858285611381565b6105dc85858561140d565b60019150509392505050565b60006012905090565b60006105fb61168c565b905090565b60008061060b6111b0565b905061062c81858561061d8589610d13565b610627919061299f565b6111b8565b600191505092915050565b600043821061067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067290612a1f565b60405180910390fd5b6106c3600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836117a6565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61074561073f6111b0565b826118b2565b50565b600a5481565b600061079b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611117565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610833600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206119cc565b9050919050565b600043821061087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612a1f565b60405180910390fd5b6108896009836117a6565b9050919050565b60606004805461089f9061293f565b80601f01602080910402602001604051908101604052809291908181526020018280546108cb9061293f565b80156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a0a57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001826109be9190612a3f565b815481106109cf576109ce612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a0d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610a3e6111b0565b90506000610a4c8286610d13565b905083811015610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890612b14565b60405180910390fd5b610a9e82868684036111b8565b60019250505092915050565b600080610ab56111b0565b9050610ac281858561140d565b600191505092915050565b83421115610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790612b80565b60405180910390fd5b6000610b72610b6a7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610b4f9493929190612ba0565b604051602081830303815290604052805190602001206119da565b8585856119f4565b9050610b7d81611a1f565b8614610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590612c31565b60405180910390fd5b610bc881886118b2565b50505050505050565b83421115610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90612c9d565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c438c611a1f565b89604051602001610c5996959493929190612cbd565b6040516020818303038152906040528051906020012090506000610c7c826119da565b90506000610c8c828787876119f4565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390612d6a565b60405180910390fd5b610d078a8a8a6111b8565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610da26122a8565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610df957610df8612a73565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610eb48282610f37565b610ebc611a7d565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610ee26105af565b1115610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90612dfc565b60405180910390fd5b610f31600961109683611aa1565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612e68565b60405180910390fd5b610fb260008383611d19565b8060026000828254610fc4919061299f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611019919061299f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161107e91906124b6565b60405180910390a361109260008383611d1e565b5050565b600081836110a4919061299f565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110690612efa565b60405180910390fd5b819050919050565b600063ffffffff8016821115611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990612f8c565b60405180910390fd5b819050919050565b611175838383611195565b611190611181846106cb565b61118a846106cb565b83611d2e565b505050565b505050565b600081836111a89190612a3f565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e9061301e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906130b0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161137491906124b6565b60405180910390a3505050565b600061138d8484610d13565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461140757818110156113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f09061311c565b60405180910390fd5b61140684848484036111b8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906131ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290613240565b60405180910390fd5b6114f6838383611d19565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561157c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611573906132d2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160f919061299f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167391906124b6565b60405180910390a3611686848484611d1e565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561170857507f000000000000000000000000000000000000000000000000000000000000000046145b15611735577f000000000000000000000000000000000000000000000000000000000000000090506117a3565b6117a07f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611f27565b90505b90565b6000808380549050905060005b818110156118255760006117c78284611f61565b9050848682815481106117dd576117dc612a73565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561180f5780925061181f565b60018161181c919061299f565b91505b506117b3565b60008214611887578460018361183b9190612a3f565b8154811061184c5761184b612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661188a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006118bd836106cb565b905060006118ca846107a2565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46119c6828483611d2e565b50505050565b600081600001549050919050565b60006119ed6119e761168c565b83611f87565b9050919050565b6000806000611a0587878787611fba565b91509150611a12816120c6565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611a6c816119cc565b9150611a7781612292565b50919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611b0f5785600182611ac39190612a3f565b81548110611ad457611ad3612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611b12565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611b4083858763ffffffff16565b9150600081118015611b9357504386600183611b5c9190612a3f565b81548110611b6d57611b6c612a73565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611c2057611ba1826110ac565b86600183611baf9190612a3f565b81548110611bc057611bbf612a73565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611d10565b856040518060400160405280611c3543611117565b63ffffffff168152602001611c49856110ac565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611d2983838361116a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d6a5750600081115b15611f2257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e4857600080611df1600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061119a85611aa1565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611e3d9291906132f2565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f2157600080611eca600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061109685611aa1565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611f169291906132f2565b60405180910390a250505b5b505050565b60008383834630604051602001611f4295949392919061331b565b6040516020818303038152906040528051906020012090509392505050565b60006002828418611f72919061339d565b828416611f7f919061299f565b905092915050565b60008282604051602001611f9c929190613446565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611ff55760006003915091506120bd565b601b8560ff161415801561200d5750601c8560ff1614155b1561201f5760006004915091506120bd565b600060018787878760405160008152602001604052604051612044949392919061347d565b6020604051602081039080840390855afa158015612066573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120b4576000600192509250506120bd565b80600092509250505b94509492505050565b600060048111156120da576120d96134c2565b5b8160048111156120ed576120ec6134c2565b5b031561228f5760016004811115612107576121066134c2565b5b81600481111561211a576121196134c2565b5b0361215a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121519061353d565b60405180910390fd5b6002600481111561216e5761216d6134c2565b5b816004811115612181576121806134c2565b5b036121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b8906135a9565b60405180910390fd5b600360048111156121d5576121d46134c2565b5b8160048111156121e8576121e76134c2565b5b03612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f9061363b565b60405180910390fd5b60048081111561223b5761223a6134c2565b5b81600481111561224e5761224d6134c2565b5b0361228e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612285906136cd565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612320578082015181840152602081019050612305565b60008484015250505050565b6000601f19601f8301169050919050565b6000612348826122e6565b61235281856122f1565b9350612362818560208601612302565b61236b8161232c565b840191505092915050565b60006020820190508181036000830152612390818461233d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c88261239d565b9050919050565b6123d8816123bd565b81146123e357600080fd5b50565b6000813590506123f5816123cf565b92915050565b6000819050919050565b61240e816123fb565b811461241957600080fd5b50565b60008135905061242b81612405565b92915050565b6000806040838503121561244857612447612398565b5b6000612456858286016123e6565b92505060206124678582860161241c565b9150509250929050565b60008115159050919050565b61248681612471565b82525050565b60006020820190506124a1600083018461247d565b92915050565b6124b0816123fb565b82525050565b60006020820190506124cb60008301846124a7565b92915050565b6000806000606084860312156124ea576124e9612398565b5b60006124f8868287016123e6565b9350506020612509868287016123e6565b925050604061251a8682870161241c565b9150509250925092565b600060ff82169050919050565b61253a81612524565b82525050565b60006020820190506125556000830184612531565b92915050565b6000819050919050565b61256e8161255b565b82525050565b60006020820190506125896000830184612565565b92915050565b6000602082840312156125a5576125a4612398565b5b60006125b3848285016123e6565b91505092915050565b6125c5816123bd565b82525050565b60006020820190506125e060008301846125bc565b92915050565b600063ffffffff82169050919050565b6125ff816125e6565b82525050565b600060208201905061261a60008301846125f6565b92915050565b60006020828403121561263657612635612398565b5b60006126448482850161241c565b91505092915050565b61265681612524565b811461266157600080fd5b50565b6000813590506126738161264d565b92915050565b6126828161255b565b811461268d57600080fd5b50565b60008135905061269f81612679565b92915050565b60008060008060008060c087890312156126c2576126c1612398565b5b60006126d089828a016123e6565b96505060206126e189828a0161241c565b95505060406126f289828a0161241c565b945050606061270389828a01612664565b935050608061271489828a01612690565b92505060a061272589828a01612690565b9150509295509295509295565b600080600080600080600060e0888a03121561275157612750612398565b5b600061275f8a828b016123e6565b97505060206127708a828b016123e6565b96505060406127818a828b0161241c565b95505060606127928a828b0161241c565b94505060806127a38a828b01612664565b93505060a06127b48a828b01612690565b92505060c06127c58a828b01612690565b91505092959891949750929550565b600080604083850312156127eb576127ea612398565b5b60006127f9858286016123e6565b925050602061280a858286016123e6565b9150509250929050565b61281d816125e6565b811461282857600080fd5b50565b60008135905061283a81612814565b92915050565b6000806040838503121561285757612856612398565b5b6000612865858286016123e6565b92505060206128768582860161282b565b9150509250929050565b612889816125e6565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6128c08161288f565b82525050565b6040820160008201516128dc6000850182612880565b5060208201516128ef60208501826128b7565b50505050565b600060408201905061290a60008301846128c6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061295757607f821691505b60208210810361296a57612969612910565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006129aa826123fb565b91506129b5836123fb565b92508282019050808211156129cd576129cc612970565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612a09601f836122f1565b9150612a14826129d3565b602082019050919050565b60006020820190508181036000830152612a38816129fc565b9050919050565b6000612a4a826123fb565b9150612a55836123fb565b9250828203905081811115612a6d57612a6c612970565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612afe6025836122f1565b9150612b0982612aa2565b604082019050919050565b60006020820190508181036000830152612b2d81612af1565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612b6a601d836122f1565b9150612b7582612b34565b602082019050919050565b60006020820190508181036000830152612b9981612b5d565b9050919050565b6000608082019050612bb56000830187612565565b612bc260208301866125bc565b612bcf60408301856124a7565b612bdc60608301846124a7565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612c1b6019836122f1565b9150612c2682612be5565b602082019050919050565b60006020820190508181036000830152612c4a81612c0e565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612c87601d836122f1565b9150612c9282612c51565b602082019050919050565b60006020820190508181036000830152612cb681612c7a565b9050919050565b600060c082019050612cd26000830189612565565b612cdf60208301886125bc565b612cec60408301876125bc565b612cf960608301866124a7565b612d0660808301856124a7565b612d1360a08301846124a7565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612d54601e836122f1565b9150612d5f82612d1e565b602082019050919050565b60006020820190508181036000830152612d8381612d47565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000612de66030836122f1565b9150612df182612d8a565b604082019050919050565b60006020820190508181036000830152612e1581612dd9565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612e52601f836122f1565b9150612e5d82612e1c565b602082019050919050565b60006020820190508181036000830152612e8181612e45565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000612ee46027836122f1565b9150612eef82612e88565b604082019050919050565b60006020820190508181036000830152612f1381612ed7565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000612f766026836122f1565b9150612f8182612f1a565b604082019050919050565b60006020820190508181036000830152612fa581612f69565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006130086024836122f1565b915061301382612fac565b604082019050919050565b6000602082019050818103600083015261303781612ffb565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061309a6022836122f1565b91506130a58261303e565b604082019050919050565b600060208201905081810360008301526130c98161308d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613106601d836122f1565b9150613111826130d0565b602082019050919050565b60006020820190508181036000830152613135816130f9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131986025836122f1565b91506131a38261313c565b604082019050919050565b600060208201905081810360008301526131c78161318b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061322a6023836122f1565b9150613235826131ce565b604082019050919050565b600060208201905081810360008301526132598161321d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006132bc6026836122f1565b91506132c782613260565b604082019050919050565b600060208201905081810360008301526132eb816132af565b9050919050565b600060408201905061330760008301856124a7565b61331460208301846124a7565b9392505050565b600060a0820190506133306000830188612565565b61333d6020830187612565565b61334a6040830186612565565b61335760608301856124a7565b61336460808301846125bc565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133a8826123fb565b91506133b3836123fb565b9250826133c3576133c261336e565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061340f6002836133ce565b915061341a826133d9565b600282019050919050565b6000819050919050565b61344061343b8261255b565b613425565b82525050565b600061345182613402565b915061345d828561342f565b60208201915061346d828461342f565b6020820191508190509392505050565b60006080820190506134926000830187612565565b61349f6020830186612531565b6134ac6040830185612565565b6134b96060830184612565565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006135276018836122f1565b9150613532826134f1565b602082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613593601f836122f1565b915061359e8261355d565b602082019050919050565b600060208201905081810360008301526135c281613586565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006136256022836122f1565b9150613630826135c9565b604082019050919050565b6000602082019050818103600083015261365481613618565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b76022836122f1565b91506136c28261365b565b604082019050919050565b600060208201905081810360008301526136e6816136aa565b905091905056fea2646970667358221220a4e67c94e67bdf69a40e485f7d3b1c2a087478f314230704056ca9b1d7c83f5f64736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "DOMAIN_SEPARATOR()": { + "details": "See {IERC20Permit-DOMAIN_SEPARATOR}." + }, + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "checkpoints(address,uint32)": { + "details": "Get the `pos`-th checkpoint for `account`." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "delegate(address)": { + "details": "Delegate votes from the sender to `delegatee`." + }, + "delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)": { + "details": "Delegates votes from signer to `delegatee`" + }, + "delegates(address)": { + "details": "Get the address `account` is currently delegating to." + }, + "getPastTotalSupply(uint256)": { + "details": "Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined" + }, + "getPastVotes(address,uint256)": { + "details": "Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined" + }, + "getVotes(address)": { + "details": "Gets the current votes balance for `account`" + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "nonces(address)": { + "details": "See {IERC20Permit-nonces}." + }, + "numCheckpoints(address)": { + "details": "Get number of checkpoints for `account`." + }, + "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { + "details": "See {IERC20Permit-permit}." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 4206, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 4212, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 4214, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 4216, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 4218, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 5539, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_nonces", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(Counter)6299_storage)" + }, + { + "astId": 5547, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT", + "offset": 0, + "slot": "6", + "type": "t_bytes32" + }, + { + "astId": 4880, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_delegates", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_address)" + }, + { + "astId": 4886, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_checkpoints", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)4871_storage)dyn_storage)" + }, + { + "astId": 4890, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupplyCheckpoints", + "offset": 0, + "slot": "9", + "type": "t_array(t_struct(Checkpoint)4871_storage)dyn_storage" + }, + { + "astId": 10125, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "s_maxSupply", + "offset": 0, + "slot": "10", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)4871_storage)dyn_storage": { + "base": "t_struct(Checkpoint)4871_storage", + "encoding": "dynamic_array", + "label": "struct ERC20Votes.Checkpoint[]", + "numberOfBytes": "32" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_address)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_address,t_array(t_struct(Checkpoint)4871_storage)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct ERC20Votes.Checkpoint[])", + "numberOfBytes": "32", + "value": "t_array(t_struct(Checkpoint)4871_storage)dyn_storage" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_struct(Counter)6299_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct Counters.Counter)", + "numberOfBytes": "32", + "value": "t_struct(Counter)6299_storage" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Checkpoint)4871_storage": { + "encoding": "inplace", + "label": "struct ERC20Votes.Checkpoint", + "members": [ + { + "astId": 4868, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "fromBlock", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 4870, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "votes", + "offset": 4, + "slot": "0", + "type": "t_uint224" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Counter)6299_storage": { + "encoding": "inplace", + "label": "struct Counters.Counter", + "members": [ + { + "astId": 6298, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "_value", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_uint224": { + "encoding": "inplace", + "label": "uint224", + "numberOfBytes": "28" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + } + } + } +} \ No newline at end of file diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json new file mode 100644 index 0000000..107bc0f --- /dev/null +++ b/deployments/localhost/GovernerContract.json @@ -0,0 +1,1779 @@ +{ + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVotes", + "name": "_token", + "type": "address" + }, + { + "internalType": "contract TimelockController", + "name": "_timelock", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_votingDelay", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_votingPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_quorumPercentage", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "Empty", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "ProposalQueued", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldProposalThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "ProposalThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldQuorumNumerator", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "QuorumNumeratorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldTimelock", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newTimelock", + "type": "address" + } + ], + "name": "TimelockChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "VoteCast", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "VoteCastWithParams", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingDelay", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingDelay", + "type": "uint256" + } + ], + "name": "VotingDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingPeriod", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingPeriod", + "type": "uint256" + } + ], + "name": "VotingPeriodSet", + "type": "event" + }, + { + "inputs": [], + "name": "BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "COUNTING_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "EXTENDED_BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + } + ], + "name": "castVote", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "castVoteWithReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "castVoteWithReasonAndParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteWithReasonAndParamsBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "getVotesWithParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasVoted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "hashProposal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalDeadline", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalEta", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "abstainVotes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "queue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "quorum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumDenominator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "relay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "setProposalThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newVotingDelay", + "type": "uint256" + } + ], + "name": "setVotingDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newVotingPeriod", + "type": "uint256" + } + ], + "name": "setVotingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "state", + "outputs": [ + { + "internalType": "enum IGovernor.ProposalState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timelock", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IVotes", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "updateQuorumNumerator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TimelockController", + "name": "newTimelock", + "type": "address" + } + ], + "name": "updateTimelock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "transactionIndex": 0, + "gasUsed": "6149110", + "logsBloom": "0x00000000000000000100000000001000000000000000000000000000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000000000000000000000010000000000000000000000000080002000000000000000000000000000000000000000000001000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000001000000000080000800000000000000000000000000000000000000000000000000000000000000000002000", + "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d", + "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 4, + "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "topics": [ + "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 0, + "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" + }, + { + "transactionIndex": 0, + "blockNumber": 4, + "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "topics": [ + "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005", + "logIndex": 1, + "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" + }, + { + "transactionIndex": 0, + "blockNumber": 4, + "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "topics": [ + "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logIndex": 2, + "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" + }, + { + "transactionIndex": 0, + "blockNumber": 4, + "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "topics": [ + "0x0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004", + "logIndex": 3, + "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" + }, + { + "transactionIndex": 0, + "blockNumber": 4, + "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "topics": [ + "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0", + "logIndex": 4, + "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" + } + ], + "blockNumber": 4, + "cumulativeGasUsed": "6149110", + "status": 1, + "byzantium": true + }, + "args": [ + "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + 1, + 5, + 4 + ], + "numDeployments": 1, + "solcInputHash": "0a567a41a96dc2d81abbf99faae0732b", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl\\n{\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0xef3706b6dd13ea3c8a30e0f5009c02abb1ed331bd3986c3b6bddca8ab806a67c\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101606040523480156200001257600080fd5b5060405162007e1438038062007e14833981810160405281019062000038919062000af1565b838186858560006040518060400160405280601081526020017f476f7665726e6572436f6e7472616374000000000000000000000000000000008152508062000086620001e660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000ef8184846200022360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000149919062000de9565b50506200015c836200025f60201b60201c565b6200016d82620002a660201b60201c565b6200017e816200033360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001c8816200037a60201b60201c565b50620001da816200055960201b60201c565b505050505050620012f4565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200024095949392919062000f0d565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516200029492919062000f6a565b60405180910390a18060048190555050565b60008111620002ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e3906200101e565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600554826040516200032192919062000f6a565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516200036892919062000f6a565b60405180910390a18060068190555050565b6200038a620005fa60201b60201c565b811115620003cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c690620010dc565b60405180910390fd5b6000620003e16200060360201b60201c565b905060008114158015620003fd57506000600960000180549050145b15620004fd5760096000016040518060400160405280600063ffffffff16815260200162000436846200063b60201b62001e2e1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000518826009620006a960201b62001e991790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200054d92919062000f6a565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ae929190620010fe565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006064905090565b6000806009600001805490501462000632576200062c6009620008e760201b6200209b1760201c565b62000636565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620006a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069890620011a1565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620006cb86620008e760201b60201c565b90506000821180156200072757504386600001600184620006ed9190620011f2565b815481106200070157620007006200122d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620007cb5762000743856200063b60201b62001e2e1760201c565b86600001600184620007569190620011f2565b815481106200076a57620007696200122d565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620008d8565b856000016040518060400160405280620007f0436200098960201b620021361760201c565b63ffffffff16815260200162000811886200063b60201b62001e2e1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114620009605782600001600182620009109190620011f2565b815481106200092457620009236200122d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000963565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115620009d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009ce90620012d2565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a1182620009e4565b9050919050565b600062000a258262000a04565b9050919050565b62000a378162000a18565b811462000a4357600080fd5b50565b60008151905062000a578162000a2c565b92915050565b600062000a6a82620009e4565b9050919050565b600062000a7e8262000a5d565b9050919050565b62000a908162000a71565b811462000a9c57600080fd5b50565b60008151905062000ab08162000a85565b92915050565b6000819050919050565b62000acb8162000ab6565b811462000ad757600080fd5b50565b60008151905062000aeb8162000ac0565b92915050565b600080600080600060a0868803121562000b105762000b0f620009df565b5b600062000b208882890162000a46565b955050602062000b338882890162000a9f565b945050604062000b468882890162000ada565b935050606062000b598882890162000ada565b925050608062000b6c8882890162000ada565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bfb57607f821691505b60208210810362000c115762000c1062000bb3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c3c565b62000c87868362000c3c565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000cca62000cc462000cbe8462000ab6565b62000c9f565b62000ab6565b9050919050565b6000819050919050565b62000ce68362000ca9565b62000cfe62000cf58262000cd1565b84845462000c49565b825550505050565b600090565b62000d1562000d06565b62000d2281848462000cdb565b505050565b5b8181101562000d4a5762000d3e60008262000d0b565b60018101905062000d28565b5050565b601f82111562000d995762000d638162000c17565b62000d6e8462000c2c565b8101602085101562000d7e578190505b62000d9662000d8d8562000c2c565b83018262000d27565b50505b505050565b600082821c905092915050565b600062000dbe6000198460080262000d9e565b1980831691505092915050565b600062000dd9838362000dab565b9150826002028217905092915050565b62000df48262000b79565b67ffffffffffffffff81111562000e105762000e0f62000b84565b5b62000e1c825462000be2565b62000e2982828562000d4e565b600060209050601f83116001811462000e61576000841562000e4c578287015190505b62000e58858262000dcb565b86555062000ec8565b601f19841662000e718662000c17565b60005b8281101562000e9b5784890151825560018201915060208501945060208101905062000e74565b8683101562000ebb578489015162000eb7601f89168262000dab565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000ee58162000ed0565b82525050565b62000ef68162000ab6565b82525050565b62000f078162000a04565b82525050565b600060a08201905062000f24600083018862000eda565b62000f33602083018762000eda565b62000f42604083018662000eda565b62000f51606083018562000eeb565b62000f60608083018462000efc565b9695505050505050565b600060408201905062000f81600083018562000eeb565b62000f90602083018462000eeb565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200100660278362000f97565b9150620010138262000fa8565b604082019050919050565b60006020820190508181036000830152620010398162000ff7565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620010c460438362000f97565b9150620010d18262001040565b606082019050919050565b60006020820190508181036000830152620010f781620010b5565b9050919050565b600060408201905062001115600083018562000efc565b62001124602083018462000efc565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200118960278362000f97565b915062001196826200112b565b604082019050919050565b60006020820190508181036000830152620011bc816200117a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011ff8262000ab6565b91506200120c8362000ab6565b9250828203905081811115620012275762001226620011c3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620012ba60268362000f97565b9150620012c7826200125c565b604082019050919050565b60006020820190508181036000830152620012ed81620012ab565b9050919050565b60805160a05160c05160e051610100516101205161014051616ab76200135d60003960008181611e0c01528181612ee201526131560152600061341c0152600061345e0152600061343d01526000613372015260006133c8015260006133f10152616ab76000f3fe60806040526004361061024a5760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf146109cb578063eb9019d4146109f4578063ece40cc114610a31578063f23a6e6114610a5a578063f8ce560a14610a97578063fc0c546a14610ad457610290565b8063c28bc2fa146108e4578063c59057e41461090d578063d33219b41461094a578063dd4e2ba514610975578063deaaa7cc146109a057610290565b8063a890c910116100fd578063a890c910146107d9578063ab58fb8e14610802578063b58131b01461083f578063bc197c811461086a578063c01f9e37146108a757610290565b80637b3c71d3146106cc5780637d5e81e21461070957806397c3d334146107465780639a802a6d14610771578063a7713a70146107ae57610290565b80633932abb1116101c757806354fd4d501161018b57806354fd4d50146105c157806356781388146105ec5780635f398a141461062957806360c4247f1461066657806370b0f660146106a357610290565b80633932abb1146104a05780633bccf4fd146104cb5780633e4f49e6146105085780634385963214610545578063544ffc9c1461058257610290565b8063150b7a021161020e578063150b7a021461038e578063160cbed7146103cb5780632656227d146104085780632d63f693146104385780632fe3e2611461047557610290565b806301ffc9a71461029557806302a251a3146102d257806303420181146102fd57806306f3f9e61461033a57806306fdde031461036357610290565b36610290573073ffffffffffffffffffffffffffffffffffffffff1661026e610aff565b73ffffffffffffffffffffffffffffffffffffffff161461028e57600080fd5b005b600080fd5b3480156102a157600080fd5b506102bc60048036038101906102b79190614061565b610b0e565b6040516102c991906140a9565b60405180910390f35b3480156102de57600080fd5b506102e7610b20565b6040516102f491906140dd565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190614339565b610b2f565b60405161033191906140dd565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190614417565b610c14565b005b34801561036f57600080fd5b50610378610d0b565b60405161038591906144c3565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614543565b610d9d565b6040516103c291906145d5565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190614857565b610db1565b6040516103ff91906140dd565b60405180910390f35b610422600480360381019061041d9190614857565b61106b565b60405161042f91906140dd565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190614417565b6111b8565b60405161046c91906140dd565b60405180910390f35b34801561048157600080fd5b5061048a611226565b6040516104979190614921565b60405180910390f35b3480156104ac57600080fd5b506104b561124a565b6040516104c291906140dd565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed919061493c565b611259565b6040516104ff91906140dd565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a9190614417565b6112e3565b60405161053c9190614a2e565b60405180910390f35b34801561055157600080fd5b5061056c60048036038101906105679190614a49565b6112f5565b60405161057991906140a9565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190614417565b611360565b6040516105b893929190614a89565b60405180910390f35b3480156105cd57600080fd5b506105d6611398565b6040516105e391906144c3565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190614ac0565b6113d5565b60405161062091906140dd565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190614b00565b611406565b60405161065d91906140dd565b60405180910390f35b34801561067257600080fd5b5061068d60048036038101906106889190614417565b611470565b60405161069a91906140dd565b60405180910390f35b3480156106af57600080fd5b506106ca60048036038101906106c59190614417565b6115bc565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190614ba4565b6116b3565b60405161070091906140dd565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190614cb9565b61171b565b60405161073d91906140dd565b60405180910390f35b34801561075257600080fd5b5061075b611733565b60405161076891906140dd565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190614d90565b61173c565b6040516107a591906140dd565b60405180910390f35b3480156107ba57600080fd5b506107c3611752565b6040516107d091906140dd565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190614e4f565b61177b565b005b34801561080e57600080fd5b5061082960048036038101906108249190614417565b611872565b60405161083691906140dd565b60405180910390f35b34801561084b57600080fd5b5061085461193f565b60405161086191906140dd565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190614e7c565b61194e565b60405161089e91906145d5565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190614417565b611963565b6040516108db91906140dd565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190614fa1565b6119d1565b005b34801561091957600080fd5b50610934600480360381019061092f9190614857565b611b12565b60405161094191906140dd565b60405180910390f35b34801561095657600080fd5b5061095f611b4e565b60405161096c9190615024565b60405180910390f35b34801561098157600080fd5b5061098a611b78565b60405161099791906144c3565b60405180910390f35b3480156109ac57600080fd5b506109b5611bb5565b6040516109c29190614921565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed9190614417565b611bd9565b005b348015610a0057600080fd5b50610a1b6004803603810190610a16919061503f565b611cd0565b604051610a2891906140dd565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a539190614417565b611cec565b005b348015610a6657600080fd5b50610a816004803603810190610a7c919061507f565b611de3565b604051610a8e91906145d5565b60405180910390f35b348015610aa357600080fd5b50610abe6004803603810190610ab99190614417565b611df8565b604051610acb91906140dd565b60405180910390f35b348015610ae057600080fd5b50610ae9611e0a565b604051610af69190615175565b60405180910390f35b6000610b09612189565b905090565b6000610b19826121b3565b9050919050565b6000610b2a61222d565b905090565b600080610bb2610baa7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610b6b9291906151c0565b60405180910390208b80519060200120604051602001610b8f9594939291906151e8565b60405160208183030381529060405280519060200120612237565b868686612251565b9050610c058a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a61227c565b91505098975050505050505050565b610c1c610aff565b73ffffffffffffffffffffffffffffffffffffffff16610c3a612438565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16610caf610aff565b73ffffffffffffffffffffffffffffffffffffffff1614610cff576000610cd4612440565b604051610ce29291906151c0565b604051809103902090505b80610cf8600261244d565b03610ced57505b610d0881612529565b50565b606060008054610d1a906152d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d46906152d6565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b5050505050905090565b600063150b7a0260e01b9050949350505050565b600080610dc086868686611b12565b905060046007811115610dd657610dd56149b7565b5b610ddf826112e3565b6007811115610df157610df06149b7565b5b14610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890615379565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec491906153ae565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610f2a9594939291906156b6565b602060405180830381865afa158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190615733565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401610fe896959493929190615760565b600060405180830381600087803b15801561100257600080fd5b505af1158015611016573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426110489190615805565b604051611056929190615839565b60405180910390a18192505050949350505050565b60008061107a86868686611b12565b90506000611087826112e3565b90506004600781111561109d5761109c6149b7565b5b8160078111156110b0576110af6149b7565b5b14806110e05750600560078111156110cb576110ca6149b7565b5b8160078111156110de576110dd6149b7565b5b145b61111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690615379565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f8260405161117c91906140dd565b60405180910390a161119182888888886126dd565b61119e82888888886127c0565b6111ab82888888886127d4565b8192505050949350505050565b6000611215600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b600061125461283d565b905090565b6000806112ba6112b27f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f898960405160200161129793929190615862565b60405160208183030381529060405280519060200120612237565b868686612251565b90506112d787828860405180602001604052806000815250612847565b91505095945050505050565b60006112ee82612867565b9050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806113e0612438565b90506113fd84828560405180602001604052806000815250612847565b91505092915050565b600080611411612438565b905061146487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508761227c565b91505095945050505050565b600080600960000180549050905060008103611491576008549150506115b7565b600060096000016001836114a59190615899565b815481106114b6576114b56158cd565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161159e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506115b7565b6115b2846009612a3a90919063ffffffff16565b925050505b919050565b6115c4610aff565b73ffffffffffffffffffffffffffffffffffffffff166115e2612438565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611657610aff565b73ffffffffffffffffffffffffffffffffffffffff16146116a757600061167c612440565b60405161168a9291906151c0565b604051809103902090505b806116a0600261244d565b0361169557505b6116b081612b92565b50565b6000806116be612438565b905061171086828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612847565b915050949350505050565b600061172985858585612bd7565b9050949350505050565b60006064905090565b6000611749848484612ede565b90509392505050565b600080600960000180549050146117725761176d600961209b565b611776565b6008545b905090565b611783610aff565b73ffffffffffffffffffffffffffffffffffffffff166117a1612438565b73ffffffffffffffffffffffffffffffffffffffff16146117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611816610aff565b73ffffffffffffffffffffffffffffffffffffffff161461186657600061183b612440565b6040516118499291906151c0565b604051809103902090505b8061185f600261244d565b0361185457505b61186f81612f85565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b81526004016118e39190614921565b602060405180830381865afa158015611900573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192491906153ae565b9050600181146119345780611937565b60005b915050919050565b6000611949613024565b905090565b600063bc197c8160e01b905095945050505050565b60006119c0600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff169050919050565b6119d9610aff565b73ffffffffffffffffffffffffffffffffffffffff166119f7612438565b73ffffffffffffffffffffffffffffffffffffffff1614611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611a6c610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611abc576000611a91612440565b604051611a9f9291906151c0565b604051809103902090505b80611ab5600261244d565b03611aaa57505b611b0b8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508561302e565b5050505050565b600084848484604051602001611b2b94939291906158fc565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b611be1610aff565b73ffffffffffffffffffffffffffffffffffffffff16611bff612438565b73ffffffffffffffffffffffffffffffffffffffff1614611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611c74610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611cc4576000611c99612440565b604051611ca79291906151c0565b604051809103902090505b80611cbd600261244d565b03611cb257505b611ccd8161305d565b50565b6000611ce48383611cdf6130e5565b612ede565b905092915050565b611cf4610aff565b73ffffffffffffffffffffffffffffffffffffffff16611d12612438565b73ffffffffffffffffffffffffffffffffffffffff1614611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611d87610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611dd7576000611dac612440565b604051611dba9291906151c0565b604051809103902090505b80611dd0600261244d565b03611dc557505b611de0816130fc565b50565b600063f23a6e6160e01b905095945050505050565b6000611e0382613141565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e88906159c8565b60405180910390fd5b819050919050565b6000806000846000018054905090506000611eb38661209b565b9050600082118015611f0957504386600001600184611ed29190615899565b81548110611ee357611ee26158cd565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f9957611f1785611e2e565b86600001600184611f289190615899565b81548110611f3957611f386158cd565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061208c565b856000016040518060400160405280611fb143612136565b63ffffffff168152602001611fc588611e2e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811461210d57826000016001826120c19190615899565b815481106120d2576120d16158cd565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612110565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115612181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217890615a5a565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612226575061222582613209565b5b9050919050565b6000600554905090565b600061224a61224461336e565b83613488565b9050919050565b6000806000612262878787876134bb565b9150915061226f816135c7565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156122a8576122a76149b7565b5b6122b1886112e3565b60078111156122c3576122c26149b7565b5b14612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90615aec565b60405180910390fd5b600061236287612352846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff1686612ede565b90506123718888888488613793565b60008451036123d3578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516123c69493929190615b0c565b60405180910390a261242a565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612421959493929190615ba2565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b600061245882613997565b1561248f576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b612531611733565b811115612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a90615c9b565b60405180910390fd5b600061257d611752565b90506000811415801561259857506000600960000180549050145b1561268a5760096000016040518060400160405280600063ffffffff1681526020016125c384611e2e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b61269e826009611e9990919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516126d1929190615839565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff166126fc610aff565b73ffffffffffffffffffffffffffffffffffffffff16146127b95760005b84518110156127b7573073ffffffffffffffffffffffffffffffffffffffff1685828151811061274d5761274c6158cd565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036127a6576127a5838281518110612786576127856158cd565b5b60200260200101518051906020012060026139cc90919063ffffffff16565b5b806127b090615cbb565b905061271a565b505b5050505050565b6127cd8585858585613a48565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff166127f3610aff565b73ffffffffffffffffffffffffffffffffffffffff1614612828576128186002613997565b612827576128266002613ae6565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b600061285d858585856128586130e5565b61227c565b9050949350505050565b60008061287383613b67565b905060046007811115612889576128886149b7565b5b81600781111561289c5761289b6149b7565b5b146128aa5780915050612a35565b6000600b60008581526020019081526020016000205490506000801b81036128d6578192505050612a35565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016129319190614921565b602060405180830381865afa15801561294e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129729190615d2f565b1561298257600792505050612a35565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016129dd9190614921565b602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e9190615d2f565b15612a2e57600592505050612a35565b6002925050505b919050565b6000438210612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590615da8565b60405180910390fd5b60008360000180549050905060005b81811015612b02576000612aa18284613c7b565b905084866000018281548110612aba57612ab96158cd565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612aec57809250612afc565b600181612af99190615805565b91505b50612a8d565b60008214612b675784600001600183612b1b9190615899565b81548110612b2c57612b2b6158cd565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612b6a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051612bc5929190615839565b60405180910390a18060048190555050565b6000612be161193f565b612bfe612bec612438565b600143612bf99190615899565b611cd0565b1015612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690615e3a565b60405180910390fd5b6000612c548686868680519060200120611b12565b90508451865114612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9190615ecc565b60405180910390fd5b8351865114612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd590615ecc565b60405180910390fd5b6000865111612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1990615f38565b60405180910390fd5b6000600160008381526020019081526020016000209050612d82816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613ca1565b612dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db890615fca565b60405180910390fd5b6000612dd3612dce61124a565b613cbb565b612ddc43613cbb565b612de69190615ffe565b90506000612dfa612df5610b20565b613cbb565b82612e059190615ffe565b9050612e1d8284600001613d1290919063ffffffff16565b612e338184600101613d1290919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084612e5d612438565b8b8b8d5167ffffffffffffffff811115612e7a57612e796141d8565b5b604051908082528060200260200182016040528015612ead57816020015b6060815260200190600190039081612e985790505b508c88888e604051612ec799989796959493929190616177565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612f3b929190616227565b602060405180830381865afa158015612f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7c91906153ae565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612fd8929190616250565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b6060613054848484604051806060016040528060298152602001616a5960299139613d41565b90509392505050565b600081116130a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613097906162eb565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600554826040516130d3929190615839565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054616006548260405161312f929190615839565b60405180910390a18060068190555050565b600061314b611733565b61315483611470565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016131ad91906140dd565b602060405180830381865afa1580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee91906153ae565b6131f8919061630b565b613202919061637c565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806132ef57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061335757507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613367575061336682613e55565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156133ea57507f000000000000000000000000000000000000000000000000000000000000000046145b15613417577f00000000000000000000000000000000000000000000000000000000000000009050613485565b6134827f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613ebf565b90505b90565b6000828260405160200161349d929190616425565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134f65760006003915091506135be565b601b8560ff161415801561350e5750601c8560ff1614155b156135205760006004915091506135be565b600060018787878760405160008152602001604052604051613545949392919061645c565b6020604051602081039080840390855afa158015613567573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135b5576000600192509250506135be565b80600092509250505b94509492505050565b600060048111156135db576135da6149b7565b5b8160048111156135ee576135ed6149b7565b5b03156137905760016004811115613608576136076149b7565b5b81600481111561361b5761361a6149b7565b5b0361365b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613652906164ed565b60405180910390fd5b6002600481111561366f5761366e6149b7565b5b816004811115613682576136816149b7565b5b036136c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b990616559565b60405180910390fd5b600360048111156136d6576136d56149b7565b5b8160048111156136e9576136e86149b7565b5b03613729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613720906165eb565b60405180910390fd5b60048081111561373c5761373b6149b7565b5b81600481111561374f5761374e6149b7565b5b0361378f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137869061667d565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613839576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138309061670f565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060028111156138a7576138a66149b7565b5b60ff168460ff16036138d357828160000160008282546138c79190615805565b9250508190555061398f565b600160028111156138e7576138e66149b7565b5b60ff168460ff160361391357828160010160008282546139079190615805565b9250508190555061398e565b600280811115613926576139256149b7565b5b60ff168460ff160361395257828160020160008282546139469190615805565b9250508190555061398d565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613984906167a1565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401613aad9594939291906156b6565b6000604051808303818588803b158015613ac657600080fd5b505af1158015613ada573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615613ba0576007915050613c76565b8060020160019054906101000a900460ff1615613bc1576002915050613c76565b6000613bcc846111b8565b905060008103613c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c089061680d565b60405180910390fd5b438110613c2357600092505050613c76565b6000613c2e85611963565b9050438110613c435760019350505050613c76565b613c4c85613ef9565b8015613c5d5750613c5c85613f40565b5b15613c6e5760049350505050613c76565b600393505050505b919050565b60006002828418613c8c919061637c565b828416613c999190615805565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115613d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d019061689f565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015613d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7d90616931565b60405180910390fd5b613d8f85613f6b565b613dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc59061699d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613df791906169ee565b60006040518083038185875af1925050503d8060008114613e34576040519150601f19603f3d011682016040523d82523d6000602084013e613e39565b606091505b5091509150613e49828286613f8e565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001613eda959493929190616a05565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154613f259190615805565b613f36613f31856111b8565b611df8565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613f9e57829050613fee565b600083511115613fb15782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe591906144c3565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61403e81614009565b811461404957600080fd5b50565b60008135905061405b81614035565b92915050565b60006020828403121561407757614076613fff565b5b60006140858482850161404c565b91505092915050565b60008115159050919050565b6140a38161408e565b82525050565b60006020820190506140be600083018461409a565b92915050565b6000819050919050565b6140d7816140c4565b82525050565b60006020820190506140f260008301846140ce565b92915050565b614101816140c4565b811461410c57600080fd5b50565b60008135905061411e816140f8565b92915050565b600060ff82169050919050565b61413a81614124565b811461414557600080fd5b50565b60008135905061415781614131565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126141825761418161415d565b5b8235905067ffffffffffffffff81111561419f5761419e614162565b5b6020830191508360018202830111156141bb576141ba614167565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614210826141c7565b810181811067ffffffffffffffff8211171561422f5761422e6141d8565b5b80604052505050565b6000614242613ff5565b905061424e8282614207565b919050565b600067ffffffffffffffff82111561426e5761426d6141d8565b5b614277826141c7565b9050602081019050919050565b82818337600083830152505050565b60006142a66142a184614253565b614238565b9050828152602081018484840111156142c2576142c16141c2565b5b6142cd848285614284565b509392505050565b600082601f8301126142ea576142e961415d565b5b81356142fa848260208601614293565b91505092915050565b6000819050919050565b61431681614303565b811461432157600080fd5b50565b6000813590506143338161430d565b92915050565b60008060008060008060008060e0898b03121561435957614358613fff565b5b60006143678b828c0161410f565b98505060206143788b828c01614148565b975050604089013567ffffffffffffffff81111561439957614398614004565b5b6143a58b828c0161416c565b9650965050606089013567ffffffffffffffff8111156143c8576143c7614004565b5b6143d48b828c016142d5565b94505060806143e58b828c01614148565b93505060a06143f68b828c01614324565b92505060c06144078b828c01614324565b9150509295985092959890939650565b60006020828403121561442d5761442c613fff565b5b600061443b8482850161410f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561447e578082015181840152602081019050614463565b60008484015250505050565b600061449582614444565b61449f818561444f565b93506144af818560208601614460565b6144b8816141c7565b840191505092915050565b600060208201905081810360008301526144dd818461448a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614510826144e5565b9050919050565b61452081614505565b811461452b57600080fd5b50565b60008135905061453d81614517565b92915050565b6000806000806080858703121561455d5761455c613fff565b5b600061456b8782880161452e565b945050602061457c8782880161452e565b935050604061458d8782880161410f565b925050606085013567ffffffffffffffff8111156145ae576145ad614004565b5b6145ba878288016142d5565b91505092959194509250565b6145cf81614009565b82525050565b60006020820190506145ea60008301846145c6565b92915050565b600067ffffffffffffffff82111561460b5761460a6141d8565b5b602082029050602081019050919050565b600061462f61462a846145f0565b614238565b9050808382526020820190506020840283018581111561465257614651614167565b5b835b8181101561467b5780614667888261452e565b845260208401935050602081019050614654565b5050509392505050565b600082601f83011261469a5761469961415d565b5b81356146aa84826020860161461c565b91505092915050565b600067ffffffffffffffff8211156146ce576146cd6141d8565b5b602082029050602081019050919050565b60006146f26146ed846146b3565b614238565b9050808382526020820190506020840283018581111561471557614714614167565b5b835b8181101561473e578061472a888261410f565b845260208401935050602081019050614717565b5050509392505050565b600082601f83011261475d5761475c61415d565b5b813561476d8482602086016146df565b91505092915050565b600067ffffffffffffffff821115614791576147906141d8565b5b602082029050602081019050919050565b60006147b56147b084614776565b614238565b905080838252602082019050602084028301858111156147d8576147d7614167565b5b835b8181101561481f57803567ffffffffffffffff8111156147fd576147fc61415d565b5b80860161480a89826142d5565b855260208501945050506020810190506147da565b5050509392505050565b600082601f83011261483e5761483d61415d565b5b813561484e8482602086016147a2565b91505092915050565b6000806000806080858703121561487157614870613fff565b5b600085013567ffffffffffffffff81111561488f5761488e614004565b5b61489b87828801614685565b945050602085013567ffffffffffffffff8111156148bc576148bb614004565b5b6148c887828801614748565b935050604085013567ffffffffffffffff8111156148e9576148e8614004565b5b6148f587828801614829565b925050606061490687828801614324565b91505092959194509250565b61491b81614303565b82525050565b60006020820190506149366000830184614912565b92915050565b600080600080600060a0868803121561495857614957613fff565b5b60006149668882890161410f565b955050602061497788828901614148565b945050604061498888828901614148565b935050606061499988828901614324565b92505060806149aa88828901614324565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600881106149f7576149f66149b7565b5b50565b6000819050614a08826149e6565b919050565b6000614a18826149fa565b9050919050565b614a2881614a0d565b82525050565b6000602082019050614a436000830184614a1f565b92915050565b60008060408385031215614a6057614a5f613fff565b5b6000614a6e8582860161410f565b9250506020614a7f8582860161452e565b9150509250929050565b6000606082019050614a9e60008301866140ce565b614aab60208301856140ce565b614ab860408301846140ce565b949350505050565b60008060408385031215614ad757614ad6613fff565b5b6000614ae58582860161410f565b9250506020614af685828601614148565b9150509250929050565b600080600080600060808688031215614b1c57614b1b613fff565b5b6000614b2a8882890161410f565b9550506020614b3b88828901614148565b945050604086013567ffffffffffffffff811115614b5c57614b5b614004565b5b614b688882890161416c565b9350935050606086013567ffffffffffffffff811115614b8b57614b8a614004565b5b614b97888289016142d5565b9150509295509295909350565b60008060008060608587031215614bbe57614bbd613fff565b5b6000614bcc8782880161410f565b9450506020614bdd87828801614148565b935050604085013567ffffffffffffffff811115614bfe57614bfd614004565b5b614c0a8782880161416c565b925092505092959194509250565b600067ffffffffffffffff821115614c3357614c326141d8565b5b614c3c826141c7565b9050602081019050919050565b6000614c5c614c5784614c18565b614238565b905082815260208101848484011115614c7857614c776141c2565b5b614c83848285614284565b509392505050565b600082601f830112614ca057614c9f61415d565b5b8135614cb0848260208601614c49565b91505092915050565b60008060008060808587031215614cd357614cd2613fff565b5b600085013567ffffffffffffffff811115614cf157614cf0614004565b5b614cfd87828801614685565b945050602085013567ffffffffffffffff811115614d1e57614d1d614004565b5b614d2a87828801614748565b935050604085013567ffffffffffffffff811115614d4b57614d4a614004565b5b614d5787828801614829565b925050606085013567ffffffffffffffff811115614d7857614d77614004565b5b614d8487828801614c8b565b91505092959194509250565b600080600060608486031215614da957614da8613fff565b5b6000614db78682870161452e565b9350506020614dc88682870161410f565b925050604084013567ffffffffffffffff811115614de957614de8614004565b5b614df5868287016142d5565b9150509250925092565b6000614e0a826144e5565b9050919050565b6000614e1c82614dff565b9050919050565b614e2c81614e11565b8114614e3757600080fd5b50565b600081359050614e4981614e23565b92915050565b600060208284031215614e6557614e64613fff565b5b6000614e7384828501614e3a565b91505092915050565b600080600080600060a08688031215614e9857614e97613fff565b5b6000614ea68882890161452e565b9550506020614eb78882890161452e565b945050604086013567ffffffffffffffff811115614ed857614ed7614004565b5b614ee488828901614748565b935050606086013567ffffffffffffffff811115614f0557614f04614004565b5b614f1188828901614748565b925050608086013567ffffffffffffffff811115614f3257614f31614004565b5b614f3e888289016142d5565b9150509295509295909350565b60008083601f840112614f6157614f6061415d565b5b8235905067ffffffffffffffff811115614f7e57614f7d614162565b5b602083019150836001820283011115614f9a57614f99614167565b5b9250929050565b60008060008060608587031215614fbb57614fba613fff565b5b6000614fc98782880161452e565b9450506020614fda8782880161410f565b935050604085013567ffffffffffffffff811115614ffb57614ffa614004565b5b61500787828801614f4b565b925092505092959194509250565b61501e81614505565b82525050565b60006020820190506150396000830184615015565b92915050565b6000806040838503121561505657615055613fff565b5b60006150648582860161452e565b92505060206150758582860161410f565b9150509250929050565b600080600080600060a0868803121561509b5761509a613fff565b5b60006150a98882890161452e565b95505060206150ba8882890161452e565b94505060406150cb8882890161410f565b93505060606150dc8882890161410f565b925050608086013567ffffffffffffffff8111156150fd576150fc614004565b5b615109888289016142d5565b9150509295509295909350565b6000819050919050565b600061513b615136615131846144e5565b615116565b6144e5565b9050919050565b600061514d82615120565b9050919050565b600061515f82615142565b9050919050565b61516f81615154565b82525050565b600060208201905061518a6000830184615166565b92915050565b600081905092915050565b60006151a78385615190565b93506151b4838584614284565b82840190509392505050565b60006151cd82848661519b565b91508190509392505050565b6151e281614124565b82525050565b600060a0820190506151fd6000830188614912565b61520a60208301876140ce565b61521760408301866151d9565b6152246060830185614912565b6152316080830184614912565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b600061527160188361444f565b915061527c8261523b565b602082019050919050565b600060208201905081810360008301526152a081615264565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806152ee57607f821691505b602082108103615301576153006152a7565b5b50919050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b600061536360218361444f565b915061536e82615307565b604082019050919050565b6000602082019050818103600083015261539281615356565b9050919050565b6000815190506153a8816140f8565b92915050565b6000602082840312156153c4576153c3613fff565b5b60006153d284828501615399565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61541081614505565b82525050565b60006154228383615407565b60208301905092915050565b6000602082019050919050565b6000615446826153db565b61545081856153e6565b935061545b836153f7565b8060005b8381101561548c5781516154738882615416565b975061547e8361542e565b92505060018101905061545f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154ce816140c4565b82525050565b60006154e083836154c5565b60208301905092915050565b6000602082019050919050565b600061550482615499565b61550e81856154a4565b9350615519836154b5565b8060005b8381101561554a57815161553188826154d4565b975061553c836154ec565b92505060018101905061551d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006155aa82615583565b6155b4818561558e565b93506155c4818560208601614460565b6155cd816141c7565b840191505092915050565b60006155e4838361559f565b905092915050565b6000602082019050919050565b600061560482615557565b61560e8185615562565b93508360208202850161562085615573565b8060005b8581101561565c578484038952815161563d85826155d8565b9450615648836155ec565b925060208a01995050600181019050615624565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b60006156a061569b6156968461566e565b615678565b614303565b9050919050565b6156b081615685565b82525050565b600060a08201905081810360008301526156d0818861543b565b905081810360208301526156e481876154f9565b905081810360408301526156f881866155f9565b905061570760608301856156a7565b6157146080830184614912565b9695505050505050565b60008151905061572d8161430d565b92915050565b60006020828403121561574957615748613fff565b5b60006157578482850161571e565b91505092915050565b600060c082019050818103600083015261577a818961543b565b9050818103602083015261578e81886154f9565b905081810360408301526157a281876155f9565b90506157b160608301866156a7565b6157be6080830185614912565b6157cb60a08301846140ce565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615810826140c4565b915061581b836140c4565b9250828201905080821115615833576158326157d6565b5b92915050565b600060408201905061584e60008301856140ce565b61585b60208301846140ce565b9392505050565b60006060820190506158776000830186614912565b61588460208301856140ce565b61589160408301846151d9565b949350505050565b60006158a4826140c4565b91506158af836140c4565b92508282039050818111156158c7576158c66157d6565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152615916818761543b565b9050818103602083015261592a81866154f9565b9050818103604083015261593e81856155f9565b905061594d6060830184614912565b95945050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006159b260278361444f565b91506159bd82615956565b604082019050919050565b600060208201905081810360008301526159e1816159a5565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615a4460268361444f565b9150615a4f826159e8565b604082019050919050565b60006020820190508181036000830152615a7381615a37565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000615ad660238361444f565b9150615ae182615a7a565b604082019050919050565b60006020820190508181036000830152615b0581615ac9565b9050919050565b6000608082019050615b2160008301876140ce565b615b2e60208301866151d9565b615b3b60408301856140ce565b8181036060830152615b4d818461448a565b905095945050505050565b600082825260208201905092915050565b6000615b7482615583565b615b7e8185615b58565b9350615b8e818560208601614460565b615b97816141c7565b840191505092915050565b600060a082019050615bb760008301886140ce565b615bc460208301876151d9565b615bd160408301866140ce565b8181036060830152615be3818561448a565b90508181036080830152615bf78184615b69565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000615c8560438361444f565b9150615c9082615c03565b606082019050919050565b60006020820190508181036000830152615cb481615c78565b9050919050565b6000615cc6826140c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615cf857615cf76157d6565b5b600182019050919050565b615d0c8161408e565b8114615d1757600080fd5b50565b600081519050615d2981615d03565b92915050565b600060208284031215615d4557615d44613fff565b5b6000615d5384828501615d1a565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000615d9260208361444f565b9150615d9d82615d5c565b602082019050919050565b60006020820190508181036000830152615dc181615d85565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000615e2460318361444f565b9150615e2f82615dc8565b604082019050919050565b60006020820190508181036000830152615e5381615e17565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000615eb660218361444f565b9150615ec182615e5a565b604082019050919050565b60006020820190508181036000830152615ee581615ea9565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000615f2260188361444f565b9150615f2d82615eec565b602082019050919050565b60006020820190508181036000830152615f5181615f15565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615fb460218361444f565b9150615fbf82615f58565b604082019050919050565b60006020820190508181036000830152615fe381615fa7565b9050919050565b600067ffffffffffffffff82169050919050565b600061600982615fea565b915061601483615fea565b9250828201905067ffffffffffffffff811115616034576160336157d6565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061608282614444565b61608c8185616066565b935061609c818560208601614460565b6160a5816141c7565b840191505092915050565b60006160bc8383616077565b905092915050565b6000602082019050919050565b60006160dc8261603a565b6160e68185616045565b9350836020820285016160f885616056565b8060005b85811015616134578484038952815161611585826160b0565b9450616120836160c4565b925060208a019950506001810190506160fc565b50829750879550505050505092915050565b600061616161615c61615784615fea565b615116565b6140c4565b9050919050565b61617181616146565b82525050565b60006101208201905061618d600083018c6140ce565b61619a602083018b615015565b81810360408301526161ac818a61543b565b905081810360608301526161c081896154f9565b905081810360808301526161d481886160d1565b905081810360a08301526161e881876155f9565b90506161f760c0830186616168565b61620460e0830185616168565b818103610100830152616217818461448a565b90509a9950505050505050505050565b600060408201905061623c6000830185615015565b61624960208301846140ce565b9392505050565b60006040820190506162656000830185615015565b6162726020830184615015565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006162d560278361444f565b91506162e082616279565b604082019050919050565b60006020820190508181036000830152616304816162c8565b9050919050565b6000616316826140c4565b9150616321836140c4565b925082820261632f816140c4565b91508282048414831517616346576163456157d6565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000616387826140c4565b9150616392836140c4565b9250826163a2576163a161634d565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006163ee6002836163ad565b91506163f9826163b8565b600282019050919050565b6000819050919050565b61641f61641a82614303565b616404565b82525050565b6000616430826163e1565b915061643c828561640e565b60208201915061644c828461640e565b6020820191508190509392505050565b60006080820190506164716000830187614912565b61647e60208301866151d9565b61648b6040830185614912565b6164986060830184614912565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006164d760188361444f565b91506164e2826164a1565b602082019050919050565b60006020820190508181036000830152616506816164ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000616543601f8361444f565b915061654e8261650d565b602082019050919050565b6000602082019050818103600083015261657281616536565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006165d560228361444f565b91506165e082616579565b604082019050919050565b60006020820190508181036000830152616604816165c8565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061666760228361444f565b91506166728261660b565b604082019050919050565b600060208201905081810360008301526166968161665a565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006166f960278361444f565b91506167048261669d565b604082019050919050565b60006020820190508181036000830152616728816166ec565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061678b60358361444f565b91506167968261672f565b604082019050919050565b600060208201905081810360008301526167ba8161677e565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006167f7601d8361444f565b9150616802826167c1565b602082019050919050565b60006020820190508181036000830152616826816167ea565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061688960268361444f565b91506168948261682d565b604082019050919050565b600060208201905081810360008301526168b88161687c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061691b60268361444f565b9150616926826168bf565b604082019050919050565b6000602082019050818103600083015261694a8161690e565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000616987601d8361444f565b915061699282616951565b602082019050919050565b600060208201905081810360008301526169b68161697a565b9050919050565b60006169c882615583565b6169d28185615190565b93506169e2818560208601614460565b80840191505092915050565b60006169fa82846169bd565b915081905092915050565b600060a082019050616a1a6000830188614912565b616a276020830187614912565b616a346040830186614912565b616a4160608301856140ce565b616a4e6080830184615015565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122076f7f0920f4a36dd17b990acfe35ea72436b313a782b0a06d885eb17b7488e1164736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061024a5760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf146109cb578063eb9019d4146109f4578063ece40cc114610a31578063f23a6e6114610a5a578063f8ce560a14610a97578063fc0c546a14610ad457610290565b8063c28bc2fa146108e4578063c59057e41461090d578063d33219b41461094a578063dd4e2ba514610975578063deaaa7cc146109a057610290565b8063a890c910116100fd578063a890c910146107d9578063ab58fb8e14610802578063b58131b01461083f578063bc197c811461086a578063c01f9e37146108a757610290565b80637b3c71d3146106cc5780637d5e81e21461070957806397c3d334146107465780639a802a6d14610771578063a7713a70146107ae57610290565b80633932abb1116101c757806354fd4d501161018b57806354fd4d50146105c157806356781388146105ec5780635f398a141461062957806360c4247f1461066657806370b0f660146106a357610290565b80633932abb1146104a05780633bccf4fd146104cb5780633e4f49e6146105085780634385963214610545578063544ffc9c1461058257610290565b8063150b7a021161020e578063150b7a021461038e578063160cbed7146103cb5780632656227d146104085780632d63f693146104385780632fe3e2611461047557610290565b806301ffc9a71461029557806302a251a3146102d257806303420181146102fd57806306f3f9e61461033a57806306fdde031461036357610290565b36610290573073ffffffffffffffffffffffffffffffffffffffff1661026e610aff565b73ffffffffffffffffffffffffffffffffffffffff161461028e57600080fd5b005b600080fd5b3480156102a157600080fd5b506102bc60048036038101906102b79190614061565b610b0e565b6040516102c991906140a9565b60405180910390f35b3480156102de57600080fd5b506102e7610b20565b6040516102f491906140dd565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190614339565b610b2f565b60405161033191906140dd565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190614417565b610c14565b005b34801561036f57600080fd5b50610378610d0b565b60405161038591906144c3565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614543565b610d9d565b6040516103c291906145d5565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190614857565b610db1565b6040516103ff91906140dd565b60405180910390f35b610422600480360381019061041d9190614857565b61106b565b60405161042f91906140dd565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190614417565b6111b8565b60405161046c91906140dd565b60405180910390f35b34801561048157600080fd5b5061048a611226565b6040516104979190614921565b60405180910390f35b3480156104ac57600080fd5b506104b561124a565b6040516104c291906140dd565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed919061493c565b611259565b6040516104ff91906140dd565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a9190614417565b6112e3565b60405161053c9190614a2e565b60405180910390f35b34801561055157600080fd5b5061056c60048036038101906105679190614a49565b6112f5565b60405161057991906140a9565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190614417565b611360565b6040516105b893929190614a89565b60405180910390f35b3480156105cd57600080fd5b506105d6611398565b6040516105e391906144c3565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190614ac0565b6113d5565b60405161062091906140dd565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190614b00565b611406565b60405161065d91906140dd565b60405180910390f35b34801561067257600080fd5b5061068d60048036038101906106889190614417565b611470565b60405161069a91906140dd565b60405180910390f35b3480156106af57600080fd5b506106ca60048036038101906106c59190614417565b6115bc565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190614ba4565b6116b3565b60405161070091906140dd565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190614cb9565b61171b565b60405161073d91906140dd565b60405180910390f35b34801561075257600080fd5b5061075b611733565b60405161076891906140dd565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190614d90565b61173c565b6040516107a591906140dd565b60405180910390f35b3480156107ba57600080fd5b506107c3611752565b6040516107d091906140dd565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190614e4f565b61177b565b005b34801561080e57600080fd5b5061082960048036038101906108249190614417565b611872565b60405161083691906140dd565b60405180910390f35b34801561084b57600080fd5b5061085461193f565b60405161086191906140dd565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190614e7c565b61194e565b60405161089e91906145d5565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190614417565b611963565b6040516108db91906140dd565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190614fa1565b6119d1565b005b34801561091957600080fd5b50610934600480360381019061092f9190614857565b611b12565b60405161094191906140dd565b60405180910390f35b34801561095657600080fd5b5061095f611b4e565b60405161096c9190615024565b60405180910390f35b34801561098157600080fd5b5061098a611b78565b60405161099791906144c3565b60405180910390f35b3480156109ac57600080fd5b506109b5611bb5565b6040516109c29190614921565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed9190614417565b611bd9565b005b348015610a0057600080fd5b50610a1b6004803603810190610a16919061503f565b611cd0565b604051610a2891906140dd565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a539190614417565b611cec565b005b348015610a6657600080fd5b50610a816004803603810190610a7c919061507f565b611de3565b604051610a8e91906145d5565b60405180910390f35b348015610aa357600080fd5b50610abe6004803603810190610ab99190614417565b611df8565b604051610acb91906140dd565b60405180910390f35b348015610ae057600080fd5b50610ae9611e0a565b604051610af69190615175565b60405180910390f35b6000610b09612189565b905090565b6000610b19826121b3565b9050919050565b6000610b2a61222d565b905090565b600080610bb2610baa7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610b6b9291906151c0565b60405180910390208b80519060200120604051602001610b8f9594939291906151e8565b60405160208183030381529060405280519060200120612237565b868686612251565b9050610c058a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a61227c565b91505098975050505050505050565b610c1c610aff565b73ffffffffffffffffffffffffffffffffffffffff16610c3a612438565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16610caf610aff565b73ffffffffffffffffffffffffffffffffffffffff1614610cff576000610cd4612440565b604051610ce29291906151c0565b604051809103902090505b80610cf8600261244d565b03610ced57505b610d0881612529565b50565b606060008054610d1a906152d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d46906152d6565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b5050505050905090565b600063150b7a0260e01b9050949350505050565b600080610dc086868686611b12565b905060046007811115610dd657610dd56149b7565b5b610ddf826112e3565b6007811115610df157610df06149b7565b5b14610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890615379565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec491906153ae565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610f2a9594939291906156b6565b602060405180830381865afa158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190615733565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401610fe896959493929190615760565b600060405180830381600087803b15801561100257600080fd5b505af1158015611016573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426110489190615805565b604051611056929190615839565b60405180910390a18192505050949350505050565b60008061107a86868686611b12565b90506000611087826112e3565b90506004600781111561109d5761109c6149b7565b5b8160078111156110b0576110af6149b7565b5b14806110e05750600560078111156110cb576110ca6149b7565b5b8160078111156110de576110dd6149b7565b5b145b61111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690615379565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f8260405161117c91906140dd565b60405180910390a161119182888888886126dd565b61119e82888888886127c0565b6111ab82888888886127d4565b8192505050949350505050565b6000611215600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b600061125461283d565b905090565b6000806112ba6112b27f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f898960405160200161129793929190615862565b60405160208183030381529060405280519060200120612237565b868686612251565b90506112d787828860405180602001604052806000815250612847565b91505095945050505050565b60006112ee82612867565b9050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806113e0612438565b90506113fd84828560405180602001604052806000815250612847565b91505092915050565b600080611411612438565b905061146487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508761227c565b91505095945050505050565b600080600960000180549050905060008103611491576008549150506115b7565b600060096000016001836114a59190615899565b815481106114b6576114b56158cd565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161159e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506115b7565b6115b2846009612a3a90919063ffffffff16565b925050505b919050565b6115c4610aff565b73ffffffffffffffffffffffffffffffffffffffff166115e2612438565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611657610aff565b73ffffffffffffffffffffffffffffffffffffffff16146116a757600061167c612440565b60405161168a9291906151c0565b604051809103902090505b806116a0600261244d565b0361169557505b6116b081612b92565b50565b6000806116be612438565b905061171086828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612847565b915050949350505050565b600061172985858585612bd7565b9050949350505050565b60006064905090565b6000611749848484612ede565b90509392505050565b600080600960000180549050146117725761176d600961209b565b611776565b6008545b905090565b611783610aff565b73ffffffffffffffffffffffffffffffffffffffff166117a1612438565b73ffffffffffffffffffffffffffffffffffffffff16146117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611816610aff565b73ffffffffffffffffffffffffffffffffffffffff161461186657600061183b612440565b6040516118499291906151c0565b604051809103902090505b8061185f600261244d565b0361185457505b61186f81612f85565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b81526004016118e39190614921565b602060405180830381865afa158015611900573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192491906153ae565b9050600181146119345780611937565b60005b915050919050565b6000611949613024565b905090565b600063bc197c8160e01b905095945050505050565b60006119c0600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff169050919050565b6119d9610aff565b73ffffffffffffffffffffffffffffffffffffffff166119f7612438565b73ffffffffffffffffffffffffffffffffffffffff1614611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611a6c610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611abc576000611a91612440565b604051611a9f9291906151c0565b604051809103902090505b80611ab5600261244d565b03611aaa57505b611b0b8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508561302e565b5050505050565b600084848484604051602001611b2b94939291906158fc565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b611be1610aff565b73ffffffffffffffffffffffffffffffffffffffff16611bff612438565b73ffffffffffffffffffffffffffffffffffffffff1614611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611c74610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611cc4576000611c99612440565b604051611ca79291906151c0565b604051809103902090505b80611cbd600261244d565b03611cb257505b611ccd8161305d565b50565b6000611ce48383611cdf6130e5565b612ede565b905092915050565b611cf4610aff565b73ffffffffffffffffffffffffffffffffffffffff16611d12612438565b73ffffffffffffffffffffffffffffffffffffffff1614611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611d87610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611dd7576000611dac612440565b604051611dba9291906151c0565b604051809103902090505b80611dd0600261244d565b03611dc557505b611de0816130fc565b50565b600063f23a6e6160e01b905095945050505050565b6000611e0382613141565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e88906159c8565b60405180910390fd5b819050919050565b6000806000846000018054905090506000611eb38661209b565b9050600082118015611f0957504386600001600184611ed29190615899565b81548110611ee357611ee26158cd565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f9957611f1785611e2e565b86600001600184611f289190615899565b81548110611f3957611f386158cd565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061208c565b856000016040518060400160405280611fb143612136565b63ffffffff168152602001611fc588611e2e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811461210d57826000016001826120c19190615899565b815481106120d2576120d16158cd565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612110565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115612181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217890615a5a565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612226575061222582613209565b5b9050919050565b6000600554905090565b600061224a61224461336e565b83613488565b9050919050565b6000806000612262878787876134bb565b9150915061226f816135c7565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156122a8576122a76149b7565b5b6122b1886112e3565b60078111156122c3576122c26149b7565b5b14612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90615aec565b60405180910390fd5b600061236287612352846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff1686612ede565b90506123718888888488613793565b60008451036123d3578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516123c69493929190615b0c565b60405180910390a261242a565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612421959493929190615ba2565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b600061245882613997565b1561248f576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b612531611733565b811115612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a90615c9b565b60405180910390fd5b600061257d611752565b90506000811415801561259857506000600960000180549050145b1561268a5760096000016040518060400160405280600063ffffffff1681526020016125c384611e2e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b61269e826009611e9990919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516126d1929190615839565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff166126fc610aff565b73ffffffffffffffffffffffffffffffffffffffff16146127b95760005b84518110156127b7573073ffffffffffffffffffffffffffffffffffffffff1685828151811061274d5761274c6158cd565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036127a6576127a5838281518110612786576127856158cd565b5b60200260200101518051906020012060026139cc90919063ffffffff16565b5b806127b090615cbb565b905061271a565b505b5050505050565b6127cd8585858585613a48565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff166127f3610aff565b73ffffffffffffffffffffffffffffffffffffffff1614612828576128186002613997565b612827576128266002613ae6565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b600061285d858585856128586130e5565b61227c565b9050949350505050565b60008061287383613b67565b905060046007811115612889576128886149b7565b5b81600781111561289c5761289b6149b7565b5b146128aa5780915050612a35565b6000600b60008581526020019081526020016000205490506000801b81036128d6578192505050612a35565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016129319190614921565b602060405180830381865afa15801561294e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129729190615d2f565b1561298257600792505050612a35565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016129dd9190614921565b602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e9190615d2f565b15612a2e57600592505050612a35565b6002925050505b919050565b6000438210612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590615da8565b60405180910390fd5b60008360000180549050905060005b81811015612b02576000612aa18284613c7b565b905084866000018281548110612aba57612ab96158cd565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612aec57809250612afc565b600181612af99190615805565b91505b50612a8d565b60008214612b675784600001600183612b1b9190615899565b81548110612b2c57612b2b6158cd565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612b6a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051612bc5929190615839565b60405180910390a18060048190555050565b6000612be161193f565b612bfe612bec612438565b600143612bf99190615899565b611cd0565b1015612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690615e3a565b60405180910390fd5b6000612c548686868680519060200120611b12565b90508451865114612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9190615ecc565b60405180910390fd5b8351865114612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd590615ecc565b60405180910390fd5b6000865111612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1990615f38565b60405180910390fd5b6000600160008381526020019081526020016000209050612d82816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613ca1565b612dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db890615fca565b60405180910390fd5b6000612dd3612dce61124a565b613cbb565b612ddc43613cbb565b612de69190615ffe565b90506000612dfa612df5610b20565b613cbb565b82612e059190615ffe565b9050612e1d8284600001613d1290919063ffffffff16565b612e338184600101613d1290919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084612e5d612438565b8b8b8d5167ffffffffffffffff811115612e7a57612e796141d8565b5b604051908082528060200260200182016040528015612ead57816020015b6060815260200190600190039081612e985790505b508c88888e604051612ec799989796959493929190616177565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612f3b929190616227565b602060405180830381865afa158015612f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7c91906153ae565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612fd8929190616250565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b6060613054848484604051806060016040528060298152602001616a5960299139613d41565b90509392505050565b600081116130a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613097906162eb565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600554826040516130d3929190615839565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054616006548260405161312f929190615839565b60405180910390a18060068190555050565b600061314b611733565b61315483611470565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016131ad91906140dd565b602060405180830381865afa1580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee91906153ae565b6131f8919061630b565b613202919061637c565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806132ef57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061335757507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613367575061336682613e55565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156133ea57507f000000000000000000000000000000000000000000000000000000000000000046145b15613417577f00000000000000000000000000000000000000000000000000000000000000009050613485565b6134827f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613ebf565b90505b90565b6000828260405160200161349d929190616425565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134f65760006003915091506135be565b601b8560ff161415801561350e5750601c8560ff1614155b156135205760006004915091506135be565b600060018787878760405160008152602001604052604051613545949392919061645c565b6020604051602081039080840390855afa158015613567573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135b5576000600192509250506135be565b80600092509250505b94509492505050565b600060048111156135db576135da6149b7565b5b8160048111156135ee576135ed6149b7565b5b03156137905760016004811115613608576136076149b7565b5b81600481111561361b5761361a6149b7565b5b0361365b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613652906164ed565b60405180910390fd5b6002600481111561366f5761366e6149b7565b5b816004811115613682576136816149b7565b5b036136c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b990616559565b60405180910390fd5b600360048111156136d6576136d56149b7565b5b8160048111156136e9576136e86149b7565b5b03613729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613720906165eb565b60405180910390fd5b60048081111561373c5761373b6149b7565b5b81600481111561374f5761374e6149b7565b5b0361378f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137869061667d565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613839576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138309061670f565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060028111156138a7576138a66149b7565b5b60ff168460ff16036138d357828160000160008282546138c79190615805565b9250508190555061398f565b600160028111156138e7576138e66149b7565b5b60ff168460ff160361391357828160010160008282546139079190615805565b9250508190555061398e565b600280811115613926576139256149b7565b5b60ff168460ff160361395257828160020160008282546139469190615805565b9250508190555061398d565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613984906167a1565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401613aad9594939291906156b6565b6000604051808303818588803b158015613ac657600080fd5b505af1158015613ada573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615613ba0576007915050613c76565b8060020160019054906101000a900460ff1615613bc1576002915050613c76565b6000613bcc846111b8565b905060008103613c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c089061680d565b60405180910390fd5b438110613c2357600092505050613c76565b6000613c2e85611963565b9050438110613c435760019350505050613c76565b613c4c85613ef9565b8015613c5d5750613c5c85613f40565b5b15613c6e5760049350505050613c76565b600393505050505b919050565b60006002828418613c8c919061637c565b828416613c999190615805565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115613d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d019061689f565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015613d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7d90616931565b60405180910390fd5b613d8f85613f6b565b613dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc59061699d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613df791906169ee565b60006040518083038185875af1925050503d8060008114613e34576040519150601f19603f3d011682016040523d82523d6000602084013e613e39565b606091505b5091509150613e49828286613f8e565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001613eda959493929190616a05565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154613f259190615805565b613f36613f31856111b8565b611df8565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613f9e57829050613fee565b600083511115613fb15782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe591906144c3565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61403e81614009565b811461404957600080fd5b50565b60008135905061405b81614035565b92915050565b60006020828403121561407757614076613fff565b5b60006140858482850161404c565b91505092915050565b60008115159050919050565b6140a38161408e565b82525050565b60006020820190506140be600083018461409a565b92915050565b6000819050919050565b6140d7816140c4565b82525050565b60006020820190506140f260008301846140ce565b92915050565b614101816140c4565b811461410c57600080fd5b50565b60008135905061411e816140f8565b92915050565b600060ff82169050919050565b61413a81614124565b811461414557600080fd5b50565b60008135905061415781614131565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126141825761418161415d565b5b8235905067ffffffffffffffff81111561419f5761419e614162565b5b6020830191508360018202830111156141bb576141ba614167565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614210826141c7565b810181811067ffffffffffffffff8211171561422f5761422e6141d8565b5b80604052505050565b6000614242613ff5565b905061424e8282614207565b919050565b600067ffffffffffffffff82111561426e5761426d6141d8565b5b614277826141c7565b9050602081019050919050565b82818337600083830152505050565b60006142a66142a184614253565b614238565b9050828152602081018484840111156142c2576142c16141c2565b5b6142cd848285614284565b509392505050565b600082601f8301126142ea576142e961415d565b5b81356142fa848260208601614293565b91505092915050565b6000819050919050565b61431681614303565b811461432157600080fd5b50565b6000813590506143338161430d565b92915050565b60008060008060008060008060e0898b03121561435957614358613fff565b5b60006143678b828c0161410f565b98505060206143788b828c01614148565b975050604089013567ffffffffffffffff81111561439957614398614004565b5b6143a58b828c0161416c565b9650965050606089013567ffffffffffffffff8111156143c8576143c7614004565b5b6143d48b828c016142d5565b94505060806143e58b828c01614148565b93505060a06143f68b828c01614324565b92505060c06144078b828c01614324565b9150509295985092959890939650565b60006020828403121561442d5761442c613fff565b5b600061443b8482850161410f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561447e578082015181840152602081019050614463565b60008484015250505050565b600061449582614444565b61449f818561444f565b93506144af818560208601614460565b6144b8816141c7565b840191505092915050565b600060208201905081810360008301526144dd818461448a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614510826144e5565b9050919050565b61452081614505565b811461452b57600080fd5b50565b60008135905061453d81614517565b92915050565b6000806000806080858703121561455d5761455c613fff565b5b600061456b8782880161452e565b945050602061457c8782880161452e565b935050604061458d8782880161410f565b925050606085013567ffffffffffffffff8111156145ae576145ad614004565b5b6145ba878288016142d5565b91505092959194509250565b6145cf81614009565b82525050565b60006020820190506145ea60008301846145c6565b92915050565b600067ffffffffffffffff82111561460b5761460a6141d8565b5b602082029050602081019050919050565b600061462f61462a846145f0565b614238565b9050808382526020820190506020840283018581111561465257614651614167565b5b835b8181101561467b5780614667888261452e565b845260208401935050602081019050614654565b5050509392505050565b600082601f83011261469a5761469961415d565b5b81356146aa84826020860161461c565b91505092915050565b600067ffffffffffffffff8211156146ce576146cd6141d8565b5b602082029050602081019050919050565b60006146f26146ed846146b3565b614238565b9050808382526020820190506020840283018581111561471557614714614167565b5b835b8181101561473e578061472a888261410f565b845260208401935050602081019050614717565b5050509392505050565b600082601f83011261475d5761475c61415d565b5b813561476d8482602086016146df565b91505092915050565b600067ffffffffffffffff821115614791576147906141d8565b5b602082029050602081019050919050565b60006147b56147b084614776565b614238565b905080838252602082019050602084028301858111156147d8576147d7614167565b5b835b8181101561481f57803567ffffffffffffffff8111156147fd576147fc61415d565b5b80860161480a89826142d5565b855260208501945050506020810190506147da565b5050509392505050565b600082601f83011261483e5761483d61415d565b5b813561484e8482602086016147a2565b91505092915050565b6000806000806080858703121561487157614870613fff565b5b600085013567ffffffffffffffff81111561488f5761488e614004565b5b61489b87828801614685565b945050602085013567ffffffffffffffff8111156148bc576148bb614004565b5b6148c887828801614748565b935050604085013567ffffffffffffffff8111156148e9576148e8614004565b5b6148f587828801614829565b925050606061490687828801614324565b91505092959194509250565b61491b81614303565b82525050565b60006020820190506149366000830184614912565b92915050565b600080600080600060a0868803121561495857614957613fff565b5b60006149668882890161410f565b955050602061497788828901614148565b945050604061498888828901614148565b935050606061499988828901614324565b92505060806149aa88828901614324565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600881106149f7576149f66149b7565b5b50565b6000819050614a08826149e6565b919050565b6000614a18826149fa565b9050919050565b614a2881614a0d565b82525050565b6000602082019050614a436000830184614a1f565b92915050565b60008060408385031215614a6057614a5f613fff565b5b6000614a6e8582860161410f565b9250506020614a7f8582860161452e565b9150509250929050565b6000606082019050614a9e60008301866140ce565b614aab60208301856140ce565b614ab860408301846140ce565b949350505050565b60008060408385031215614ad757614ad6613fff565b5b6000614ae58582860161410f565b9250506020614af685828601614148565b9150509250929050565b600080600080600060808688031215614b1c57614b1b613fff565b5b6000614b2a8882890161410f565b9550506020614b3b88828901614148565b945050604086013567ffffffffffffffff811115614b5c57614b5b614004565b5b614b688882890161416c565b9350935050606086013567ffffffffffffffff811115614b8b57614b8a614004565b5b614b97888289016142d5565b9150509295509295909350565b60008060008060608587031215614bbe57614bbd613fff565b5b6000614bcc8782880161410f565b9450506020614bdd87828801614148565b935050604085013567ffffffffffffffff811115614bfe57614bfd614004565b5b614c0a8782880161416c565b925092505092959194509250565b600067ffffffffffffffff821115614c3357614c326141d8565b5b614c3c826141c7565b9050602081019050919050565b6000614c5c614c5784614c18565b614238565b905082815260208101848484011115614c7857614c776141c2565b5b614c83848285614284565b509392505050565b600082601f830112614ca057614c9f61415d565b5b8135614cb0848260208601614c49565b91505092915050565b60008060008060808587031215614cd357614cd2613fff565b5b600085013567ffffffffffffffff811115614cf157614cf0614004565b5b614cfd87828801614685565b945050602085013567ffffffffffffffff811115614d1e57614d1d614004565b5b614d2a87828801614748565b935050604085013567ffffffffffffffff811115614d4b57614d4a614004565b5b614d5787828801614829565b925050606085013567ffffffffffffffff811115614d7857614d77614004565b5b614d8487828801614c8b565b91505092959194509250565b600080600060608486031215614da957614da8613fff565b5b6000614db78682870161452e565b9350506020614dc88682870161410f565b925050604084013567ffffffffffffffff811115614de957614de8614004565b5b614df5868287016142d5565b9150509250925092565b6000614e0a826144e5565b9050919050565b6000614e1c82614dff565b9050919050565b614e2c81614e11565b8114614e3757600080fd5b50565b600081359050614e4981614e23565b92915050565b600060208284031215614e6557614e64613fff565b5b6000614e7384828501614e3a565b91505092915050565b600080600080600060a08688031215614e9857614e97613fff565b5b6000614ea68882890161452e565b9550506020614eb78882890161452e565b945050604086013567ffffffffffffffff811115614ed857614ed7614004565b5b614ee488828901614748565b935050606086013567ffffffffffffffff811115614f0557614f04614004565b5b614f1188828901614748565b925050608086013567ffffffffffffffff811115614f3257614f31614004565b5b614f3e888289016142d5565b9150509295509295909350565b60008083601f840112614f6157614f6061415d565b5b8235905067ffffffffffffffff811115614f7e57614f7d614162565b5b602083019150836001820283011115614f9a57614f99614167565b5b9250929050565b60008060008060608587031215614fbb57614fba613fff565b5b6000614fc98782880161452e565b9450506020614fda8782880161410f565b935050604085013567ffffffffffffffff811115614ffb57614ffa614004565b5b61500787828801614f4b565b925092505092959194509250565b61501e81614505565b82525050565b60006020820190506150396000830184615015565b92915050565b6000806040838503121561505657615055613fff565b5b60006150648582860161452e565b92505060206150758582860161410f565b9150509250929050565b600080600080600060a0868803121561509b5761509a613fff565b5b60006150a98882890161452e565b95505060206150ba8882890161452e565b94505060406150cb8882890161410f565b93505060606150dc8882890161410f565b925050608086013567ffffffffffffffff8111156150fd576150fc614004565b5b615109888289016142d5565b9150509295509295909350565b6000819050919050565b600061513b615136615131846144e5565b615116565b6144e5565b9050919050565b600061514d82615120565b9050919050565b600061515f82615142565b9050919050565b61516f81615154565b82525050565b600060208201905061518a6000830184615166565b92915050565b600081905092915050565b60006151a78385615190565b93506151b4838584614284565b82840190509392505050565b60006151cd82848661519b565b91508190509392505050565b6151e281614124565b82525050565b600060a0820190506151fd6000830188614912565b61520a60208301876140ce565b61521760408301866151d9565b6152246060830185614912565b6152316080830184614912565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b600061527160188361444f565b915061527c8261523b565b602082019050919050565b600060208201905081810360008301526152a081615264565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806152ee57607f821691505b602082108103615301576153006152a7565b5b50919050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b600061536360218361444f565b915061536e82615307565b604082019050919050565b6000602082019050818103600083015261539281615356565b9050919050565b6000815190506153a8816140f8565b92915050565b6000602082840312156153c4576153c3613fff565b5b60006153d284828501615399565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61541081614505565b82525050565b60006154228383615407565b60208301905092915050565b6000602082019050919050565b6000615446826153db565b61545081856153e6565b935061545b836153f7565b8060005b8381101561548c5781516154738882615416565b975061547e8361542e565b92505060018101905061545f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154ce816140c4565b82525050565b60006154e083836154c5565b60208301905092915050565b6000602082019050919050565b600061550482615499565b61550e81856154a4565b9350615519836154b5565b8060005b8381101561554a57815161553188826154d4565b975061553c836154ec565b92505060018101905061551d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006155aa82615583565b6155b4818561558e565b93506155c4818560208601614460565b6155cd816141c7565b840191505092915050565b60006155e4838361559f565b905092915050565b6000602082019050919050565b600061560482615557565b61560e8185615562565b93508360208202850161562085615573565b8060005b8581101561565c578484038952815161563d85826155d8565b9450615648836155ec565b925060208a01995050600181019050615624565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b60006156a061569b6156968461566e565b615678565b614303565b9050919050565b6156b081615685565b82525050565b600060a08201905081810360008301526156d0818861543b565b905081810360208301526156e481876154f9565b905081810360408301526156f881866155f9565b905061570760608301856156a7565b6157146080830184614912565b9695505050505050565b60008151905061572d8161430d565b92915050565b60006020828403121561574957615748613fff565b5b60006157578482850161571e565b91505092915050565b600060c082019050818103600083015261577a818961543b565b9050818103602083015261578e81886154f9565b905081810360408301526157a281876155f9565b90506157b160608301866156a7565b6157be6080830185614912565b6157cb60a08301846140ce565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615810826140c4565b915061581b836140c4565b9250828201905080821115615833576158326157d6565b5b92915050565b600060408201905061584e60008301856140ce565b61585b60208301846140ce565b9392505050565b60006060820190506158776000830186614912565b61588460208301856140ce565b61589160408301846151d9565b949350505050565b60006158a4826140c4565b91506158af836140c4565b92508282039050818111156158c7576158c66157d6565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152615916818761543b565b9050818103602083015261592a81866154f9565b9050818103604083015261593e81856155f9565b905061594d6060830184614912565b95945050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006159b260278361444f565b91506159bd82615956565b604082019050919050565b600060208201905081810360008301526159e1816159a5565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615a4460268361444f565b9150615a4f826159e8565b604082019050919050565b60006020820190508181036000830152615a7381615a37565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000615ad660238361444f565b9150615ae182615a7a565b604082019050919050565b60006020820190508181036000830152615b0581615ac9565b9050919050565b6000608082019050615b2160008301876140ce565b615b2e60208301866151d9565b615b3b60408301856140ce565b8181036060830152615b4d818461448a565b905095945050505050565b600082825260208201905092915050565b6000615b7482615583565b615b7e8185615b58565b9350615b8e818560208601614460565b615b97816141c7565b840191505092915050565b600060a082019050615bb760008301886140ce565b615bc460208301876151d9565b615bd160408301866140ce565b8181036060830152615be3818561448a565b90508181036080830152615bf78184615b69565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000615c8560438361444f565b9150615c9082615c03565b606082019050919050565b60006020820190508181036000830152615cb481615c78565b9050919050565b6000615cc6826140c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615cf857615cf76157d6565b5b600182019050919050565b615d0c8161408e565b8114615d1757600080fd5b50565b600081519050615d2981615d03565b92915050565b600060208284031215615d4557615d44613fff565b5b6000615d5384828501615d1a565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000615d9260208361444f565b9150615d9d82615d5c565b602082019050919050565b60006020820190508181036000830152615dc181615d85565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000615e2460318361444f565b9150615e2f82615dc8565b604082019050919050565b60006020820190508181036000830152615e5381615e17565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000615eb660218361444f565b9150615ec182615e5a565b604082019050919050565b60006020820190508181036000830152615ee581615ea9565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000615f2260188361444f565b9150615f2d82615eec565b602082019050919050565b60006020820190508181036000830152615f5181615f15565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615fb460218361444f565b9150615fbf82615f58565b604082019050919050565b60006020820190508181036000830152615fe381615fa7565b9050919050565b600067ffffffffffffffff82169050919050565b600061600982615fea565b915061601483615fea565b9250828201905067ffffffffffffffff811115616034576160336157d6565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061608282614444565b61608c8185616066565b935061609c818560208601614460565b6160a5816141c7565b840191505092915050565b60006160bc8383616077565b905092915050565b6000602082019050919050565b60006160dc8261603a565b6160e68185616045565b9350836020820285016160f885616056565b8060005b85811015616134578484038952815161611585826160b0565b9450616120836160c4565b925060208a019950506001810190506160fc565b50829750879550505050505092915050565b600061616161615c61615784615fea565b615116565b6140c4565b9050919050565b61617181616146565b82525050565b60006101208201905061618d600083018c6140ce565b61619a602083018b615015565b81810360408301526161ac818a61543b565b905081810360608301526161c081896154f9565b905081810360808301526161d481886160d1565b905081810360a08301526161e881876155f9565b90506161f760c0830186616168565b61620460e0830185616168565b818103610100830152616217818461448a565b90509a9950505050505050505050565b600060408201905061623c6000830185615015565b61624960208301846140ce565b9392505050565b60006040820190506162656000830185615015565b6162726020830184615015565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006162d560278361444f565b91506162e082616279565b604082019050919050565b60006020820190508181036000830152616304816162c8565b9050919050565b6000616316826140c4565b9150616321836140c4565b925082820261632f816140c4565b91508282048414831517616346576163456157d6565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000616387826140c4565b9150616392836140c4565b9250826163a2576163a161634d565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006163ee6002836163ad565b91506163f9826163b8565b600282019050919050565b6000819050919050565b61641f61641a82614303565b616404565b82525050565b6000616430826163e1565b915061643c828561640e565b60208201915061644c828461640e565b6020820191508190509392505050565b60006080820190506164716000830187614912565b61647e60208301866151d9565b61648b6040830185614912565b6164986060830184614912565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006164d760188361444f565b91506164e2826164a1565b602082019050919050565b60006020820190508181036000830152616506816164ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000616543601f8361444f565b915061654e8261650d565b602082019050919050565b6000602082019050818103600083015261657281616536565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006165d560228361444f565b91506165e082616579565b604082019050919050565b60006020820190508181036000830152616604816165c8565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061666760228361444f565b91506166728261660b565b604082019050919050565b600060208201905081810360008301526166968161665a565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006166f960278361444f565b91506167048261669d565b604082019050919050565b60006020820190508181036000830152616728816166ec565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061678b60358361444f565b91506167968261672f565b604082019050919050565b600060208201905081810360008301526167ba8161677e565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006167f7601d8361444f565b9150616802826167c1565b602082019050919050565b60006020820190508181036000830152616826816167ea565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061688960268361444f565b91506168948261682d565b604082019050919050565b600060208201905081810360008301526168b88161687c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061691b60268361444f565b9150616926826168bf565b604082019050919050565b6000602082019050818103600083015261694a8161690e565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000616987601d8361444f565b915061699282616951565b602082019050919050565b600060208201905081810360008301526169b68161697a565b9050919050565b60006169c882615583565b6169d28185615190565b93506169e2818560208601614460565b80840191505092915050565b60006169fa82846169bd565b915081905092915050565b600060a082019050616a1a6000830188614912565b616a276020830187614912565b616a346040830186614912565b616a4160608301856140ce565b616a4e6080830184615015565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122076f7f0920f4a36dd17b990acfe35ea72436b313a782b0a06d885eb17b7488e1164736f6c63430008110033", + "devdoc": { + "errors": { + "Empty()": [ + { + "details": "An operation (e.g. {front}) couldn't be completed due to the queue being empty." + } + ] + }, + "kind": "dev", + "methods": { + "COUNTING_MODE()": { + "details": "See {IGovernor-COUNTING_MODE}." + }, + "castVote(uint256,uint8)": { + "details": "See {IGovernor-castVote}." + }, + "castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)": { + "details": "See {IGovernor-castVoteBySig}." + }, + "castVoteWithReason(uint256,uint8,string)": { + "details": "See {IGovernor-castVoteWithReason}." + }, + "castVoteWithReasonAndParams(uint256,uint8,string,bytes)": { + "details": "See {IGovernor-castVoteWithReasonAndParams}." + }, + "castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)": { + "details": "See {IGovernor-castVoteWithReasonAndParamsBySig}." + }, + "execute(address[],uint256[],bytes[],bytes32)": { + "details": "See {IGovernor-execute}." + }, + "getVotes(address,uint256)": { + "details": "See {IGovernor-getVotes}." + }, + "getVotesWithParams(address,uint256,bytes)": { + "details": "See {IGovernor-getVotesWithParams}." + }, + "hasVoted(uint256,address)": { + "details": "See {IGovernor-hasVoted}." + }, + "hashProposal(address[],uint256[],bytes[],bytes32)": { + "details": "See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts." + }, + "name()": { + "details": "See {IGovernor-name}." + }, + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { + "details": "See {IERC1155Receiver-onERC1155BatchReceived}." + }, + "onERC1155Received(address,address,uint256,uint256,bytes)": { + "details": "See {IERC1155Receiver-onERC1155Received}." + }, + "onERC721Received(address,address,uint256,bytes)": { + "details": "See {IERC721Receiver-onERC721Received}." + }, + "proposalDeadline(uint256)": { + "details": "See {IGovernor-proposalDeadline}." + }, + "proposalEta(uint256)": { + "details": "Public accessor to check the eta of a queued proposal" + }, + "proposalSnapshot(uint256)": { + "details": "See {IGovernor-proposalSnapshot}." + }, + "proposalVotes(uint256)": { + "details": "Accessor to the internal vote counts." + }, + "queue(address[],uint256[],bytes[],bytes32)": { + "details": "Function to queue a proposal to the timelock." + }, + "quorumDenominator()": { + "details": "Returns the quorum denominator. Defaults to 100, but may be overridden." + }, + "quorumNumerator()": { + "details": "Returns the current quorum numerator. See {quorumDenominator}." + }, + "quorumNumerator(uint256)": { + "details": "Returns the quorum numerator at a specific block number. See {quorumDenominator}." + }, + "relay(address,uint256,bytes)": { + "details": "Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant." + }, + "setProposalThreshold(uint256)": { + "details": "Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event." + }, + "setVotingDelay(uint256)": { + "details": "Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event." + }, + "setVotingPeriod(uint256)": { + "details": "Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event." + }, + "timelock()": { + "details": "Public accessor to check the address of the timelock" + }, + "updateQuorumNumerator(uint256)": { + "details": "Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator." + }, + "updateTimelock(address)": { + "details": "Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals." + }, + "version()": { + "details": "See {IGovernor-version}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 565, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_name", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 570, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_proposals", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_struct(ProposalCore)563_storage)" + }, + { + "astId": 573, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_governanceCall", + "offset": 0, + "slot": "2", + "type": "t_struct(Bytes32Deque)9759_storage" + }, + { + "astId": 3238, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_votingDelay", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 3240, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_votingPeriod", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 3242, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_proposalThreshold", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 3030, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_proposalVotes", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_uint256,t_struct(ProposalVote)3025_storage)" + }, + { + "astId": 3841, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_quorumNumerator", + "offset": 0, + "slot": "8", + "type": "t_uint256" + }, + { + "astId": 3844, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_quorumNumeratorHistory", + "offset": 0, + "slot": "9", + "type": "t_struct(History)6052_storage" + }, + { + "astId": 3421, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_timelock", + "offset": 0, + "slot": "10", + "type": "t_contract(TimelockController)3004" + }, + { + "astId": 3425, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_timelockIds", + "offset": 0, + "slot": "11", + "type": "t_mapping(t_uint256,t_bytes32)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)6047_storage)dyn_storage": { + "base": "t_struct(Checkpoint)6047_storage", + "encoding": "dynamic_array", + "label": "struct Checkpoints.Checkpoint[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(TimelockController)3004": { + "encoding": "inplace", + "label": "contract TimelockController", + "numberOfBytes": "20" + }, + "t_int128": { + "encoding": "inplace", + "label": "int128", + "numberOfBytes": "16" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_int128,t_bytes32)": { + "encoding": "mapping", + "key": "t_int128", + "label": "mapping(int128 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_mapping(t_uint256,t_struct(ProposalCore)563_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct Governor.ProposalCore)", + "numberOfBytes": "32", + "value": "t_struct(ProposalCore)563_storage" + }, + "t_mapping(t_uint256,t_struct(ProposalVote)3025_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct GovernorCountingSimple.ProposalVote)", + "numberOfBytes": "32", + "value": "t_struct(ProposalVote)3025_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(BlockNumber)6704_storage": { + "encoding": "inplace", + "label": "struct Timers.BlockNumber", + "members": [ + { + "astId": 6703, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_deadline", + "offset": 0, + "slot": "0", + "type": "t_uint64" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Bytes32Deque)9759_storage": { + "encoding": "inplace", + "label": "struct DoubleEndedQueue.Bytes32Deque", + "members": [ + { + "astId": 9752, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_begin", + "offset": 0, + "slot": "0", + "type": "t_int128" + }, + { + "astId": 9754, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_end", + "offset": 16, + "slot": "0", + "type": "t_int128" + }, + { + "astId": 9758, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_data", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_int128,t_bytes32)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Checkpoint)6047_storage": { + "encoding": "inplace", + "label": "struct Checkpoints.Checkpoint", + "members": [ + { + "astId": 6044, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_blockNumber", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 6046, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_value", + "offset": 4, + "slot": "0", + "type": "t_uint224" + } + ], + "numberOfBytes": "32" + }, + "t_struct(History)6052_storage": { + "encoding": "inplace", + "label": "struct Checkpoints.History", + "members": [ + { + "astId": 6051, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_checkpoints", + "offset": 0, + "slot": "0", + "type": "t_array(t_struct(Checkpoint)6047_storage)dyn_storage" + } + ], + "numberOfBytes": "32" + }, + "t_struct(ProposalCore)563_storage": { + "encoding": "inplace", + "label": "struct Governor.ProposalCore", + "members": [ + { + "astId": 555, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "voteStart", + "offset": 0, + "slot": "0", + "type": "t_struct(BlockNumber)6704_storage" + }, + { + "astId": 558, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "voteEnd", + "offset": 0, + "slot": "1", + "type": "t_struct(BlockNumber)6704_storage" + }, + { + "astId": 560, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "executed", + "offset": 0, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 562, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "canceled", + "offset": 1, + "slot": "2", + "type": "t_bool" + } + ], + "numberOfBytes": "96" + }, + "t_struct(ProposalVote)3025_storage": { + "encoding": "inplace", + "label": "struct GovernorCountingSimple.ProposalVote", + "members": [ + { + "astId": 3016, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "againstVotes", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 3018, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "forVotes", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 3020, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "abstainVotes", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 3024, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "hasVoted", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_bool)" + } + ], + "numberOfBytes": "128" + }, + "t_uint224": { + "encoding": "inplace", + "label": "uint224", + "numberOfBytes": "28" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + } + } + } +} \ No newline at end of file diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json new file mode 100644 index 0000000..ba3b75b --- /dev/null +++ b/deployments/localhost/TimeLock.json @@ -0,0 +1,1173 @@ +{ + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "minDelay", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "proposers", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "executers", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "CallExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "CallScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "Cancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldDuration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "MinDelayChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "CANCELLER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXECUTOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROPOSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TIMELOCK_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "payload", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "executeBatch", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getMinDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "getTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "hashOperation", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "hashOperationBatch", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperation", + "outputs": [ + { + "internalType": "bool", + "name": "registered", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationDone", + "outputs": [ + { + "internalType": "bool", + "name": "done", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationPending", + "outputs": [ + { + "internalType": "bool", + "name": "pending", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationReady", + "outputs": [ + { + "internalType": "bool", + "name": "ready", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "schedule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "scheduleBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "name": "updateDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "transactionIndex": 0, + "gasUsed": "3041375", + "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000400000001000000400000000040200200000010200000000000000000000000000010000000000000000000000000000000000001400000000000020000400000000100000800000000000000000000020000000000000000000000000000000000000000000000000000000000080000000000000000000000000020000000000000000000000000000000000000001000000000000000000000000000204000000000000000000200002000000100000100200020000000000000001000000000000000000000000000000000400000000000000000", + "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105", + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 4, + "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 5, + "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0x11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e10", + "logIndex": 6, + "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" + } + ], + "blockNumber": 3, + "cumulativeGasUsed": "3041375", + "status": 1, + "byzantium": true + }, + "args": [ + 3600, + [], + [] + ], + "numDeployments": 1, + "solcInputHash": "0a567a41a96dc2d81abbf99faae0732b", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minDelay\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"executers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"CallScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"Cancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDuration\",\"type\":\"uint256\"}],\"name\":\"MinDelayChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCELLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXECUTOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMELOCK_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"cancel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperationBatch\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationDone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationPending\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ready\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"schedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"scheduleBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDelay\",\"type\":\"uint256\"}],\"name\":\"updateDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancel(bytes32)\":{\"details\":\"Cancel an operation. Requirements: - the caller must have the 'canceller' role.\"},\"execute(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role.\"},\"executeBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role.\"},\"getMinDelay()\":{\"details\":\"Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations).\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hashOperation(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a single transaction.\"},\"hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a batch of transactions.\"},\"isOperation(bytes32)\":{\"details\":\"Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations.\"},\"isOperationDone(bytes32)\":{\"details\":\"Returns whether an operation is done or not.\"},\"isOperationPending(bytes32)\":{\"details\":\"Returns whether an operation is pending or not.\"},\"isOperationReady(bytes32)\":{\"details\":\"Returns whether an operation is ready or not.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"schedule(address,uint256,bytes,bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role.\"},\"scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"updateDelay(uint256)\":{\"details\":\"Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLock.sol\":\"TimeLock\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/TimeLock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/TimelockController.sol\\\";\\n\\ncontract TimeLock is TimelockController {\\n // minDelay: How long you have to wait before executing\\n // proposers is the list of addresses that can purpose\\n // executers: Who can execute when proposal passes\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executers\\n ) TimelockController(minDelay, proposers, executers) {}\\n}\\n\",\"keccak256\":\"0x6e48ab9ddd3998d94cdd53158d3d0d16984ac638fb4f685fae7fd734254e3c11\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162003bd838038062003bd8833981810160405281019062000037919062000779565b8282826200006c7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5806200035560201b60201c565b620000be7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc17f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001107fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e637f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7837f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001a37f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca562000197620003b860201b60201c565b620003c060201b60201c565b620001d57f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca530620003c060201b60201c565b60005b82518110156200029457620002317fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc18483815181106200021d576200021c62000813565b5b6020026020010151620003c060201b60201c565b620002807ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7838483815181106200026c576200026b62000813565b5b6020026020010151620003c060201b60201c565b806200028c9062000871565b9050620001d8565b5060005b81518110156200030557620002f17fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63838381518110620002dd57620002dc62000813565b5b6020026020010151620003c060201b60201c565b80620002fd9062000871565b905062000298565b50826002819055507f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5600084604051620003419291906200091c565b60405180910390a150505050505062000949565b60006200036883620003d660201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b620003d28282620003f560201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b620004078282620004e660201b60201c565b620004e257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000487620003b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620005798162000564565b81146200058557600080fd5b50565b60008151905062000599816200056e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005ef82620005a4565b810181811067ffffffffffffffff82111715620006115762000610620005b5565b5b80604052505050565b60006200062662000550565b9050620006348282620005e4565b919050565b600067ffffffffffffffff821115620006575762000656620005b5565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200069a826200066d565b9050919050565b620006ac816200068d565b8114620006b857600080fd5b50565b600081519050620006cc81620006a1565b92915050565b6000620006e9620006e38462000639565b6200061a565b905080838252602082019050602084028301858111156200070f576200070e62000668565b5b835b818110156200073c5780620007278882620006bb565b84526020840193505060208101905062000711565b5050509392505050565b600082601f8301126200075e576200075d6200059f565b5b815162000770848260208601620006d2565b91505092915050565b6000806000606084860312156200079557620007946200055a565b5b6000620007a58682870162000588565b935050602084015167ffffffffffffffff811115620007c957620007c86200055f565b5b620007d78682870162000746565b925050604084015167ffffffffffffffff811115620007fb57620007fa6200055f565b5b620008098682870162000746565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200087e8262000564565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620008b357620008b262000842565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000620008f3620008ed620008e784620008be565b620008c8565b62000564565b9050919050565b6200090581620008d2565b82525050565b620009168162000564565b82525050565b6000604082019050620009336000830185620008fa565b6200094260208301846200090b565b9392505050565b61327f80620009596000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "cancel(bytes32)": { + "details": "Cancel an operation. Requirements: - the caller must have the 'canceller' role." + }, + "execute(address,uint256,bytes,bytes32,bytes32)": { + "details": "Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role." + }, + "executeBatch(address[],uint256[],bytes[],bytes32,bytes32)": { + "details": "Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role." + }, + "getMinDelay()": { + "details": "Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getTimestamp(bytes32)": { + "details": "Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations)." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "hashOperation(address,uint256,bytes,bytes32,bytes32)": { + "details": "Returns the identifier of an operation containing a single transaction." + }, + "hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)": { + "details": "Returns the identifier of an operation containing a batch of transactions." + }, + "isOperation(bytes32)": { + "details": "Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations." + }, + "isOperationDone(bytes32)": { + "details": "Returns whether an operation is done or not." + }, + "isOperationPending(bytes32)": { + "details": "Returns whether an operation is pending or not." + }, + "isOperationReady(bytes32)": { + "details": "Returns whether an operation is ready or not." + }, + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { + "details": "See {IERC1155Receiver-onERC1155BatchReceived}." + }, + "onERC1155Received(address,address,uint256,uint256,bytes)": { + "details": "See {IERC1155Receiver-onERC1155Received}." + }, + "onERC721Received(address,address,uint256,bytes)": { + "details": "See {IERC721Receiver-onERC721Received}." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "schedule(address,uint256,bytes,bytes32,bytes32,uint256)": { + "details": "Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role." + }, + "scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)": { + "details": "Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "updateDelay(uint256)": { + "details": "Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 24, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "_roles", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + }, + { + "astId": 2142, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "_timestamps", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_uint256)" + }, + { + "astId": 2144, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "_minDelay", + "offset": 0, + "slot": "2", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)19_storage" + }, + "t_mapping(t_bytes32,t_uint256)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(RoleData)19_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 16, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 18, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/localhost/solcInputs/0a567a41a96dc2d81abbf99faae0732b.json b/deployments/localhost/solcInputs/0a567a41a96dc2d81abbf99faae0732b.json new file mode 100644 index 0000000..827c760 --- /dev/null +++ b/deployments/localhost/solcInputs/0a567a41a96dc2d81abbf99faae0732b.json @@ -0,0 +1,146 @@ +{ + "language": "Solidity", + "sources": { + "contracts/Box.sol": { + "content": "// contracts/Box.sol\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract Box is Ownable {\n uint256 private value;\n\n // Emitted when the stored value changes\n event ValueChanged(uint256 newValue);\n\n // Stores a new value in the contract\n function store(uint256 newValue) public onlyOwner {\n value = newValue;\n emit ValueChanged(newValue);\n }\n\n // Reads the last stored value\n function retrieve() public view returns (uint256) {\n return value;\n }\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + }, + "@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.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 Strings {\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" + }, + "@openzeppelin/contracts/governance/Governor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/IGovernor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" + }, + "@openzeppelin/contracts/utils/Timers.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" + }, + "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" + }, + "contracts/GovernerContract.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl\n{\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Checkpoints.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" + }, + "@openzeppelin/contracts/governance/TimelockController.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IGovernor.sol\";\n\n/**\n * @dev Extension of the {IGovernor} for timelock supporting modules.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernorTimelock is IGovernor {\n event ProposalQueued(uint256 proposalId, uint256 eta);\n\n function timelock() public view virtual returns (address);\n\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\n\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual returns (uint256 proposalId);\n}\n" + }, + "@openzeppelin/contracts/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + }, + "contracts/TimeLock.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/TimelockController.sol\";\n\ncontract TimeLock is TimelockController {\n // minDelay: How long you have to wait before executing\n // proposers is the list of addresses that can purpose\n // executers: Who can execute when proposal passes\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executers\n ) TimelockController(minDelay, proposers, executers) {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" + }, + "contracts/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\ncontract GovernanceToken is ERC20Votes {\n uint256 public s_maxSupply = 1000000000000000000000000;\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n _mint(msg.sender, s_maxSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount) internal override(ERC20Votes) {\n super._mint(to, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/helper-config.js b/helper-config.js index 671582e..ebb8a09 100644 --- a/helper-config.js +++ b/helper-config.js @@ -15,6 +15,11 @@ const MIN_DELAY = 3600; const VOTING_PERIOD = 5; const VOTING_DELAY = 1; const QUORUM_PERCENTAGE = 4; +const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; +const NEW_VALUE = 77; +const FUNC = "store"; +const PROPOSAL_DESCRIPTION = "Propasol #1: Store 77 in the Box!"; +const proposalsFile = "./proposals.json"; module.exports = { developmentChains, @@ -24,4 +29,9 @@ module.exports = { VOTING_PERIOD, VOTING_DELAY, QUORUM_PERCENTAGE, + ADDRESS_ZERO, + NEW_VALUE, + FUNC, + PROPOSAL_DESCRIPTION, + proposalsFile, }; diff --git a/proposals.json b/proposals.json new file mode 100644 index 0000000..bb2d8d6 --- /dev/null +++ b/proposals.json @@ -0,0 +1 @@ +{"31337":["47521742407248176895329046821676979254978125686746004564697692958941862657168"]} \ No newline at end of file diff --git a/scripts/propose.js b/scripts/propose.js new file mode 100644 index 0000000..438b46d --- /dev/null +++ b/scripts/propose.js @@ -0,0 +1,46 @@ +const { ethers, network } = require("hardhat"); +const { + FUNC, + NEW_VALUE, + PROPOSAL_DESCRIPTION, + developmentChains, + VOTING_DELAY, + proposalsFile, +} = require("../helper-config"); +const { moveBlocks } = require("../utils/move-blocks"); +const fs = require("fs"); + +async function propose(args, functionToCall, proposalDescription) { + const governor = await ethers.getContract("GovernerContract"); + const box = await ethers.getContract("Box"); + + const encodedFunctionCall = box.interface.encodeFunctionData( + functionToCall, + args + ); + console.log(`Proposing ${functionToCall} on ${box.address} with ${args}`); + console.log(`Proposal description: \n ${proposalDescription}`); + + const proposalTx = await governor.propose( + [box.address], + [0], + [encodedFunctionCall], + proposalDescription + ); + const proposeReceipt = await proposalTx.wait(1); + + if (developmentChains.includes(network.name)) { + await moveBlocks(VOTING_DELAY + 1); + } + const proposalId = proposeReceipt.events[0].args.proposalId; + let proposals = JSON.parse(fs.readFileSync(proposalsFile), "utf8"); + proposals[network.config.chainId.toString()].push(proposalId.toString()); + fs.writeFileSync(proposalsFile, JSON.stringify(proposals)); +} + +propose([NEW_VALUE], FUNC, PROPOSAL_DESCRIPTION) + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/queue-and-execute.js b/scripts/queue-and-execute.js new file mode 100644 index 0000000..cbe3aad --- /dev/null +++ b/scripts/queue-and-execute.js @@ -0,0 +1,57 @@ +const { ethers, network } = require("hardhat"); +const { + FUNC, + NEW_VALUE, + PROPOSAL_DESCRIPTION, + developmentChains, + VOTING_DELAY, + proposalsFile, + MIN_DELAY, +} = require("../helper-config"); +const { moveBlocks } = require("../utils/move-blocks"); +const { moveTime } = require("../utils/move-time"); +const fs = require("fs"); + +async function queue_and_execute(functionToCall, proposalDescription) { + const args = [NEW_VALUE]; + + const box = await ethers.getContract("Box"); + + const encodedFunctionCall = box.interface.encodeFunctionData(FUNC, args); + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(PROPOSAL_DESCRIPTION) + ); + + const governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + const queueTx = await governor.queue( + [box.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await queueTx.wait(1); + + if (developmentChains.includes(network.name)) { + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + } + + console.log("Executing..."); + const executeTx = await governor.execute( + [box.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await executeTx.wait(1); + const boxNewValue = await box.retrieve(); + console.log(`New Box Value: ${boxNewValue.toString()}`); +} + +queue_and_execute([NEW_VALUE], FUNC, PROPOSAL_DESCRIPTION) + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/vote.js b/scripts/vote.js new file mode 100644 index 0000000..7255f5d --- /dev/null +++ b/scripts/vote.js @@ -0,0 +1,37 @@ +const { ethers, network } = require("hardhat"); +const { + proposalsFile, + developmentChains, + VOTING_PERIOD, +} = require("../helper-config"); +const { moveBlocks } = require("../utils/move-blocks"); +const fs = require("fs"); + +const index = 0; + +async function vote(proposalIndex) { + const proposals = JSON.parse(fs.readFileSync(proposalsFile, "utf8")); + const proposalId = proposals[network.config.chainId][proposalIndex]; + // 0 = aganist, 1 = for, 2= abstain + const voteWay = 1; + const governor = await ethers.getContract("GovernerContract"); + const reason = "Just I want!"; + const voteTxResponse = await governor.castVoteWithReason( + proposalId, + voteWay, + reason + ); + await voteTxResponse.wait(1); + + if (developmentChains.includes(network.name)) { + await moveBlocks(VOTING_PERIOD + 1); + } + console.log("Voted! Ready to gooo!"); +} + +vote(index) + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/utils/move-blocks.js b/utils/move-blocks.js new file mode 100644 index 0000000..25d0973 --- /dev/null +++ b/utils/move-blocks.js @@ -0,0 +1,20 @@ +const { network } = require("hardhat"); + +function sleep(timeMs) { + return new Promise((resolve) => setTimeout(resolve, timeMs)); +} +async function moveBlocks(amount, sleepAmount = 0) { + console.log("Moving blocks..."); + for (let index = 0; index < amount; index++) { + await network.provider.request({ + method: "evm_mine", + params: [], + }); + if (sleepAmount) { + console.log(`Sleeping for ${sleepAmount}`); + await sleep(sleepAmount); + // you can say await because sleep returns a promise + } + } +} +module.exports = { moveBlocks, sleep }; diff --git a/utils/move-time.js b/utils/move-time.js new file mode 100644 index 0000000..8cd8d6b --- /dev/null +++ b/utils/move-time.js @@ -0,0 +1,8 @@ +const { network } = require("hardhat"); + +async function moveTime(amount) { + console.log("Moving time..."); + await network.provider.send("evm_increaseTime", [amount]); + console.log(`Moved forward ${amount} seconds..`); +} +module.exports = { moveTime }; From eb9e2629e0688e5084a00ced2beb495db693d3af Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Wed, 26 Oct 2022 03:51:20 +0300 Subject: [PATCH 02/28] uptaded erc20 --- contracts/GovernanceToken.sol | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/contracts/GovernanceToken.sol b/contracts/GovernanceToken.sol index 00999c8..bb0b15b 100644 --- a/contracts/GovernanceToken.sol +++ b/contracts/GovernanceToken.sol @@ -4,13 +4,20 @@ pragma solidity ^0.8.7; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; contract GovernanceToken is ERC20Votes { - uint256 public s_maxSupply = 1000000000000000000000000; + uint256 public s_initialSupply = 1000000e18; + address private immutable i_owner; constructor() ERC20("GovernanceToken", "GT") ERC20Permit("GovernanceToken") { - _mint(msg.sender, s_maxSupply); + i_owner = msg.sender; + _mint(msg.sender, s_initialSupply); + } + + modifier onlyOwner() { + require(i_owner == msg.sender, "Ownable: caller is not the owner"); + _; } function _afterTokenTransfer( @@ -21,7 +28,11 @@ contract GovernanceToken is ERC20Votes { super._afterTokenTransfer(from, to, amount); } - function _mint(address to, uint256 amount) internal override(ERC20Votes) { + function _mint(address to, uint256 amount) + internal + override(ERC20Votes) + onlyOwner + { super._mint(to, amount); } From 9c4aed1bb5c85ebd4bd43fb346f07d6143e0e18c Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 28 Oct 2022 07:26:19 +0300 Subject: [PATCH 03/28] Add tests --- contracts/GovernanceToken.sol | 25 +- coverage.json | 1 + coverage/base.css | 213 ++ coverage/contracts/Box.sol.html | 134 ++ coverage/contracts/GovernanceToken.sol.html | 245 +++ coverage/contracts/GovernerContract.sol.html | 452 +++++ coverage/contracts/TimeLock.sol.html | 110 + coverage/contracts/index.html | 132 ++ coverage/coverage-final.json | 5 + coverage/index.html | 93 + coverage/lcov-report/base.css | 213 ++ coverage/lcov-report/contracts/Box.sol.html | 134 ++ .../contracts/GovernanceToken.sol.html | 245 +++ .../contracts/GovernerContract.sol.html | 452 +++++ .../lcov-report/contracts/TimeLock.sol.html | 110 + coverage/lcov-report/contracts/index.html | 132 ++ coverage/lcov-report/index.html | 93 + coverage/lcov-report/prettify.css | 1 + coverage/lcov-report/prettify.js | 1 + coverage/lcov-report/sort-arrow-sprite.png | Bin 0 -> 209 bytes coverage/lcov-report/sorter.js | 158 ++ coverage/lcov.info | 103 + coverage/prettify.css | 1 + coverage/prettify.js | 1 + coverage/sort-arrow-sprite.png | Bin 0 -> 209 bytes coverage/sorter.js | 158 ++ deploy/01-deploy-GovernerToken.js | 8 +- deployments/localhost/Box.json | 185 -- deployments/localhost/GovernanceToken.json | 103 +- deployments/localhost/GovernerContract.json | 1779 ----------------- deployments/localhost/TimeLock.json | 1173 ----------- ... => 1fbca7b8c0c69581356fdb74c6edaebf.json} | 92 +- helper-config.js | 10 +- test/unit/dao.test.js | 274 +++ 34 files changed, 3625 insertions(+), 3211 deletions(-) create mode 100644 coverage.json create mode 100644 coverage/base.css create mode 100644 coverage/contracts/Box.sol.html create mode 100644 coverage/contracts/GovernanceToken.sol.html create mode 100644 coverage/contracts/GovernerContract.sol.html create mode 100644 coverage/contracts/TimeLock.sol.html create mode 100644 coverage/contracts/index.html create mode 100644 coverage/coverage-final.json create mode 100644 coverage/index.html create mode 100644 coverage/lcov-report/base.css create mode 100644 coverage/lcov-report/contracts/Box.sol.html create mode 100644 coverage/lcov-report/contracts/GovernanceToken.sol.html create mode 100644 coverage/lcov-report/contracts/GovernerContract.sol.html create mode 100644 coverage/lcov-report/contracts/TimeLock.sol.html create mode 100644 coverage/lcov-report/contracts/index.html create mode 100644 coverage/lcov-report/index.html create mode 100644 coverage/lcov-report/prettify.css create mode 100644 coverage/lcov-report/prettify.js create mode 100644 coverage/lcov-report/sort-arrow-sprite.png create mode 100644 coverage/lcov-report/sorter.js create mode 100644 coverage/lcov.info create mode 100644 coverage/prettify.css create mode 100644 coverage/prettify.js create mode 100644 coverage/sort-arrow-sprite.png create mode 100644 coverage/sorter.js delete mode 100644 deployments/localhost/Box.json delete mode 100644 deployments/localhost/GovernerContract.json delete mode 100644 deployments/localhost/TimeLock.json rename deployments/localhost/solcInputs/{0a567a41a96dc2d81abbf99faae0732b.json => 1fbca7b8c0c69581356fdb74c6edaebf.json} (99%) create mode 100644 test/unit/dao.test.js diff --git a/contracts/GovernanceToken.sol b/contracts/GovernanceToken.sol index bb0b15b..a9bbf38 100644 --- a/contracts/GovernanceToken.sol +++ b/contracts/GovernanceToken.sol @@ -7,6 +7,17 @@ contract GovernanceToken is ERC20Votes { uint256 public s_initialSupply = 1000000e18; address private immutable i_owner; + event TokenTransfer( + address indexed _from, + address indexed _to, + uint256 _amount + ); + + modifier onlyOwner() { + require(i_owner == msg.sender, "Ownable: caller is not the owner"); + _; + } + constructor() ERC20("GovernanceToken", "GT") ERC20Permit("GovernanceToken") @@ -15,17 +26,13 @@ contract GovernanceToken is ERC20Votes { _mint(msg.sender, s_initialSupply); } - modifier onlyOwner() { - require(i_owner == msg.sender, "Ownable: caller is not the owner"); - _; - } - function _afterTokenTransfer( address from, address to, uint256 amount ) internal override(ERC20Votes) { super._afterTokenTransfer(from, to, amount); + emit TokenTransfer(from, to, amount); } function _mint(address to, uint256 amount) @@ -36,6 +43,14 @@ contract GovernanceToken is ERC20Votes { super._mint(to, amount); } + function mintToken(address to, uint256 amount) external { + _mint(to, amount); + } + + function burnToken(address account, uint256 amount) external { + _burn(account, amount); + } + function _burn(address account, uint256 amount) internal override(ERC20Votes) diff --git a/coverage.json b/coverage.json new file mode 100644 index 0000000..dc9226a --- /dev/null +++ b/coverage.json @@ -0,0 +1 @@ +{"contracts/Box.sol":{"l":{"15":0,"16":0,"21":0},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":0,"2":0,"3":0},"b":{},"f":{"1":0,"2":0},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":16,"35":16,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":16,"5":16,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":16,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"45":1,"54":1,"63":1,"72":5,"81":1,"90":1,"100":0,"109":0,"118":0,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":1,"2":1,"3":1,"4":5,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0},"b":{},"f":{"1":3,"2":1,"3":1,"4":1,"5":5,"6":1,"7":1,"8":0,"9":0,"10":0,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/base.css b/coverage/base.css new file mode 100644 index 0000000..29737bc --- /dev/null +++ b/coverage/base.css @@ -0,0 +1,213 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.medium .chart { border:1px solid #f9cd0b; } +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } +/* light gray */ +span.cline-neutral { background: #eaeaea; } + +.cbranch-no { background: yellow !important; color: #111; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/contracts/Box.sol.html b/coverage/contracts/Box.sol.html new file mode 100644 index 0000000..cf82677 --- /dev/null +++ b/coverage/contracts/Box.sol.html @@ -0,0 +1,134 @@ + + + + Code coverage report for contracts/Box.sol + + + + + + + +
+
+

+ all files / contracts/ Box.sol +

+
+
+ 0% + Statements + 0/3 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/2 +
+
+ 0% + Lines + 0/3 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// contracts/Box.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+ 
+import "@openzeppelin/contracts/access/Ownable.sol";
+ 
+contract Box is Ownable {
+    uint256 private value;
+ 
+    // Emitted when the stored value changes
+    event ValueChanged(uint256 newValue);
+ 
+    // Stores a new value in the contract
+    function store(uint256 newValue) public onlyOwner {
+        value = newValue;
+        emit ValueChanged(newValue);
+    }
+ 
+    // Reads the last stored value
+    function retrieve() public view returns (uint256) {
+        return value;
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html new file mode 100644 index 0000000..11fa19d --- /dev/null +++ b/coverage/contracts/GovernanceToken.sol.html @@ -0,0 +1,245 @@ + + + + Code coverage report for contracts/GovernanceToken.sol + + + + + + + +
+
+

+ all files / contracts/ GovernanceToken.sol +

+
+
+ 77.78% + Statements + 7/9 +
+
+ 100% + Branches + 2/2 +
+
+ 71.43% + Functions + 5/7 +
+
+ 80% + Lines + 8/10 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + + +  +  +  +  +  +  + + +  +  +  +  +  +  +  +16× +16× +  +  +  +  +  +  +  + +  +  +  + +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.7;
+ 
+import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
+ 
+contract GovernanceToken is ERC20Votes {
+    uint256 public s_initialSupply = 1000000e18;
+    address private immutable i_owner;
+ 
+    event TokenTransfer(
+        address indexed _from,
+        address indexed _to,
+        uint256 _amount
+    );
+ 
+    modifier onlyOwner() {
+        require(i_owner == msg.sender, "Ownable: caller is not the owner");
+        _;
+    }
+ 
+    constructor()
+        ERC20("GovernanceToken", "GT")
+        ERC20Permit("GovernanceToken")
+    {
+        i_owner = msg.sender;
+        _mint(msg.sender, s_initialSupply);
+    }
+ 
+    function _afterTokenTransfer(
+        address from,
+        address to,
+        uint256 amount
+    ) internal override(ERC20Votes) {
+        super._afterTokenTransfer(from, to, amount);
+        emit TokenTransfer(from, to, amount);
+    }
+ 
+    function _mint(address to, uint256 amount)
+        internal
+        override(ERC20Votes)
+        onlyOwner
+    {
+        super._mint(to, amount);
+    }
+ 
+    function mintToken(address to, uint256 amount) external {
+        _mint(to, amount);
+    }
+ 
+    function burnToken(address account, uint256 amount) external {
+        _burn(account, amount);
+    }
+ 
+    function _burn(address account, uint256 amount)
+        internal
+        override(ERC20Votes)
+    {
+        super._burn(account, amount);
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html new file mode 100644 index 0000000..8962af8 --- /dev/null +++ b/coverage/contracts/GovernerContract.sol.html @@ -0,0 +1,452 @@ + + + + Code coverage report for contracts/GovernerContract.sol + + + + + + + +
+
+

+ all files / contracts/ GovernerContract.sol +

+
+
+ 60% + Statements + 6/10 +
+
+ 100% + Branches + 0/0 +
+
+ 63.64% + Functions + 7/11 +
+
+ 60% + Lines + 6/10 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.4;
+ 
+import "@openzeppelin/contracts/governance/Governor.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";
+ 
+contract GovernerContract is
+    Governor,
+    GovernorSettings,
+    GovernorCountingSimple,
+    GovernorVotes,
+    GovernorVotesQuorumFraction,
+    GovernorTimelockControl
+{
+    constructor(
+        IVotes _token,
+        TimelockController _timelock,
+        uint256 _votingDelay,
+        uint256 _votingPeriod,
+        uint256 _quorumPercentage
+    )
+        Governor("GovernerContract")
+        GovernorSettings(
+            _votingDelay, /* 1 block */
+            _votingPeriod, /* 45818 blocks = ~1 week */
+            0
+        )
+        GovernorVotes(_token)
+        GovernorVotesQuorumFraction(_quorumPercentage)
+        GovernorTimelockControl(_timelock)
+    {}
+ 
+    // The following functions are overrides required by Solidity.
+ 
+    function votingDelay()
+        public
+        view
+        override(IGovernor, GovernorSettings)
+        returns (uint256)
+    {
+        return super.votingDelay();
+    }
+ 
+    function votingPeriod()
+        public
+        view
+        override(IGovernor, GovernorSettings)
+        returns (uint256)
+    {
+        return super.votingPeriod();
+    }
+ 
+    function quorum(uint256 blockNumber)
+        public
+        view
+        override(IGovernor, GovernorVotesQuorumFraction)
+        returns (uint256)
+    {
+        return super.quorum(blockNumber);
+    }
+ 
+    function state(uint256 proposalId)
+        public
+        view
+        override(Governor, GovernorTimelockControl)
+        returns (ProposalState)
+    {
+        return super.state(proposalId);
+    }
+ 
+    function propose(
+        address[] memory targets,
+        uint256[] memory values,
+        bytes[] memory calldatas,
+        string memory description
+    ) public override(Governor, IGovernor) returns (uint256) {
+        return super.propose(targets, values, calldatas, description);
+    }
+ 
+    function proposalThreshold()
+        public
+        view
+        override(Governor, GovernorSettings)
+        returns (uint256)
+    {
+        return super.proposalThreshold();
+    }
+ 
+    function _execute(
+        uint256 proposalId,
+        address[] memory targets,
+        uint256[] memory values,
+        bytes[] memory calldatas,
+        bytes32 descriptionHash
+    ) internal override(Governor, GovernorTimelockControl) {
+        super._execute(proposalId, targets, values, calldatas, descriptionHash);
+    }
+ 
+    function _cancel(
+        address[] memory targets,
+        uint256[] memory values,
+        bytes[] memory calldatas,
+        bytes32 descriptionHash
+    ) internal override(Governor, GovernorTimelockControl) returns (uint256) {
+        return super._cancel(targets, values, calldatas, descriptionHash);
+    }
+ 
+    function _executor()
+        internal
+        view
+        override(Governor, GovernorTimelockControl)
+        returns (address)
+    {
+        return super._executor();
+    }
+ 
+    function supportsInterface(bytes4 interfaceId)
+        public
+        view
+        override(Governor, GovernorTimelockControl)
+        returns (bool)
+    {
+        return super.supportsInterface(interfaceId);
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html new file mode 100644 index 0000000..fe58459 --- /dev/null +++ b/coverage/contracts/TimeLock.sol.html @@ -0,0 +1,110 @@ + + + + Code coverage report for contracts/TimeLock.sol + + + + + + + +
+
+

+ all files / contracts/ TimeLock.sol +

+
+
+ 100% + Statements + 0/0 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 0/0 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.4;
+ 
+import "@openzeppelin/contracts/governance/TimelockController.sol";
+ 
+contract TimeLock is TimelockController {
+    // minDelay: How long you have to wait before executing
+    // proposers is the list of addresses that can purpose
+    // executers: Who can execute when proposal passes
+    constructor(
+        uint256 minDelay,
+        address[] memory proposers,
+        address[] memory executers
+    ) TimelockController(minDelay, proposers, executers) {}
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html new file mode 100644 index 0000000..1f17f81 --- /dev/null +++ b/coverage/contracts/index.html @@ -0,0 +1,132 @@ + + + + Code coverage report for contracts/ + + + + + + + +
+
+

+ all files contracts/ +

+
+
+ 59.09% + Statements + 13/22 +
+
+ 100% + Branches + 2/2 +
+
+ 61.9% + Functions + 13/21 +
+
+ 60.87% + Lines + 14/23 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Box.sol
0%0/3100%0/00%0/20%0/3
GovernanceToken.sol
77.78%7/9100%2/271.43%5/780%8/10
GovernerContract.sol
60%6/10100%0/063.64%7/1160%6/10
TimeLock.sol
100%0/0100%0/0100%1/1100%0/0
+
+
+ + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 0000000..023a39f --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,5 @@ +{ +"contracts/Box.sol":{"l":{"15":0,"16":0,"21":0},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":0,"2":0,"3":0},"b":{},"f":{"1":0,"2":0},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, +"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":16,"35":16,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":16,"5":16,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":16,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, +"contracts/GovernerContract.sol":{"l":{"45":1,"54":1,"63":1,"72":5,"81":1,"90":1,"100":0,"109":0,"118":0,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":1,"2":1,"3":1,"4":5,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0},"b":{},"f":{"1":3,"2":1,"3":1,"4":1,"5":5,"6":1,"7":1,"8":0,"9":0,"10":0,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}}, +"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html new file mode 100644 index 0000000..96a7fc1 --- /dev/null +++ b/coverage/index.html @@ -0,0 +1,93 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ / +

+
+
+ 59.09% + Statements + 13/22 +
+
+ 100% + Branches + 2/2 +
+
+ 61.9% + Functions + 13/21 +
+
+ 60.87% + Lines + 14/23 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
contracts/
59.09%13/22100%2/261.9%13/2160.87%14/23
+
+
+ + + + + + + diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..29737bc --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,213 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.medium .chart { border:1px solid #f9cd0b; } +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } +/* light gray */ +span.cline-neutral { background: #eaeaea; } + +.cbranch-no { background: yellow !important; color: #111; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/contracts/Box.sol.html b/coverage/lcov-report/contracts/Box.sol.html new file mode 100644 index 0000000..cf82677 --- /dev/null +++ b/coverage/lcov-report/contracts/Box.sol.html @@ -0,0 +1,134 @@ + + + + Code coverage report for contracts/Box.sol + + + + + + + +
+
+

+ all files / contracts/ Box.sol +

+
+
+ 0% + Statements + 0/3 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/2 +
+
+ 0% + Lines + 0/3 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// contracts/Box.sol
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+ 
+import "@openzeppelin/contracts/access/Ownable.sol";
+ 
+contract Box is Ownable {
+    uint256 private value;
+ 
+    // Emitted when the stored value changes
+    event ValueChanged(uint256 newValue);
+ 
+    // Stores a new value in the contract
+    function store(uint256 newValue) public onlyOwner {
+        value = newValue;
+        emit ValueChanged(newValue);
+    }
+ 
+    // Reads the last stored value
+    function retrieve() public view returns (uint256) {
+        return value;
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html new file mode 100644 index 0000000..11fa19d --- /dev/null +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -0,0 +1,245 @@ + + + + Code coverage report for contracts/GovernanceToken.sol + + + + + + + +
+
+

+ all files / contracts/ GovernanceToken.sol +

+
+
+ 77.78% + Statements + 7/9 +
+
+ 100% + Branches + 2/2 +
+
+ 71.43% + Functions + 5/7 +
+
+ 80% + Lines + 8/10 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + + +  +  +  +  +  +  + + +  +  +  +  +  +  +  +16× +16× +  +  +  +  +  +  +  + +  +  +  + +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.7;
+ 
+import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
+ 
+contract GovernanceToken is ERC20Votes {
+    uint256 public s_initialSupply = 1000000e18;
+    address private immutable i_owner;
+ 
+    event TokenTransfer(
+        address indexed _from,
+        address indexed _to,
+        uint256 _amount
+    );
+ 
+    modifier onlyOwner() {
+        require(i_owner == msg.sender, "Ownable: caller is not the owner");
+        _;
+    }
+ 
+    constructor()
+        ERC20("GovernanceToken", "GT")
+        ERC20Permit("GovernanceToken")
+    {
+        i_owner = msg.sender;
+        _mint(msg.sender, s_initialSupply);
+    }
+ 
+    function _afterTokenTransfer(
+        address from,
+        address to,
+        uint256 amount
+    ) internal override(ERC20Votes) {
+        super._afterTokenTransfer(from, to, amount);
+        emit TokenTransfer(from, to, amount);
+    }
+ 
+    function _mint(address to, uint256 amount)
+        internal
+        override(ERC20Votes)
+        onlyOwner
+    {
+        super._mint(to, amount);
+    }
+ 
+    function mintToken(address to, uint256 amount) external {
+        _mint(to, amount);
+    }
+ 
+    function burnToken(address account, uint256 amount) external {
+        _burn(account, amount);
+    }
+ 
+    function _burn(address account, uint256 amount)
+        internal
+        override(ERC20Votes)
+    {
+        super._burn(account, amount);
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html new file mode 100644 index 0000000..8962af8 --- /dev/null +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -0,0 +1,452 @@ + + + + Code coverage report for contracts/GovernerContract.sol + + + + + + + +
+
+

+ all files / contracts/ GovernerContract.sol +

+
+
+ 60% + Statements + 6/10 +
+
+ 100% + Branches + 0/0 +
+
+ 63.64% + Functions + 7/11 +
+
+ 60% + Lines + 6/10 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.4;
+ 
+import "@openzeppelin/contracts/governance/Governor.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";
+import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";
+ 
+contract GovernerContract is
+    Governor,
+    GovernorSettings,
+    GovernorCountingSimple,
+    GovernorVotes,
+    GovernorVotesQuorumFraction,
+    GovernorTimelockControl
+{
+    constructor(
+        IVotes _token,
+        TimelockController _timelock,
+        uint256 _votingDelay,
+        uint256 _votingPeriod,
+        uint256 _quorumPercentage
+    )
+        Governor("GovernerContract")
+        GovernorSettings(
+            _votingDelay, /* 1 block */
+            _votingPeriod, /* 45818 blocks = ~1 week */
+            0
+        )
+        GovernorVotes(_token)
+        GovernorVotesQuorumFraction(_quorumPercentage)
+        GovernorTimelockControl(_timelock)
+    {}
+ 
+    // The following functions are overrides required by Solidity.
+ 
+    function votingDelay()
+        public
+        view
+        override(IGovernor, GovernorSettings)
+        returns (uint256)
+    {
+        return super.votingDelay();
+    }
+ 
+    function votingPeriod()
+        public
+        view
+        override(IGovernor, GovernorSettings)
+        returns (uint256)
+    {
+        return super.votingPeriod();
+    }
+ 
+    function quorum(uint256 blockNumber)
+        public
+        view
+        override(IGovernor, GovernorVotesQuorumFraction)
+        returns (uint256)
+    {
+        return super.quorum(blockNumber);
+    }
+ 
+    function state(uint256 proposalId)
+        public
+        view
+        override(Governor, GovernorTimelockControl)
+        returns (ProposalState)
+    {
+        return super.state(proposalId);
+    }
+ 
+    function propose(
+        address[] memory targets,
+        uint256[] memory values,
+        bytes[] memory calldatas,
+        string memory description
+    ) public override(Governor, IGovernor) returns (uint256) {
+        return super.propose(targets, values, calldatas, description);
+    }
+ 
+    function proposalThreshold()
+        public
+        view
+        override(Governor, GovernorSettings)
+        returns (uint256)
+    {
+        return super.proposalThreshold();
+    }
+ 
+    function _execute(
+        uint256 proposalId,
+        address[] memory targets,
+        uint256[] memory values,
+        bytes[] memory calldatas,
+        bytes32 descriptionHash
+    ) internal override(Governor, GovernorTimelockControl) {
+        super._execute(proposalId, targets, values, calldatas, descriptionHash);
+    }
+ 
+    function _cancel(
+        address[] memory targets,
+        uint256[] memory values,
+        bytes[] memory calldatas,
+        bytes32 descriptionHash
+    ) internal override(Governor, GovernorTimelockControl) returns (uint256) {
+        return super._cancel(targets, values, calldatas, descriptionHash);
+    }
+ 
+    function _executor()
+        internal
+        view
+        override(Governor, GovernorTimelockControl)
+        returns (address)
+    {
+        return super._executor();
+    }
+ 
+    function supportsInterface(bytes4 interfaceId)
+        public
+        view
+        override(Governor, GovernorTimelockControl)
+        returns (bool)
+    {
+        return super.supportsInterface(interfaceId);
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html new file mode 100644 index 0000000..fe58459 --- /dev/null +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -0,0 +1,110 @@ + + + + Code coverage report for contracts/TimeLock.sol + + + + + + + +
+
+

+ all files / contracts/ TimeLock.sol +

+
+
+ 100% + Statements + 0/0 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 0/0 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.4;
+ 
+import "@openzeppelin/contracts/governance/TimelockController.sol";
+ 
+contract TimeLock is TimelockController {
+    // minDelay: How long you have to wait before executing
+    // proposers is the list of addresses that can purpose
+    // executers: Who can execute when proposal passes
+    constructor(
+        uint256 minDelay,
+        address[] memory proposers,
+        address[] memory executers
+    ) TimelockController(minDelay, proposers, executers) {}
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html new file mode 100644 index 0000000..1f17f81 --- /dev/null +++ b/coverage/lcov-report/contracts/index.html @@ -0,0 +1,132 @@ + + + + Code coverage report for contracts/ + + + + + + + +
+
+

+ all files contracts/ +

+
+
+ 59.09% + Statements + 13/22 +
+
+ 100% + Branches + 2/2 +
+
+ 61.9% + Functions + 13/21 +
+
+ 60.87% + Lines + 14/23 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Box.sol
0%0/3100%0/00%0/20%0/3
GovernanceToken.sol
77.78%7/9100%2/271.43%5/780%8/10
GovernerContract.sol
60%6/10100%0/063.64%7/1160%6/10
TimeLock.sol
100%0/0100%0/0100%1/1100%0/0
+
+
+ + + + + + + diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 0000000..96a7fc1 --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,93 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ / +

+
+
+ 59.09% + Statements + 13/22 +
+
+ 100% + Branches + 2/2 +
+
+ 61.9% + Functions + 13/21 +
+
+ 60.87% + Lines + 14/23 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
contracts/
59.09%13/22100%2/261.9%13/2160.87%14/23
+
+
+ + + + + + + diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..ef51e03 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..b976e1f --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,103 @@ +TN: +SF:/home/furkansezal/dao/contracts/Box.sol +FN:14,store +FN:20,retrieve +FNF:2 +FNH:0 +FNDA:0,store +FNDA:0,retrieve +DA:15,0 +DA:16,0 +DA:21,0 +LF:3 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/furkansezal/dao/contracts/GovernanceToken.sol +FN:16,onlyOwner +FN:23,constructor +FN:29,_afterTokenTransfer +FN:41,_mint +FN:46,mintToken +FN:50,burnToken +FN:54,_burn +FNF:7 +FNH:5 +FNDA:5,onlyOwner +FNDA:3,constructor +FNDA:16,_afterTokenTransfer +FNDA:4,_mint +FNDA:2,mintToken +FNDA:0,burnToken +FNDA:0,_burn +DA:17,5 +DA:18,4 +DA:25,3 +DA:26,3 +DA:34,16 +DA:35,16 +DA:43,4 +DA:47,2 +DA:51,0 +DA:58,0 +LF:10 +LH:8 +BRDA:17,1,0,4 +BRDA:17,1,1,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:/home/furkansezal/dao/contracts/GovernerContract.sol +FN:34,constructor +FN:39,votingDelay +FN:48,votingPeriod +FN:57,quorum +FN:66,state +FN:75,propose +FN:84,proposalThreshold +FN:93,_execute +FN:103,_cancel +FN:112,_executor +FN:121,supportsInterface +FNF:11 +FNH:7 +FNDA:3,constructor +FNDA:1,votingDelay +FNDA:1,votingPeriod +FNDA:1,quorum +FNDA:5,state +FNDA:1,propose +FNDA:1,proposalThreshold +FNDA:0,_execute +FNDA:0,_cancel +FNDA:0,_executor +FNDA:0,supportsInterface +DA:45,1 +DA:54,1 +DA:63,1 +DA:72,5 +DA:81,1 +DA:90,1 +DA:100,0 +DA:109,0 +DA:118,0 +DA:127,0 +LF:10 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/home/furkansezal/dao/contracts/TimeLock.sol +FN:14,constructor +FNF:1 +FNH:1 +FNDA:3,constructor +LF:0 +LH:0 +BRF:0 +BRH:0 +end_of_record diff --git a/coverage/prettify.css b/coverage/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/prettify.js b/coverage/prettify.js new file mode 100644 index 0000000..ef51e03 --- /dev/null +++ b/coverage/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/sort-arrow-sprite.png b/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/deploy/01-deploy-GovernerToken.js b/deploy/01-deploy-GovernerToken.js index a526178..674854b 100644 --- a/deploy/01-deploy-GovernerToken.js +++ b/deploy/01-deploy-GovernerToken.js @@ -12,8 +12,8 @@ module.exports = async ({ getNamedAccounts, deployments }) => { waitConfirmations: network.config.blockConfirmations || 1, }); log(`governanceToken deployed at ${governanceToken.address}`); - await delegate(governanceToken.address, deployer); - console.log(`Delegated!`); + /* await delegate(governanceToken.address, deployer); + console.log(`Delegated!`); */ if ( !developmentChains.includes(network.name) && @@ -23,7 +23,7 @@ module.exports = async ({ getNamedAccounts, deployments }) => { } }; -const delegate = async (governanceTokenAddress, delegatedAccount) => { +/* const delegate = async (governanceTokenAddress, delegatedAccount) => { const governanceToken = await ethers.getContractAt( "GovernanceToken", governanceTokenAddress @@ -33,6 +33,6 @@ const delegate = async (governanceTokenAddress, delegatedAccount) => { console.log( `Checkpoint ${await governanceToken.numCheckpoints(delegatedAccount)}` ); -}; +}; */ module.exports.tags = ["all", "governanceToken"]; diff --git a/deployments/localhost/Box.json b/deployments/localhost/Box.json deleted file mode 100644 index 7aab306..0000000 --- a/deployments/localhost/Box.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "abi": [ - { - "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": "newValue", - "type": "uint256" - } - ], - "name": "ValueChanged", - "type": "event" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "retrieve", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newValue", - "type": "uint256" - } - ], - "name": "store", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xe759be377cccb4d14a49409d0f87a72c7e4dbf9ed206ca3faa53c285962bfab5", - "receipt": { - "to": null, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "transactionIndex": 0, - "gasUsed": "398269", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000010000000010000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7c8f5e00e408d18e9921c8b39d00034ec04075bd2f81eeca0384c6bb96b3ae6c", - "transactionHash": "0xe759be377cccb4d14a49409d0f87a72c7e4dbf9ed206ca3faa53c285962bfab5", - "logs": [ - { - "transactionIndex": 0, - "blockNumber": 8, - "transactionHash": "0xe759be377cccb4d14a49409d0f87a72c7e4dbf9ed206ca3faa53c285962bfab5", - "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ], - "data": "0x", - "logIndex": 0, - "blockHash": "0x7c8f5e00e408d18e9921c8b39d00034ec04075bd2f81eeca0384c6bb96b3ae6c" - } - ], - "blockNumber": 8, - "cumulativeGasUsed": "398269", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "0a567a41a96dc2d81abbf99faae0732b", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"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\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"ValueChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"retrieve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"store\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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/Box.sol\":\"Box\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/Box.sol\":{\"content\":\"// contracts/Box.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract Box is Ownable {\\n uint256 private value;\\n\\n // Emitted when the stored value changes\\n event ValueChanged(uint256 newValue);\\n\\n // Stores a new value in the contract\\n function store(uint256 newValue) public onlyOwner {\\n value = newValue;\\n emit ValueChanged(newValue);\\n }\\n\\n // Reads the last stored value\\n function retrieve() public view returns (uint256) {\\n return value;\\n }\\n}\\n\",\"keccak256\":\"0x40a0d691a6280d5bb9416106951c86399591fd77ea274f1e02b6baa7d68a29af\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6105c38061010d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632e64cec11461005c5780636057361d1461007a578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b6100646100da565b6040516100719190610350565b60405180910390f35b610094600480360381019061008f919061039c565b6100e4565b005b61009e61012d565b005b6100a8610141565b6040516100b5919061040a565b60405180910390f35b6100d860048036038101906100d39190610451565b61016a565b005b6000600154905090565b6100ec6101ed565b806001819055507f93fe6d397c74fdf1402a8b72e47b68512f0510d7b98a4bc4cbdf6ac7108b3c59816040516101229190610350565b60405180910390a150565b6101356101ed565b61013f600061026b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101726101ed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d890610501565b60405180910390fd5b6101ea8161026b565b50565b6101f561032f565b73ffffffffffffffffffffffffffffffffffffffff16610213610141565b73ffffffffffffffffffffffffffffffffffffffff1614610269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609061056d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b600080fd5b61037981610337565b811461038457600080fd5b50565b60008135905061039681610370565b92915050565b6000602082840312156103b2576103b161036b565b5b60006103c084828501610387565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103f4826103c9565b9050919050565b610404816103e9565b82525050565b600060208201905061041f60008301846103fb565b92915050565b61042e816103e9565b811461043957600080fd5b50565b60008135905061044b81610425565b92915050565b6000602082840312156104675761046661036b565b5b60006104758482850161043c565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006104eb60268361047e565b91506104f68261048f565b604082019050919050565b6000602082019050818103600083015261051a816104de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061055760208361047e565b915061056282610521565b602082019050919050565b600060208201905081810360008301526105868161054a565b905091905056fea2646970667358221220934c0892f5e2c6e47639ed174f5093dcdc2264c605fc741014286f50f87e0e5064736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80632e64cec11461005c5780636057361d1461007a578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b6100646100da565b6040516100719190610350565b60405180910390f35b610094600480360381019061008f919061039c565b6100e4565b005b61009e61012d565b005b6100a8610141565b6040516100b5919061040a565b60405180910390f35b6100d860048036038101906100d39190610451565b61016a565b005b6000600154905090565b6100ec6101ed565b806001819055507f93fe6d397c74fdf1402a8b72e47b68512f0510d7b98a4bc4cbdf6ac7108b3c59816040516101229190610350565b60405180910390a150565b6101356101ed565b61013f600061026b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101726101ed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d890610501565b60405180910390fd5b6101ea8161026b565b50565b6101f561032f565b73ffffffffffffffffffffffffffffffffffffffff16610213610141565b73ffffffffffffffffffffffffffffffffffffffff1614610269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609061056d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b600080fd5b61037981610337565b811461038457600080fd5b50565b60008135905061039681610370565b92915050565b6000602082840312156103b2576103b161036b565b5b60006103c084828501610387565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103f4826103c9565b9050919050565b610404816103e9565b82525050565b600060208201905061041f60008301846103fb565b92915050565b61042e816103e9565b811461043957600080fd5b50565b60008135905061044b81610425565b92915050565b6000602082840312156104675761046661036b565b5b60006104758482850161043c565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006104eb60268361047e565b91506104f68261048f565b604082019050919050565b6000602082019050818103600083015261051a816104de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061055760208361047e565b915061056282610521565b602082019050919050565b600060208201905081810360008301526105868161054a565b905091905056fea2646970667358221220934c0892f5e2c6e47639ed174f5093dcdc2264c605fc741014286f50f87e0e5064736f6c63430008110033", - "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": 400, - "contract": "contracts/Box.sol:Box", - "label": "_owner", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 10088, - "contract": "contracts/Box.sol:Box", - "label": "value", - "offset": 0, - "slot": "1", - "type": "t_uint256" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index 78a8eb2..ab5b9e0 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -81,6 +81,31 @@ "name": "DelegateVotesChanged", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "TokenTransfer", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -186,6 +211,24 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -415,6 +458,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mintToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "name", @@ -511,7 +572,7 @@ }, { "inputs": [], - "name": "s_maxSupply", + "name": "s_initialSupply", "outputs": [ { "internalType": "uint256", @@ -602,21 +663,21 @@ "type": "function" } ], - "transactionHash": "0xb8f0de4fcc87e4427b9fe6041bf9561796a975ac1aa775b9965647538cf07a40", + "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "transactionIndex": 0, - "gasUsed": "3321476", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x13ff0dee3da41f58f622201ceed8b866bcbf30486f2ac58f24c25a8c5717b70f", - "transactionHash": "0xb8f0de4fcc87e4427b9fe6041bf9561796a975ac1aa775b9965647538cf07a40", + "gasUsed": "3606454", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000410000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000008000000000020000000000000000000000000200000000000000000000000000000000000000000", + "blockHash": "0xaf7d65fe25227bdb091ad2c35d1992ca4a422bad25fca1e43b96086d2a04809d", + "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", "logs": [ { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0xb8f0de4fcc87e4427b9fe6041bf9561796a975ac1aa775b9965647538cf07a40", + "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", @@ -625,20 +686,34 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 0, - "blockHash": "0x13ff0dee3da41f58f622201ceed8b866bcbf30486f2ac58f24c25a8c5717b70f" + "blockHash": "0xaf7d65fe25227bdb091ad2c35d1992ca4a422bad25fca1e43b96086d2a04809d" + }, + { + "transactionIndex": 0, + "blockNumber": 1, + "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "topics": [ + "0xd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", + "logIndex": 1, + "blockHash": "0xaf7d65fe25227bdb091ad2c35d1992ca4a422bad25fca1e43b96086d2a04809d" } ], "blockNumber": 1, - "cumulativeGasUsed": "3321476", + "cumulativeGasUsed": "3606454", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "0a567a41a96dc2d81abbf99faae0732b", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes {\\n uint256 public s_maxSupply = 1000000000000000000000000;\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n _mint(msg.sender, s_maxSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount) internal override(ERC20Votes) {\\n super._mint(to, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0x08987915caee863c7aa445cf3ca3c8887e57683daca51d0934d8ce4855edb253\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x61014060405269d3c21bcecceda1000000600a553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000dca565b5080600490816200011d919062000dca565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a0818152505062000189818484620001ed60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505050620001e733600a546200022960201b60201c565b620012e8565b600083838346306040516020016200020a95949392919062000f22565b6040516020818303038152906040528051906020012090509392505050565b6200024082826200024460201b62000eaa1760201c565b5050565b6200025b82826200030260201b62000f371760201c565b6200026b6200047a60201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620002996200049e60201b60201c565b1115620002dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d49062001006565b60405180910390fd5b620002fc6009620004a860201b620010961783620004c060201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000374576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036b9062001078565b60405180910390fd5b62000388600083836200077160201b60201c565b80600260008282546200039c9190620010c9565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620003f39190620010c9565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200045a919062001104565b60405180910390a362000476600083836200077660201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b60008183620004b89190620010c9565b905092915050565b60008060008580549050905060008114620005355785600182620004e5919062001121565b81548110620004f957620004f86200115c565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000538565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200056483858760201c565b9150600081118015620005bd5750438660018362000583919062001121565b815481106200059757620005966200115c565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156200065e57620005d9826200079360201b620010ac1760201c565b86600183620005e9919062001121565b81548110620005fd57620005fc6200115c565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000768565b85604051806040016040528062000680436200080160201b620011171760201c565b63ffffffff168152602001620006a1856200079360201b620010ac1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b6200078e8383836200085760201b6200116a1760201c565b505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f09062001201565b60405180910390fd5b819050919050565b600063ffffffff80168211156200084f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008469062001299565b60405180910390fd5b819050919050565b6200086f838383620008a760201b620011951760201c565b620008a26200088484620008ac60201b60201c565b6200089584620008ac60201b60201c565b836200091560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620009525750600081115b1562000b3357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000a4557600080620009ec600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000b3860201b6200119a1785620004c060201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000a3a929190620012bb565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000b325760008062000ad9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620004a860201b620010961785620004c060201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000b27929190620012bb565b60405180910390a250505b5b505050565b6000818362000b48919062001121565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd257607f821691505b60208210810362000be85762000be762000b8a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c13565b62000c5e868362000c13565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cab62000ca562000c9f8462000c76565b62000c80565b62000c76565b9050919050565b6000819050919050565b62000cc78362000c8a565b62000cdf62000cd68262000cb2565b84845462000c20565b825550505050565b600090565b62000cf662000ce7565b62000d0381848462000cbc565b505050565b5b8181101562000d2b5762000d1f60008262000cec565b60018101905062000d09565b5050565b601f82111562000d7a5762000d448162000bee565b62000d4f8462000c03565b8101602085101562000d5f578190505b62000d7762000d6e8562000c03565b83018262000d08565b50505b505050565b600082821c905092915050565b600062000d9f6000198460080262000d7f565b1980831691505092915050565b600062000dba838362000d8c565b9150826002028217905092915050565b62000dd58262000b50565b67ffffffffffffffff81111562000df15762000df062000b5b565b5b62000dfd825462000bb9565b62000e0a82828562000d2f565b600060209050601f83116001811462000e42576000841562000e2d578287015190505b62000e39858262000dac565b86555062000ea9565b601f19841662000e528662000bee565b60005b8281101562000e7c5784890151825560018201915060208501945060208101905062000e55565b8683101562000e9c578489015162000e98601f89168262000d8c565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000ec68162000eb1565b82525050565b62000ed78162000c76565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000f0a8262000edd565b9050919050565b62000f1c8162000efd565b82525050565b600060a08201905062000f39600083018862000ebb565b62000f48602083018762000ebb565b62000f57604083018662000ebb565b62000f66606083018562000ecc565b62000f75608083018462000f11565b9695505050505050565b600082825260208201905092915050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b600062000fee60308362000f7f565b915062000ffb8262000f90565b604082019050919050565b60006020820190508181036000830152620010218162000fdf565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062001060601f8362000f7f565b91506200106d8262001028565b602082019050919050565b60006020820190508181036000830152620010938162001051565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010d68262000c76565b9150620010e38362000c76565b9250828201905080821115620010fe57620010fd6200109a565b5b92915050565b60006020820190506200111b600083018462000ecc565b92915050565b60006200112e8262000c76565b91506200113b8362000c76565b92508282039050818111156200115657620011556200109a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620011e960278362000f7f565b9150620011f6826200118b565b604082019050919050565b600060208201905081810360008301526200121c81620011da565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006200128160268362000f7f565b91506200128e8262001223565b604082019050919050565b60006020820190508181036000830152620012b48162001272565b9050919050565b6000604082019050620012d2600083018562000ecc565b620012e1602083018462000ecc565b9392505050565b60805160a05160c05160e051610100516101205161372362001338600039600061173a0152600061177c0152600061175b01526000611690015260006116e60152600061170f01526137236000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80636fcfff45116100c3578063a457c2d71161007c578063a457c2d714610402578063a9059cbb14610432578063c3cda52014610462578063d505accf1461047e578063dd62ed3e1461049a578063f1127ed8146104ca5761014d565b80636fcfff45146102f457806370a08231146103245780637ecebe00146103545780638e539e8c1461038457806395d89b41146103b45780639ab24eb0146103d25761014d565b80633644e515116101155780633644e5151461020c578063395093511461022a5780633a46b1a81461025a578063587cde1e1461028a5780635c19a95c146102ba5780635d641847146102d65761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a6104fa565b6040516101679190612376565b60405180910390f35b61018a60048036038101906101859190612431565b61058c565b604051610197919061248c565b60405180910390f35b6101a86105af565b6040516101b591906124b6565b60405180910390f35b6101d860048036038101906101d391906124d1565b6105b9565b6040516101e5919061248c565b60405180910390f35b6101f66105e8565b6040516102039190612540565b60405180910390f35b6102146105f1565b6040516102219190612574565b60405180910390f35b610244600480360381019061023f9190612431565b610600565b604051610251919061248c565b60405180910390f35b610274600480360381019061026f9190612431565b610637565b60405161028191906124b6565b60405180910390f35b6102a4600480360381019061029f919061258f565b6106cb565b6040516102b191906125cb565b60405180910390f35b6102d460048036038101906102cf919061258f565b610734565b005b6102de610748565b6040516102eb91906124b6565b60405180910390f35b61030e6004803603810190610309919061258f565b61074e565b60405161031b9190612605565b60405180910390f35b61033e6004803603810190610339919061258f565b6107a2565b60405161034b91906124b6565b60405180910390f35b61036e6004803603810190610369919061258f565b6107ea565b60405161037b91906124b6565b60405180910390f35b61039e60048036038101906103999190612620565b61083a565b6040516103ab91906124b6565b60405180910390f35b6103bc610890565b6040516103c99190612376565b60405180910390f35b6103ec60048036038101906103e7919061258f565b610922565b6040516103f991906124b6565b60405180910390f35b61041c60048036038101906104179190612431565b610a33565b604051610429919061248c565b60405180910390f35b61044c60048036038101906104479190612431565b610aaa565b604051610459919061248c565b60405180910390f35b61047c600480360381019061047791906126a5565b610acd565b005b61049860048036038101906104939190612732565b610bd1565b005b6104b460048036038101906104af91906127d4565b610d13565b6040516104c191906124b6565b60405180910390f35b6104e460048036038101906104df9190612840565b610d9a565b6040516104f191906128f5565b60405180910390f35b6060600380546105099061293f565b80601f01602080910402602001604051908101604052809291908181526020018280546105359061293f565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b6000806105976111b0565b90506105a48185856111b8565b600191505092915050565b6000600254905090565b6000806105c46111b0565b90506105d1858285611381565b6105dc85858561140d565b60019150509392505050565b60006012905090565b60006105fb61168c565b905090565b60008061060b6111b0565b905061062c81858561061d8589610d13565b610627919061299f565b6111b8565b600191505092915050565b600043821061067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067290612a1f565b60405180910390fd5b6106c3600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836117a6565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61074561073f6111b0565b826118b2565b50565b600a5481565b600061079b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611117565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610833600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206119cc565b9050919050565b600043821061087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612a1f565b60405180910390fd5b6108896009836117a6565b9050919050565b60606004805461089f9061293f565b80601f01602080910402602001604051908101604052809291908181526020018280546108cb9061293f565b80156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a0a57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001826109be9190612a3f565b815481106109cf576109ce612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a0d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610a3e6111b0565b90506000610a4c8286610d13565b905083811015610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890612b14565b60405180910390fd5b610a9e82868684036111b8565b60019250505092915050565b600080610ab56111b0565b9050610ac281858561140d565b600191505092915050565b83421115610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790612b80565b60405180910390fd5b6000610b72610b6a7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610b4f9493929190612ba0565b604051602081830303815290604052805190602001206119da565b8585856119f4565b9050610b7d81611a1f565b8614610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590612c31565b60405180910390fd5b610bc881886118b2565b50505050505050565b83421115610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90612c9d565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c438c611a1f565b89604051602001610c5996959493929190612cbd565b6040516020818303038152906040528051906020012090506000610c7c826119da565b90506000610c8c828787876119f4565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390612d6a565b60405180910390fd5b610d078a8a8a6111b8565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610da26122a8565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610df957610df8612a73565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610eb48282610f37565b610ebc611a7d565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610ee26105af565b1115610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90612dfc565b60405180910390fd5b610f31600961109683611aa1565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612e68565b60405180910390fd5b610fb260008383611d19565b8060026000828254610fc4919061299f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611019919061299f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161107e91906124b6565b60405180910390a361109260008383611d1e565b5050565b600081836110a4919061299f565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110690612efa565b60405180910390fd5b819050919050565b600063ffffffff8016821115611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990612f8c565b60405180910390fd5b819050919050565b611175838383611195565b611190611181846106cb565b61118a846106cb565b83611d2e565b505050565b505050565b600081836111a89190612a3f565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e9061301e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906130b0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161137491906124b6565b60405180910390a3505050565b600061138d8484610d13565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461140757818110156113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f09061311c565b60405180910390fd5b61140684848484036111b8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906131ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290613240565b60405180910390fd5b6114f6838383611d19565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561157c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611573906132d2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160f919061299f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167391906124b6565b60405180910390a3611686848484611d1e565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561170857507f000000000000000000000000000000000000000000000000000000000000000046145b15611735577f000000000000000000000000000000000000000000000000000000000000000090506117a3565b6117a07f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611f27565b90505b90565b6000808380549050905060005b818110156118255760006117c78284611f61565b9050848682815481106117dd576117dc612a73565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561180f5780925061181f565b60018161181c919061299f565b91505b506117b3565b60008214611887578460018361183b9190612a3f565b8154811061184c5761184b612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661188a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006118bd836106cb565b905060006118ca846107a2565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46119c6828483611d2e565b50505050565b600081600001549050919050565b60006119ed6119e761168c565b83611f87565b9050919050565b6000806000611a0587878787611fba565b91509150611a12816120c6565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611a6c816119cc565b9150611a7781612292565b50919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611b0f5785600182611ac39190612a3f565b81548110611ad457611ad3612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611b12565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611b4083858763ffffffff16565b9150600081118015611b9357504386600183611b5c9190612a3f565b81548110611b6d57611b6c612a73565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611c2057611ba1826110ac565b86600183611baf9190612a3f565b81548110611bc057611bbf612a73565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611d10565b856040518060400160405280611c3543611117565b63ffffffff168152602001611c49856110ac565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611d2983838361116a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d6a5750600081115b15611f2257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e4857600080611df1600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061119a85611aa1565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611e3d9291906132f2565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f2157600080611eca600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061109685611aa1565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611f169291906132f2565b60405180910390a250505b5b505050565b60008383834630604051602001611f4295949392919061331b565b6040516020818303038152906040528051906020012090509392505050565b60006002828418611f72919061339d565b828416611f7f919061299f565b905092915050565b60008282604051602001611f9c929190613446565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611ff55760006003915091506120bd565b601b8560ff161415801561200d5750601c8560ff1614155b1561201f5760006004915091506120bd565b600060018787878760405160008152602001604052604051612044949392919061347d565b6020604051602081039080840390855afa158015612066573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120b4576000600192509250506120bd565b80600092509250505b94509492505050565b600060048111156120da576120d96134c2565b5b8160048111156120ed576120ec6134c2565b5b031561228f5760016004811115612107576121066134c2565b5b81600481111561211a576121196134c2565b5b0361215a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121519061353d565b60405180910390fd5b6002600481111561216e5761216d6134c2565b5b816004811115612181576121806134c2565b5b036121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b8906135a9565b60405180910390fd5b600360048111156121d5576121d46134c2565b5b8160048111156121e8576121e76134c2565b5b03612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f9061363b565b60405180910390fd5b60048081111561223b5761223a6134c2565b5b81600481111561224e5761224d6134c2565b5b0361228e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612285906136cd565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612320578082015181840152602081019050612305565b60008484015250505050565b6000601f19601f8301169050919050565b6000612348826122e6565b61235281856122f1565b9350612362818560208601612302565b61236b8161232c565b840191505092915050565b60006020820190508181036000830152612390818461233d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c88261239d565b9050919050565b6123d8816123bd565b81146123e357600080fd5b50565b6000813590506123f5816123cf565b92915050565b6000819050919050565b61240e816123fb565b811461241957600080fd5b50565b60008135905061242b81612405565b92915050565b6000806040838503121561244857612447612398565b5b6000612456858286016123e6565b92505060206124678582860161241c565b9150509250929050565b60008115159050919050565b61248681612471565b82525050565b60006020820190506124a1600083018461247d565b92915050565b6124b0816123fb565b82525050565b60006020820190506124cb60008301846124a7565b92915050565b6000806000606084860312156124ea576124e9612398565b5b60006124f8868287016123e6565b9350506020612509868287016123e6565b925050604061251a8682870161241c565b9150509250925092565b600060ff82169050919050565b61253a81612524565b82525050565b60006020820190506125556000830184612531565b92915050565b6000819050919050565b61256e8161255b565b82525050565b60006020820190506125896000830184612565565b92915050565b6000602082840312156125a5576125a4612398565b5b60006125b3848285016123e6565b91505092915050565b6125c5816123bd565b82525050565b60006020820190506125e060008301846125bc565b92915050565b600063ffffffff82169050919050565b6125ff816125e6565b82525050565b600060208201905061261a60008301846125f6565b92915050565b60006020828403121561263657612635612398565b5b60006126448482850161241c565b91505092915050565b61265681612524565b811461266157600080fd5b50565b6000813590506126738161264d565b92915050565b6126828161255b565b811461268d57600080fd5b50565b60008135905061269f81612679565b92915050565b60008060008060008060c087890312156126c2576126c1612398565b5b60006126d089828a016123e6565b96505060206126e189828a0161241c565b95505060406126f289828a0161241c565b945050606061270389828a01612664565b935050608061271489828a01612690565b92505060a061272589828a01612690565b9150509295509295509295565b600080600080600080600060e0888a03121561275157612750612398565b5b600061275f8a828b016123e6565b97505060206127708a828b016123e6565b96505060406127818a828b0161241c565b95505060606127928a828b0161241c565b94505060806127a38a828b01612664565b93505060a06127b48a828b01612690565b92505060c06127c58a828b01612690565b91505092959891949750929550565b600080604083850312156127eb576127ea612398565b5b60006127f9858286016123e6565b925050602061280a858286016123e6565b9150509250929050565b61281d816125e6565b811461282857600080fd5b50565b60008135905061283a81612814565b92915050565b6000806040838503121561285757612856612398565b5b6000612865858286016123e6565b92505060206128768582860161282b565b9150509250929050565b612889816125e6565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6128c08161288f565b82525050565b6040820160008201516128dc6000850182612880565b5060208201516128ef60208501826128b7565b50505050565b600060408201905061290a60008301846128c6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061295757607f821691505b60208210810361296a57612969612910565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006129aa826123fb565b91506129b5836123fb565b92508282019050808211156129cd576129cc612970565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612a09601f836122f1565b9150612a14826129d3565b602082019050919050565b60006020820190508181036000830152612a38816129fc565b9050919050565b6000612a4a826123fb565b9150612a55836123fb565b9250828203905081811115612a6d57612a6c612970565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612afe6025836122f1565b9150612b0982612aa2565b604082019050919050565b60006020820190508181036000830152612b2d81612af1565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612b6a601d836122f1565b9150612b7582612b34565b602082019050919050565b60006020820190508181036000830152612b9981612b5d565b9050919050565b6000608082019050612bb56000830187612565565b612bc260208301866125bc565b612bcf60408301856124a7565b612bdc60608301846124a7565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612c1b6019836122f1565b9150612c2682612be5565b602082019050919050565b60006020820190508181036000830152612c4a81612c0e565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612c87601d836122f1565b9150612c9282612c51565b602082019050919050565b60006020820190508181036000830152612cb681612c7a565b9050919050565b600060c082019050612cd26000830189612565565b612cdf60208301886125bc565b612cec60408301876125bc565b612cf960608301866124a7565b612d0660808301856124a7565b612d1360a08301846124a7565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612d54601e836122f1565b9150612d5f82612d1e565b602082019050919050565b60006020820190508181036000830152612d8381612d47565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000612de66030836122f1565b9150612df182612d8a565b604082019050919050565b60006020820190508181036000830152612e1581612dd9565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612e52601f836122f1565b9150612e5d82612e1c565b602082019050919050565b60006020820190508181036000830152612e8181612e45565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000612ee46027836122f1565b9150612eef82612e88565b604082019050919050565b60006020820190508181036000830152612f1381612ed7565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000612f766026836122f1565b9150612f8182612f1a565b604082019050919050565b60006020820190508181036000830152612fa581612f69565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006130086024836122f1565b915061301382612fac565b604082019050919050565b6000602082019050818103600083015261303781612ffb565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061309a6022836122f1565b91506130a58261303e565b604082019050919050565b600060208201905081810360008301526130c98161308d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613106601d836122f1565b9150613111826130d0565b602082019050919050565b60006020820190508181036000830152613135816130f9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131986025836122f1565b91506131a38261313c565b604082019050919050565b600060208201905081810360008301526131c78161318b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061322a6023836122f1565b9150613235826131ce565b604082019050919050565b600060208201905081810360008301526132598161321d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006132bc6026836122f1565b91506132c782613260565b604082019050919050565b600060208201905081810360008301526132eb816132af565b9050919050565b600060408201905061330760008301856124a7565b61331460208301846124a7565b9392505050565b600060a0820190506133306000830188612565565b61333d6020830187612565565b61334a6040830186612565565b61335760608301856124a7565b61336460808301846125bc565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133a8826123fb565b91506133b3836123fb565b9250826133c3576133c261336e565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061340f6002836133ce565b915061341a826133d9565b600282019050919050565b6000819050919050565b61344061343b8261255b565b613425565b82525050565b600061345182613402565b915061345d828561342f565b60208201915061346d828461342f565b6020820191508190509392505050565b60006080820190506134926000830187612565565b61349f6020830186612531565b6134ac6040830185612565565b6134b96060830184612565565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006135276018836122f1565b9150613532826134f1565b602082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613593601f836122f1565b915061359e8261355d565b602082019050919050565b600060208201905081810360008301526135c281613586565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006136256022836122f1565b9150613630826135c9565b604082019050919050565b6000602082019050818103600083015261365481613618565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b76022836122f1565b91506136c28261365b565b604082019050919050565b600060208201905081810360008301526136e6816136aa565b905091905056fea2646970667358221220a4e67c94e67bdf69a40e485f7d3b1c2a087478f314230704056ca9b1d7c83f5f64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80636fcfff45116100c3578063a457c2d71161007c578063a457c2d714610402578063a9059cbb14610432578063c3cda52014610462578063d505accf1461047e578063dd62ed3e1461049a578063f1127ed8146104ca5761014d565b80636fcfff45146102f457806370a08231146103245780637ecebe00146103545780638e539e8c1461038457806395d89b41146103b45780639ab24eb0146103d25761014d565b80633644e515116101155780633644e5151461020c578063395093511461022a5780633a46b1a81461025a578063587cde1e1461028a5780635c19a95c146102ba5780635d641847146102d65761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a6104fa565b6040516101679190612376565b60405180910390f35b61018a60048036038101906101859190612431565b61058c565b604051610197919061248c565b60405180910390f35b6101a86105af565b6040516101b591906124b6565b60405180910390f35b6101d860048036038101906101d391906124d1565b6105b9565b6040516101e5919061248c565b60405180910390f35b6101f66105e8565b6040516102039190612540565b60405180910390f35b6102146105f1565b6040516102219190612574565b60405180910390f35b610244600480360381019061023f9190612431565b610600565b604051610251919061248c565b60405180910390f35b610274600480360381019061026f9190612431565b610637565b60405161028191906124b6565b60405180910390f35b6102a4600480360381019061029f919061258f565b6106cb565b6040516102b191906125cb565b60405180910390f35b6102d460048036038101906102cf919061258f565b610734565b005b6102de610748565b6040516102eb91906124b6565b60405180910390f35b61030e6004803603810190610309919061258f565b61074e565b60405161031b9190612605565b60405180910390f35b61033e6004803603810190610339919061258f565b6107a2565b60405161034b91906124b6565b60405180910390f35b61036e6004803603810190610369919061258f565b6107ea565b60405161037b91906124b6565b60405180910390f35b61039e60048036038101906103999190612620565b61083a565b6040516103ab91906124b6565b60405180910390f35b6103bc610890565b6040516103c99190612376565b60405180910390f35b6103ec60048036038101906103e7919061258f565b610922565b6040516103f991906124b6565b60405180910390f35b61041c60048036038101906104179190612431565b610a33565b604051610429919061248c565b60405180910390f35b61044c60048036038101906104479190612431565b610aaa565b604051610459919061248c565b60405180910390f35b61047c600480360381019061047791906126a5565b610acd565b005b61049860048036038101906104939190612732565b610bd1565b005b6104b460048036038101906104af91906127d4565b610d13565b6040516104c191906124b6565b60405180910390f35b6104e460048036038101906104df9190612840565b610d9a565b6040516104f191906128f5565b60405180910390f35b6060600380546105099061293f565b80601f01602080910402602001604051908101604052809291908181526020018280546105359061293f565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b6000806105976111b0565b90506105a48185856111b8565b600191505092915050565b6000600254905090565b6000806105c46111b0565b90506105d1858285611381565b6105dc85858561140d565b60019150509392505050565b60006012905090565b60006105fb61168c565b905090565b60008061060b6111b0565b905061062c81858561061d8589610d13565b610627919061299f565b6111b8565b600191505092915050565b600043821061067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067290612a1f565b60405180910390fd5b6106c3600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836117a6565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61074561073f6111b0565b826118b2565b50565b600a5481565b600061079b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611117565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610833600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206119cc565b9050919050565b600043821061087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590612a1f565b60405180910390fd5b6108896009836117a6565b9050919050565b60606004805461089f9061293f565b80601f01602080910402602001604051908101604052809291908181526020018280546108cb9061293f565b80156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a0a57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001826109be9190612a3f565b815481106109cf576109ce612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a0d565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610a3e6111b0565b90506000610a4c8286610d13565b905083811015610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890612b14565b60405180910390fd5b610a9e82868684036111b8565b60019250505092915050565b600080610ab56111b0565b9050610ac281858561140d565b600191505092915050565b83421115610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790612b80565b60405180910390fd5b6000610b72610b6a7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610b4f9493929190612ba0565b604051602081830303815290604052805190602001206119da565b8585856119f4565b9050610b7d81611a1f565b8614610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590612c31565b60405180910390fd5b610bc881886118b2565b50505050505050565b83421115610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90612c9d565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c438c611a1f565b89604051602001610c5996959493929190612cbd565b6040516020818303038152906040528051906020012090506000610c7c826119da565b90506000610c8c828787876119f4565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390612d6a565b60405180910390fd5b610d078a8a8a6111b8565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610da26122a8565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610df957610df8612a73565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610eb48282610f37565b610ebc611a7d565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610ee26105af565b1115610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90612dfc565b60405180910390fd5b610f31600961109683611aa1565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612e68565b60405180910390fd5b610fb260008383611d19565b8060026000828254610fc4919061299f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611019919061299f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161107e91906124b6565b60405180910390a361109260008383611d1e565b5050565b600081836110a4919061299f565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111561110f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110690612efa565b60405180910390fd5b819050919050565b600063ffffffff8016821115611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990612f8c565b60405180910390fd5b819050919050565b611175838383611195565b611190611181846106cb565b61118a846106cb565b83611d2e565b505050565b505050565b600081836111a89190612a3f565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e9061301e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906130b0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161137491906124b6565b60405180910390a3505050565b600061138d8484610d13565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461140757818110156113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f09061311c565b60405180910390fd5b61140684848484036111b8565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906131ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290613240565b60405180910390fd5b6114f6838383611d19565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561157c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611573906132d2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160f919061299f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167391906124b6565b60405180910390a3611686848484611d1e565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561170857507f000000000000000000000000000000000000000000000000000000000000000046145b15611735577f000000000000000000000000000000000000000000000000000000000000000090506117a3565b6117a07f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611f27565b90505b90565b6000808380549050905060005b818110156118255760006117c78284611f61565b9050848682815481106117dd576117dc612a73565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561180f5780925061181f565b60018161181c919061299f565b91505b506117b3565b60008214611887578460018361183b9190612a3f565b8154811061184c5761184b612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661188a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006118bd836106cb565b905060006118ca846107a2565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46119c6828483611d2e565b50505050565b600081600001549050919050565b60006119ed6119e761168c565b83611f87565b9050919050565b6000806000611a0587878787611fba565b91509150611a12816120c6565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611a6c816119cc565b9150611a7781612292565b50919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611b0f5785600182611ac39190612a3f565b81548110611ad457611ad3612a73565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611b12565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611b4083858763ffffffff16565b9150600081118015611b9357504386600183611b5c9190612a3f565b81548110611b6d57611b6c612a73565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611c2057611ba1826110ac565b86600183611baf9190612a3f565b81548110611bc057611bbf612a73565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611d10565b856040518060400160405280611c3543611117565b63ffffffff168152602001611c49856110ac565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611d2983838361116a565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611d6a5750600081115b15611f2257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e4857600080611df1600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061119a85611aa1565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611e3d9291906132f2565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f2157600080611eca600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061109685611aa1565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611f169291906132f2565b60405180910390a250505b5b505050565b60008383834630604051602001611f4295949392919061331b565b6040516020818303038152906040528051906020012090509392505050565b60006002828418611f72919061339d565b828416611f7f919061299f565b905092915050565b60008282604051602001611f9c929190613446565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611ff55760006003915091506120bd565b601b8560ff161415801561200d5750601c8560ff1614155b1561201f5760006004915091506120bd565b600060018787878760405160008152602001604052604051612044949392919061347d565b6020604051602081039080840390855afa158015612066573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120b4576000600192509250506120bd565b80600092509250505b94509492505050565b600060048111156120da576120d96134c2565b5b8160048111156120ed576120ec6134c2565b5b031561228f5760016004811115612107576121066134c2565b5b81600481111561211a576121196134c2565b5b0361215a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121519061353d565b60405180910390fd5b6002600481111561216e5761216d6134c2565b5b816004811115612181576121806134c2565b5b036121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b8906135a9565b60405180910390fd5b600360048111156121d5576121d46134c2565b5b8160048111156121e8576121e76134c2565b5b03612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f9061363b565b60405180910390fd5b60048081111561223b5761223a6134c2565b5b81600481111561224e5761224d6134c2565b5b0361228e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612285906136cd565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612320578082015181840152602081019050612305565b60008484015250505050565b6000601f19601f8301169050919050565b6000612348826122e6565b61235281856122f1565b9350612362818560208601612302565b61236b8161232c565b840191505092915050565b60006020820190508181036000830152612390818461233d565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c88261239d565b9050919050565b6123d8816123bd565b81146123e357600080fd5b50565b6000813590506123f5816123cf565b92915050565b6000819050919050565b61240e816123fb565b811461241957600080fd5b50565b60008135905061242b81612405565b92915050565b6000806040838503121561244857612447612398565b5b6000612456858286016123e6565b92505060206124678582860161241c565b9150509250929050565b60008115159050919050565b61248681612471565b82525050565b60006020820190506124a1600083018461247d565b92915050565b6124b0816123fb565b82525050565b60006020820190506124cb60008301846124a7565b92915050565b6000806000606084860312156124ea576124e9612398565b5b60006124f8868287016123e6565b9350506020612509868287016123e6565b925050604061251a8682870161241c565b9150509250925092565b600060ff82169050919050565b61253a81612524565b82525050565b60006020820190506125556000830184612531565b92915050565b6000819050919050565b61256e8161255b565b82525050565b60006020820190506125896000830184612565565b92915050565b6000602082840312156125a5576125a4612398565b5b60006125b3848285016123e6565b91505092915050565b6125c5816123bd565b82525050565b60006020820190506125e060008301846125bc565b92915050565b600063ffffffff82169050919050565b6125ff816125e6565b82525050565b600060208201905061261a60008301846125f6565b92915050565b60006020828403121561263657612635612398565b5b60006126448482850161241c565b91505092915050565b61265681612524565b811461266157600080fd5b50565b6000813590506126738161264d565b92915050565b6126828161255b565b811461268d57600080fd5b50565b60008135905061269f81612679565b92915050565b60008060008060008060c087890312156126c2576126c1612398565b5b60006126d089828a016123e6565b96505060206126e189828a0161241c565b95505060406126f289828a0161241c565b945050606061270389828a01612664565b935050608061271489828a01612690565b92505060a061272589828a01612690565b9150509295509295509295565b600080600080600080600060e0888a03121561275157612750612398565b5b600061275f8a828b016123e6565b97505060206127708a828b016123e6565b96505060406127818a828b0161241c565b95505060606127928a828b0161241c565b94505060806127a38a828b01612664565b93505060a06127b48a828b01612690565b92505060c06127c58a828b01612690565b91505092959891949750929550565b600080604083850312156127eb576127ea612398565b5b60006127f9858286016123e6565b925050602061280a858286016123e6565b9150509250929050565b61281d816125e6565b811461282857600080fd5b50565b60008135905061283a81612814565b92915050565b6000806040838503121561285757612856612398565b5b6000612865858286016123e6565b92505060206128768582860161282b565b9150509250929050565b612889816125e6565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6128c08161288f565b82525050565b6040820160008201516128dc6000850182612880565b5060208201516128ef60208501826128b7565b50505050565b600060408201905061290a60008301846128c6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061295757607f821691505b60208210810361296a57612969612910565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006129aa826123fb565b91506129b5836123fb565b92508282019050808211156129cd576129cc612970565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612a09601f836122f1565b9150612a14826129d3565b602082019050919050565b60006020820190508181036000830152612a38816129fc565b9050919050565b6000612a4a826123fb565b9150612a55836123fb565b9250828203905081811115612a6d57612a6c612970565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612afe6025836122f1565b9150612b0982612aa2565b604082019050919050565b60006020820190508181036000830152612b2d81612af1565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612b6a601d836122f1565b9150612b7582612b34565b602082019050919050565b60006020820190508181036000830152612b9981612b5d565b9050919050565b6000608082019050612bb56000830187612565565b612bc260208301866125bc565b612bcf60408301856124a7565b612bdc60608301846124a7565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612c1b6019836122f1565b9150612c2682612be5565b602082019050919050565b60006020820190508181036000830152612c4a81612c0e565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612c87601d836122f1565b9150612c9282612c51565b602082019050919050565b60006020820190508181036000830152612cb681612c7a565b9050919050565b600060c082019050612cd26000830189612565565b612cdf60208301886125bc565b612cec60408301876125bc565b612cf960608301866124a7565b612d0660808301856124a7565b612d1360a08301846124a7565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612d54601e836122f1565b9150612d5f82612d1e565b602082019050919050565b60006020820190508181036000830152612d8381612d47565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000612de66030836122f1565b9150612df182612d8a565b604082019050919050565b60006020820190508181036000830152612e1581612dd9565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000612e52601f836122f1565b9150612e5d82612e1c565b602082019050919050565b60006020820190508181036000830152612e8181612e45565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000612ee46027836122f1565b9150612eef82612e88565b604082019050919050565b60006020820190508181036000830152612f1381612ed7565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000612f766026836122f1565b9150612f8182612f1a565b604082019050919050565b60006020820190508181036000830152612fa581612f69565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006130086024836122f1565b915061301382612fac565b604082019050919050565b6000602082019050818103600083015261303781612ffb565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061309a6022836122f1565b91506130a58261303e565b604082019050919050565b600060208201905081810360008301526130c98161308d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613106601d836122f1565b9150613111826130d0565b602082019050919050565b60006020820190508181036000830152613135816130f9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131986025836122f1565b91506131a38261313c565b604082019050919050565b600060208201905081810360008301526131c78161318b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061322a6023836122f1565b9150613235826131ce565b604082019050919050565b600060208201905081810360008301526132598161321d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006132bc6026836122f1565b91506132c782613260565b604082019050919050565b600060208201905081810360008301526132eb816132af565b9050919050565b600060408201905061330760008301856124a7565b61331460208301846124a7565b9392505050565b600060a0820190506133306000830188612565565b61333d6020830187612565565b61334a6040830186612565565b61335760608301856124a7565b61336460808301846125bc565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133a8826123fb565b91506133b3836123fb565b9250826133c3576133c261336e565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061340f6002836133ce565b915061341a826133d9565b600282019050919050565b6000819050919050565b61344061343b8261255b565b613425565b82525050565b600061345182613402565b915061345d828561342f565b60208201915061346d828461342f565b6020820191508190509392505050565b60006080820190506134926000830187612565565b61349f6020830186612531565b6134ac6040830185612565565b6134b96060830184612565565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006135276018836122f1565b9150613532826134f1565b602082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613593601f836122f1565b915061359e8261355d565b602082019050919050565b600060208201905081810360008301526135c281613586565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006136256022836122f1565b9150613630826135c9565b604082019050919050565b6000602082019050818103600083015261365481613618565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b76022836122f1565b91506136c28261365b565b604082019050919050565b600060208201905081810360008301526136e6816136aa565b905091905056fea2646970667358221220a4e67c94e67bdf69a40e485f7d3b1c2a087478f314230704056ca9b1d7c83f5f64736f6c63430008110033", + "solcInputHash": "1fbca7b8c0c69581356fdb74c6edaebf", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_initialSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes {\\n uint256 public s_initialSupply = 1000000e18;\\n address private immutable i_owner;\\n\\n event TokenTransfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n modifier onlyOwner() {\\n require(i_owner == msg.sender, \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n i_owner = msg.sender;\\n _mint(msg.sender, s_initialSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n emit TokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount)\\n internal\\n override(ERC20Votes)\\n onlyOwner\\n {\\n super._mint(to, amount);\\n }\\n\\n function mintToken(address to, uint256 amount) external {\\n _mint(to, amount);\\n }\\n\\n function burnToken(address account, uint256 amount) external {\\n _burn(account, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0x50615b1158220c5c6d5ac9ebf9507f9f4ea531e0ef593c65b50ebc91a9eaf1ff\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x61016060405269d3c21bcecceda1000000600a553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000eda565b5080600490816200011d919062000eda565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001898184846200022260201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050503373ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff16815250506200021c33600a546200025e60201b60201c565b6200146a565b600083838346306040516020016200023f95949392919062001032565b6040516020818303038152906040528051906020012090509392505050565b3373ffffffffffffffffffffffffffffffffffffffff166101405173ffffffffffffffffffffffffffffffffffffffff1614620002d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c990620010f0565b60405180910390fd5b620002e98282620002ed60201b62000f241760201c565b5050565b620003048282620003ab60201b62000fb11760201c565b620003146200052360201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620003426200054760201b60201c565b111562000386576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037d9062001188565b60405180910390fd5b620003a560096200055160201b6200111017836200056960201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200041d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041490620011fa565b60405180910390fd5b62000431600083836200081a60201b60201c565b80600260008282546200044591906200124b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200049c91906200124b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000503919062001286565b60405180910390a36200051f600083836200081f60201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b600081836200056191906200124b565b905092915050565b60008060008580549050905060008114620005de57856001826200058e9190620012a3565b81548110620005a257620005a1620012de565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620005e1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200060d83858760201c565b915060008111801562000666575043866001836200062c9190620012a3565b8154811062000640576200063f620012de565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1562000707576200068282620008a360201b620011261760201c565b86600183620006929190620012a3565b81548110620006a657620006a5620012de565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000811565b85604051806040016040528062000729436200091160201b620011911760201c565b63ffffffff1681526020016200074a85620008a360201b620011261760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b620008378383836200096760201b620011e41760201c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de68360405162000896919062001286565b60405180910390a3505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000909576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009009062001383565b60405180910390fd5b819050919050565b600063ffffffff80168211156200095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000956906200141b565b60405180910390fd5b819050919050565b6200097f838383620009b760201b6200120f1760201c565b620009b26200099484620009bc60201b60201c565b620009a584620009bc60201b60201c565b8362000a2560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000a625750600081115b1562000c4357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000b555760008062000afc600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000c4860201b6200121417856200056960201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000b4a9291906200143d565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000c425760008062000be9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200055160201b6200111017856200056960201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c379291906200143d565b60405180910390a250505b5b505050565b6000818362000c589190620012a3565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ce257607f821691505b60208210810362000cf85762000cf762000c9a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000d627fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d23565b62000d6e868362000d23565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000dbb62000db562000daf8462000d86565b62000d90565b62000d86565b9050919050565b6000819050919050565b62000dd78362000d9a565b62000def62000de68262000dc2565b84845462000d30565b825550505050565b600090565b62000e0662000df7565b62000e1381848462000dcc565b505050565b5b8181101562000e3b5762000e2f60008262000dfc565b60018101905062000e19565b5050565b601f82111562000e8a5762000e548162000cfe565b62000e5f8462000d13565b8101602085101562000e6f578190505b62000e8762000e7e8562000d13565b83018262000e18565b50505b505050565b600082821c905092915050565b600062000eaf6000198460080262000e8f565b1980831691505092915050565b600062000eca838362000e9c565b9150826002028217905092915050565b62000ee58262000c60565b67ffffffffffffffff81111562000f015762000f0062000c6b565b5b62000f0d825462000cc9565b62000f1a82828562000e3f565b600060209050601f83116001811462000f52576000841562000f3d578287015190505b62000f49858262000ebc565b86555062000fb9565b601f19841662000f628662000cfe565b60005b8281101562000f8c5784890151825560018201915060208501945060208101905062000f65565b8683101562000fac578489015162000fa8601f89168262000e9c565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000fd68162000fc1565b82525050565b62000fe78162000d86565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200101a8262000fed565b9050919050565b6200102c816200100d565b82525050565b600060a08201905062001049600083018862000fcb565b62001058602083018762000fcb565b62001067604083018662000fcb565b62001076606083018562000fdc565b62001085608083018462001021565b9695505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620010d86020836200108f565b9150620010e582620010a0565b602082019050919050565b600060208201905081810360008301526200110b81620010c9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000620011706030836200108f565b91506200117d8262001112565b604082019050919050565b60006020820190508181036000830152620011a38162001161565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620011e2601f836200108f565b9150620011ef82620011aa565b602082019050919050565b600060208201905081810360008301526200121581620011d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620012588262000d86565b9150620012658362000d86565b925082820190508082111562001280576200127f6200121c565b5b92915050565b60006020820190506200129d600083018462000fdc565b92915050565b6000620012b08262000d86565b9150620012bd8362000d86565b9250828203905081811115620012d857620012d76200121c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200136b6027836200108f565b915062001378826200130d565b604082019050919050565b600060208201905081810360008301526200139e816200135c565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620014036026836200108f565b91506200141082620013a5565b604082019050919050565b600060208201905081810360008301526200143681620013f4565b9050919050565b600060408201905062001454600083018562000fdc565b62001463602083018462000fdc565b9392505050565b60805160a05160c05160e051610100516101205161014051613c30620014c56000396000611a5f015260006117b4015260006117f6015260006117d50152600061170a01526000611760015260006117890152613c306000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a457c2d711610097578063d1df306c11610071578063d1df306c146104c0578063d505accf146104dc578063dd62ed3e146104f8578063f1127ed81461052857610173565b8063a457c2d714610444578063a9059cbb14610474578063c3cda520146104a457610173565b806370a082311461034a57806379c650681461037a5780637ecebe00146103965780638e539e8c146103c657806395d89b41146103f65780639ab24eb01461041457610173565b80633644e515116101305780633644e51514610250578063395093511461026e5780633a46b1a81461029e578063587cde1e146102ce5780635c19a95c146102fe5780636fcfff451461031a57610173565b806306fdde0314610178578063095ea7b314610196578063096b34cf146101c657806318160ddd146101e457806323b872dd14610202578063313ce56714610232575b600080fd5b610180610558565b60405161018d91906126f3565b60405180910390f35b6101b060048036038101906101ab91906127ae565b6105ea565b6040516101bd9190612809565b60405180910390f35b6101ce61060d565b6040516101db9190612833565b60405180910390f35b6101ec610613565b6040516101f99190612833565b60405180910390f35b61021c6004803603810190610217919061284e565b61061d565b6040516102299190612809565b60405180910390f35b61023a61064c565b60405161024791906128bd565b60405180910390f35b610258610655565b60405161026591906128f1565b60405180910390f35b610288600480360381019061028391906127ae565b610664565b6040516102959190612809565b60405180910390f35b6102b860048036038101906102b391906127ae565b61069b565b6040516102c59190612833565b60405180910390f35b6102e860048036038101906102e3919061290c565b61072f565b6040516102f59190612948565b60405180910390f35b6103186004803603810190610313919061290c565b610798565b005b610334600480360381019061032f919061290c565b6107ac565b6040516103419190612982565b60405180910390f35b610364600480360381019061035f919061290c565b610800565b6040516103719190612833565b60405180910390f35b610394600480360381019061038f91906127ae565b610848565b005b6103b060048036038101906103ab919061290c565b610856565b6040516103bd9190612833565b60405180910390f35b6103e060048036038101906103db919061299d565b6108a6565b6040516103ed9190612833565b60405180910390f35b6103fe6108fc565b60405161040b91906126f3565b60405180910390f35b61042e6004803603810190610429919061290c565b61098e565b60405161043b9190612833565b60405180910390f35b61045e600480360381019061045991906127ae565b610a9f565b60405161046b9190612809565b60405180910390f35b61048e600480360381019061048991906127ae565b610b16565b60405161049b9190612809565b60405180910390f35b6104be60048036038101906104b99190612a22565b610b39565b005b6104da60048036038101906104d591906127ae565b610c3d565b005b6104f660048036038101906104f19190612aaf565b610c4b565b005b610512600480360381019061050d9190612b51565b610d8d565b60405161051f9190612833565b60405180910390f35b610542600480360381019061053d9190612bbd565b610e14565b60405161054f9190612c72565b60405180910390f35b60606003805461056790612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461059390612cbc565b80156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b5050505050905090565b6000806105f561122a565b9050610602818585611232565b600191505092915050565b600a5481565b6000600254905090565b60008061062861122a565b90506106358582856113fb565b610640858585611487565b60019150509392505050565b60006012905090565b600061065f611706565b905090565b60008061066f61122a565b90506106908185856106818589610d8d565b61068b9190612d1c565b611232565b600191505092915050565b60004382106106df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d690612d9c565b60405180910390fd5b610727600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611820565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6107a96107a361122a565b8261192c565b50565b60006107f9600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611191565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108528282611a46565b5050565b600061089f600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ae2565b9050919050565b60004382106108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190612d9c565b60405180910390fd5b6108f5600983611820565b9050919050565b60606004805461090b90612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461093790612cbc565b80156109845780601f1061095957610100808354040283529160200191610984565b820191906000526020600020905b81548152906001019060200180831161096757829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a7657600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610a2a9190612dbc565b81548110610a3b57610a3a612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a79565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610aaa61122a565b90506000610ab88286610d8d565b905083811015610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af490612e91565b60405180910390fd5b610b0a8286868403611232565b60019250505092915050565b600080610b2161122a565b9050610b2e818585611487565b600191505092915050565b83421115610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612efd565b60405180910390fd5b6000610bde610bd67fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610bbb9493929190612f1d565b60405160208183030381529060405280519060200120611af0565b858585611b0a565b9050610be981611b35565b8614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190612fae565b60405180910390fd5b610c34818861192c565b50505050505050565b610c478282611b93565b5050565b83421115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c859061301a565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610cbd8c611b35565b89604051602001610cd39695949392919061303a565b6040516020818303038152906040528051906020012090506000610cf682611af0565b90506000610d0682878787611b0a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906130e7565b60405180910390fd5b610d818a8a8a611232565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e1c612625565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610e7357610e72612df0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610f2e8282610fb1565b610f36611ba1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f5c610613565b1115610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613179565b60405180910390fd5b610fab600961111083611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611017906131e5565b60405180910390fd5b61102c60008383611e3d565b806002600082825461103e9190612d1c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110939190612d1c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110f89190612833565b60405180910390a361110c60008383611e42565b5050565b6000818361111e9190612d1c565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613277565b60405180910390fd5b819050919050565b600063ffffffff80168211156111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613309565b60405180910390fd5b819050919050565b6111ef83838361120f565b61120a6111fb8461072f565b6112048461072f565b83611eb7565b505050565b505050565b600081836112229190612dbc565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112989061339b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061342d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113ee9190612833565b60405180910390a3505050565b60006114078484610d8d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114815781811015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613499565b60405180910390fd5b6114808484848403611232565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed9061352b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c906135bd565b60405180910390fd5b611570838383611e3d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed9061364f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116899190612d1c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116ed9190612833565b60405180910390a3611700848484611e42565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561178257507f000000000000000000000000000000000000000000000000000000000000000046145b156117af577f0000000000000000000000000000000000000000000000000000000000000000905061181d565b61181a7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006120b0565b90505b90565b6000808380549050905060005b8181101561189f57600061184182846120ea565b90508486828154811061185757611856612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561188957809250611899565b6001816118969190612d1c565b91505b5061182d565b6000821461190157846001836118b59190612dbc565b815481106118c6576118c5612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611904565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006119378361072f565b9050600061194484610800565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611a40828483611eb7565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb906136bb565b60405180910390fd5b611ade8282610f24565b5050565b600081600001549050919050565b6000611b03611afd611706565b83612110565b9050919050565b6000806000611b1b87878787612143565b91509150611b288161224f565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b8281611ae2565b9150611b8d8161241b565b50919050565b611b9d8282612431565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611c335785600182611be79190612dbc565b81548110611bf857611bf7612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c36565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611c6483858763ffffffff16565b9150600081118015611cb757504386600183611c809190612dbc565b81548110611c9157611c90612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611d4457611cc582611126565b86600183611cd39190612dbc565b81548110611ce457611ce3612df0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611e34565b856040518060400160405280611d5943611191565b63ffffffff168152602001611d6d85611126565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611e4d8383836111e4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051611eaa9190612833565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ef35750600081115b156120ab57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fd157600080611f7a600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061121485611bc5565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611fc69291906136db565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120aa57600080612053600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061111085611bc5565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161209f9291906136db565b60405180910390a250505b5b505050565b600083838346306040516020016120cb959493929190613704565b6040516020818303038152906040528051906020012090509392505050565b600060028284186120fb9190613786565b8284166121089190612d1c565b905092915050565b6000828260405160200161212592919061382f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561217e576000600391509150612246565b601b8560ff16141580156121965750601c8560ff1614155b156121a8576000600491509150612246565b6000600187878787604051600081526020016040526040516121cd9493929190613866565b6020604051602081039080840390855afa1580156121ef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223d57600060019250925050612246565b80600092509250505b94509492505050565b60006004811115612263576122626138ab565b5b816004811115612276576122756138ab565b5b031561241857600160048111156122905761228f6138ab565b5b8160048111156122a3576122a26138ab565b5b036122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613926565b60405180910390fd5b600260048111156122f7576122f66138ab565b5b81600481111561230a576123096138ab565b5b0361234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190613992565b60405180910390fd5b6003600481111561235e5761235d6138ab565b5b816004811115612371576123706138ab565b5b036123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890613a24565b60405180910390fd5b6004808111156123c4576123c36138ab565b5b8160048111156123d7576123d66138ab565b5b03612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90613ab6565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61243b828261244f565b612449600961121483611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590613b48565b60405180910390fd5b6124ca82600083611e3d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254790613bda565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546125a79190612dbc565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161260c9190612833565b60405180910390a361262083600084611e42565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561269d578082015181840152602081019050612682565b60008484015250505050565b6000601f19601f8301169050919050565b60006126c582612663565b6126cf818561266e565b93506126df81856020860161267f565b6126e8816126a9565b840191505092915050565b6000602082019050818103600083015261270d81846126ba565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127458261271a565b9050919050565b6127558161273a565b811461276057600080fd5b50565b6000813590506127728161274c565b92915050565b6000819050919050565b61278b81612778565b811461279657600080fd5b50565b6000813590506127a881612782565b92915050565b600080604083850312156127c5576127c4612715565b5b60006127d385828601612763565b92505060206127e485828601612799565b9150509250929050565b60008115159050919050565b612803816127ee565b82525050565b600060208201905061281e60008301846127fa565b92915050565b61282d81612778565b82525050565b60006020820190506128486000830184612824565b92915050565b60008060006060848603121561286757612866612715565b5b600061287586828701612763565b935050602061288686828701612763565b925050604061289786828701612799565b9150509250925092565b600060ff82169050919050565b6128b7816128a1565b82525050565b60006020820190506128d260008301846128ae565b92915050565b6000819050919050565b6128eb816128d8565b82525050565b600060208201905061290660008301846128e2565b92915050565b60006020828403121561292257612921612715565b5b600061293084828501612763565b91505092915050565b6129428161273a565b82525050565b600060208201905061295d6000830184612939565b92915050565b600063ffffffff82169050919050565b61297c81612963565b82525050565b60006020820190506129976000830184612973565b92915050565b6000602082840312156129b3576129b2612715565b5b60006129c184828501612799565b91505092915050565b6129d3816128a1565b81146129de57600080fd5b50565b6000813590506129f0816129ca565b92915050565b6129ff816128d8565b8114612a0a57600080fd5b50565b600081359050612a1c816129f6565b92915050565b60008060008060008060c08789031215612a3f57612a3e612715565b5b6000612a4d89828a01612763565b9650506020612a5e89828a01612799565b9550506040612a6f89828a01612799565b9450506060612a8089828a016129e1565b9350506080612a9189828a01612a0d565b92505060a0612aa289828a01612a0d565b9150509295509295509295565b600080600080600080600060e0888a031215612ace57612acd612715565b5b6000612adc8a828b01612763565b9750506020612aed8a828b01612763565b9650506040612afe8a828b01612799565b9550506060612b0f8a828b01612799565b9450506080612b208a828b016129e1565b93505060a0612b318a828b01612a0d565b92505060c0612b428a828b01612a0d565b91505092959891949750929550565b60008060408385031215612b6857612b67612715565b5b6000612b7685828601612763565b9250506020612b8785828601612763565b9150509250929050565b612b9a81612963565b8114612ba557600080fd5b50565b600081359050612bb781612b91565b92915050565b60008060408385031215612bd457612bd3612715565b5b6000612be285828601612763565b9250506020612bf385828601612ba8565b9150509250929050565b612c0681612963565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612c3d81612c0c565b82525050565b604082016000820151612c596000850182612bfd565b506020820151612c6c6020850182612c34565b50505050565b6000604082019050612c876000830184612c43565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd457607f821691505b602082108103612ce757612ce6612c8d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d2782612778565b9150612d3283612778565b9250828201905080821115612d4a57612d49612ced565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612d86601f8361266e565b9150612d9182612d50565b602082019050919050565b60006020820190508181036000830152612db581612d79565b9050919050565b6000612dc782612778565b9150612dd283612778565b9250828203905081811115612dea57612de9612ced565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e7b60258361266e565b9150612e8682612e1f565b604082019050919050565b60006020820190508181036000830152612eaa81612e6e565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612ee7601d8361266e565b9150612ef282612eb1565b602082019050919050565b60006020820190508181036000830152612f1681612eda565b9050919050565b6000608082019050612f3260008301876128e2565b612f3f6020830186612939565b612f4c6040830185612824565b612f596060830184612824565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612f9860198361266e565b9150612fa382612f62565b602082019050919050565b60006020820190508181036000830152612fc781612f8b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613004601d8361266e565b915061300f82612fce565b602082019050919050565b6000602082019050818103600083015261303381612ff7565b9050919050565b600060c08201905061304f60008301896128e2565b61305c6020830188612939565b6130696040830187612939565b6130766060830186612824565b6130836080830185612824565b61309060a0830184612824565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006130d1601e8361266e565b91506130dc8261309b565b602082019050919050565b60006020820190508181036000830152613100816130c4565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b600061316360308361266e565b915061316e82613107565b604082019050919050565b6000602082019050818103600083015261319281613156565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006131cf601f8361266e565b91506131da82613199565b602082019050919050565b600060208201905081810360008301526131fe816131c2565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061326160278361266e565b915061326c82613205565b604082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006132f360268361266e565b91506132fe82613297565b604082019050919050565b60006020820190508181036000830152613322816132e6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061338560248361266e565b915061339082613329565b604082019050919050565b600060208201905081810360008301526133b481613378565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061341760228361266e565b9150613422826133bb565b604082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613483601d8361266e565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061351560258361266e565b9150613520826134b9565b604082019050919050565b6000602082019050818103600083015261354481613508565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006135a760238361266e565b91506135b28261354b565b604082019050919050565b600060208201905081810360008301526135d68161359a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061363960268361266e565b9150613644826135dd565b604082019050919050565b600060208201905081810360008301526136688161362c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136a560208361266e565b91506136b08261366f565b602082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b60006040820190506136f06000830185612824565b6136fd6020830184612824565b9392505050565b600060a08201905061371960008301886128e2565b61372660208301876128e2565b61373360408301866128e2565b6137406060830185612824565b61374d6080830184612939565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061379182612778565b915061379c83612778565b9250826137ac576137ab613757565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006137f86002836137b7565b9150613803826137c2565b600282019050919050565b6000819050919050565b613829613824826128d8565b61380e565b82525050565b600061383a826137eb565b91506138468285613818565b6020820191506138568284613818565b6020820191508190509392505050565b600060808201905061387b60008301876128e2565b61388860208301866128ae565b61389560408301856128e2565b6138a260608301846128e2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061391060188361266e565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061397c601f8361266e565b915061398782613946565b602082019050919050565b600060208201905081810360008301526139ab8161396f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0e60228361266e565b9150613a19826139b2565b604082019050919050565b60006020820190508181036000830152613a3d81613a01565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613aa060228361266e565b9150613aab82613a44565b604082019050919050565b60006020820190508181036000830152613acf81613a93565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b3260218361266e565b9150613b3d82613ad6565b604082019050919050565b60006020820190508181036000830152613b6181613b25565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc460228361266e565b9150613bcf82613b68565b604082019050919050565b60006020820190508181036000830152613bf381613bb7565b905091905056fea26469706673582212208cef1b9fdc7e68a76433516319a5957edfb8b21989789d9b16fd80e4cfe8088d64736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a457c2d711610097578063d1df306c11610071578063d1df306c146104c0578063d505accf146104dc578063dd62ed3e146104f8578063f1127ed81461052857610173565b8063a457c2d714610444578063a9059cbb14610474578063c3cda520146104a457610173565b806370a082311461034a57806379c650681461037a5780637ecebe00146103965780638e539e8c146103c657806395d89b41146103f65780639ab24eb01461041457610173565b80633644e515116101305780633644e51514610250578063395093511461026e5780633a46b1a81461029e578063587cde1e146102ce5780635c19a95c146102fe5780636fcfff451461031a57610173565b806306fdde0314610178578063095ea7b314610196578063096b34cf146101c657806318160ddd146101e457806323b872dd14610202578063313ce56714610232575b600080fd5b610180610558565b60405161018d91906126f3565b60405180910390f35b6101b060048036038101906101ab91906127ae565b6105ea565b6040516101bd9190612809565b60405180910390f35b6101ce61060d565b6040516101db9190612833565b60405180910390f35b6101ec610613565b6040516101f99190612833565b60405180910390f35b61021c6004803603810190610217919061284e565b61061d565b6040516102299190612809565b60405180910390f35b61023a61064c565b60405161024791906128bd565b60405180910390f35b610258610655565b60405161026591906128f1565b60405180910390f35b610288600480360381019061028391906127ae565b610664565b6040516102959190612809565b60405180910390f35b6102b860048036038101906102b391906127ae565b61069b565b6040516102c59190612833565b60405180910390f35b6102e860048036038101906102e3919061290c565b61072f565b6040516102f59190612948565b60405180910390f35b6103186004803603810190610313919061290c565b610798565b005b610334600480360381019061032f919061290c565b6107ac565b6040516103419190612982565b60405180910390f35b610364600480360381019061035f919061290c565b610800565b6040516103719190612833565b60405180910390f35b610394600480360381019061038f91906127ae565b610848565b005b6103b060048036038101906103ab919061290c565b610856565b6040516103bd9190612833565b60405180910390f35b6103e060048036038101906103db919061299d565b6108a6565b6040516103ed9190612833565b60405180910390f35b6103fe6108fc565b60405161040b91906126f3565b60405180910390f35b61042e6004803603810190610429919061290c565b61098e565b60405161043b9190612833565b60405180910390f35b61045e600480360381019061045991906127ae565b610a9f565b60405161046b9190612809565b60405180910390f35b61048e600480360381019061048991906127ae565b610b16565b60405161049b9190612809565b60405180910390f35b6104be60048036038101906104b99190612a22565b610b39565b005b6104da60048036038101906104d591906127ae565b610c3d565b005b6104f660048036038101906104f19190612aaf565b610c4b565b005b610512600480360381019061050d9190612b51565b610d8d565b60405161051f9190612833565b60405180910390f35b610542600480360381019061053d9190612bbd565b610e14565b60405161054f9190612c72565b60405180910390f35b60606003805461056790612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461059390612cbc565b80156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b5050505050905090565b6000806105f561122a565b9050610602818585611232565b600191505092915050565b600a5481565b6000600254905090565b60008061062861122a565b90506106358582856113fb565b610640858585611487565b60019150509392505050565b60006012905090565b600061065f611706565b905090565b60008061066f61122a565b90506106908185856106818589610d8d565b61068b9190612d1c565b611232565b600191505092915050565b60004382106106df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d690612d9c565b60405180910390fd5b610727600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611820565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6107a96107a361122a565b8261192c565b50565b60006107f9600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611191565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108528282611a46565b5050565b600061089f600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ae2565b9050919050565b60004382106108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190612d9c565b60405180910390fd5b6108f5600983611820565b9050919050565b60606004805461090b90612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461093790612cbc565b80156109845780601f1061095957610100808354040283529160200191610984565b820191906000526020600020905b81548152906001019060200180831161096757829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a7657600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610a2a9190612dbc565b81548110610a3b57610a3a612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a79565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610aaa61122a565b90506000610ab88286610d8d565b905083811015610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af490612e91565b60405180910390fd5b610b0a8286868403611232565b60019250505092915050565b600080610b2161122a565b9050610b2e818585611487565b600191505092915050565b83421115610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612efd565b60405180910390fd5b6000610bde610bd67fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610bbb9493929190612f1d565b60405160208183030381529060405280519060200120611af0565b858585611b0a565b9050610be981611b35565b8614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190612fae565b60405180910390fd5b610c34818861192c565b50505050505050565b610c478282611b93565b5050565b83421115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c859061301a565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610cbd8c611b35565b89604051602001610cd39695949392919061303a565b6040516020818303038152906040528051906020012090506000610cf682611af0565b90506000610d0682878787611b0a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906130e7565b60405180910390fd5b610d818a8a8a611232565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e1c612625565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610e7357610e72612df0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610f2e8282610fb1565b610f36611ba1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f5c610613565b1115610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613179565b60405180910390fd5b610fab600961111083611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611017906131e5565b60405180910390fd5b61102c60008383611e3d565b806002600082825461103e9190612d1c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110939190612d1c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110f89190612833565b60405180910390a361110c60008383611e42565b5050565b6000818361111e9190612d1c565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613277565b60405180910390fd5b819050919050565b600063ffffffff80168211156111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613309565b60405180910390fd5b819050919050565b6111ef83838361120f565b61120a6111fb8461072f565b6112048461072f565b83611eb7565b505050565b505050565b600081836112229190612dbc565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112989061339b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061342d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113ee9190612833565b60405180910390a3505050565b60006114078484610d8d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114815781811015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613499565b60405180910390fd5b6114808484848403611232565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed9061352b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c906135bd565b60405180910390fd5b611570838383611e3d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed9061364f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116899190612d1c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116ed9190612833565b60405180910390a3611700848484611e42565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561178257507f000000000000000000000000000000000000000000000000000000000000000046145b156117af577f0000000000000000000000000000000000000000000000000000000000000000905061181d565b61181a7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006120b0565b90505b90565b6000808380549050905060005b8181101561189f57600061184182846120ea565b90508486828154811061185757611856612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561188957809250611899565b6001816118969190612d1c565b91505b5061182d565b6000821461190157846001836118b59190612dbc565b815481106118c6576118c5612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611904565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006119378361072f565b9050600061194484610800565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611a40828483611eb7565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb906136bb565b60405180910390fd5b611ade8282610f24565b5050565b600081600001549050919050565b6000611b03611afd611706565b83612110565b9050919050565b6000806000611b1b87878787612143565b91509150611b288161224f565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b8281611ae2565b9150611b8d8161241b565b50919050565b611b9d8282612431565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611c335785600182611be79190612dbc565b81548110611bf857611bf7612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c36565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611c6483858763ffffffff16565b9150600081118015611cb757504386600183611c809190612dbc565b81548110611c9157611c90612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611d4457611cc582611126565b86600183611cd39190612dbc565b81548110611ce457611ce3612df0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611e34565b856040518060400160405280611d5943611191565b63ffffffff168152602001611d6d85611126565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611e4d8383836111e4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051611eaa9190612833565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ef35750600081115b156120ab57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fd157600080611f7a600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061121485611bc5565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611fc69291906136db565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120aa57600080612053600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061111085611bc5565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161209f9291906136db565b60405180910390a250505b5b505050565b600083838346306040516020016120cb959493929190613704565b6040516020818303038152906040528051906020012090509392505050565b600060028284186120fb9190613786565b8284166121089190612d1c565b905092915050565b6000828260405160200161212592919061382f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561217e576000600391509150612246565b601b8560ff16141580156121965750601c8560ff1614155b156121a8576000600491509150612246565b6000600187878787604051600081526020016040526040516121cd9493929190613866565b6020604051602081039080840390855afa1580156121ef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223d57600060019250925050612246565b80600092509250505b94509492505050565b60006004811115612263576122626138ab565b5b816004811115612276576122756138ab565b5b031561241857600160048111156122905761228f6138ab565b5b8160048111156122a3576122a26138ab565b5b036122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613926565b60405180910390fd5b600260048111156122f7576122f66138ab565b5b81600481111561230a576123096138ab565b5b0361234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190613992565b60405180910390fd5b6003600481111561235e5761235d6138ab565b5b816004811115612371576123706138ab565b5b036123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890613a24565b60405180910390fd5b6004808111156123c4576123c36138ab565b5b8160048111156123d7576123d66138ab565b5b03612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90613ab6565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61243b828261244f565b612449600961121483611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590613b48565b60405180910390fd5b6124ca82600083611e3d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254790613bda565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546125a79190612dbc565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161260c9190612833565b60405180910390a361262083600084611e42565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561269d578082015181840152602081019050612682565b60008484015250505050565b6000601f19601f8301169050919050565b60006126c582612663565b6126cf818561266e565b93506126df81856020860161267f565b6126e8816126a9565b840191505092915050565b6000602082019050818103600083015261270d81846126ba565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127458261271a565b9050919050565b6127558161273a565b811461276057600080fd5b50565b6000813590506127728161274c565b92915050565b6000819050919050565b61278b81612778565b811461279657600080fd5b50565b6000813590506127a881612782565b92915050565b600080604083850312156127c5576127c4612715565b5b60006127d385828601612763565b92505060206127e485828601612799565b9150509250929050565b60008115159050919050565b612803816127ee565b82525050565b600060208201905061281e60008301846127fa565b92915050565b61282d81612778565b82525050565b60006020820190506128486000830184612824565b92915050565b60008060006060848603121561286757612866612715565b5b600061287586828701612763565b935050602061288686828701612763565b925050604061289786828701612799565b9150509250925092565b600060ff82169050919050565b6128b7816128a1565b82525050565b60006020820190506128d260008301846128ae565b92915050565b6000819050919050565b6128eb816128d8565b82525050565b600060208201905061290660008301846128e2565b92915050565b60006020828403121561292257612921612715565b5b600061293084828501612763565b91505092915050565b6129428161273a565b82525050565b600060208201905061295d6000830184612939565b92915050565b600063ffffffff82169050919050565b61297c81612963565b82525050565b60006020820190506129976000830184612973565b92915050565b6000602082840312156129b3576129b2612715565b5b60006129c184828501612799565b91505092915050565b6129d3816128a1565b81146129de57600080fd5b50565b6000813590506129f0816129ca565b92915050565b6129ff816128d8565b8114612a0a57600080fd5b50565b600081359050612a1c816129f6565b92915050565b60008060008060008060c08789031215612a3f57612a3e612715565b5b6000612a4d89828a01612763565b9650506020612a5e89828a01612799565b9550506040612a6f89828a01612799565b9450506060612a8089828a016129e1565b9350506080612a9189828a01612a0d565b92505060a0612aa289828a01612a0d565b9150509295509295509295565b600080600080600080600060e0888a031215612ace57612acd612715565b5b6000612adc8a828b01612763565b9750506020612aed8a828b01612763565b9650506040612afe8a828b01612799565b9550506060612b0f8a828b01612799565b9450506080612b208a828b016129e1565b93505060a0612b318a828b01612a0d565b92505060c0612b428a828b01612a0d565b91505092959891949750929550565b60008060408385031215612b6857612b67612715565b5b6000612b7685828601612763565b9250506020612b8785828601612763565b9150509250929050565b612b9a81612963565b8114612ba557600080fd5b50565b600081359050612bb781612b91565b92915050565b60008060408385031215612bd457612bd3612715565b5b6000612be285828601612763565b9250506020612bf385828601612ba8565b9150509250929050565b612c0681612963565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612c3d81612c0c565b82525050565b604082016000820151612c596000850182612bfd565b506020820151612c6c6020850182612c34565b50505050565b6000604082019050612c876000830184612c43565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd457607f821691505b602082108103612ce757612ce6612c8d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d2782612778565b9150612d3283612778565b9250828201905080821115612d4a57612d49612ced565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612d86601f8361266e565b9150612d9182612d50565b602082019050919050565b60006020820190508181036000830152612db581612d79565b9050919050565b6000612dc782612778565b9150612dd283612778565b9250828203905081811115612dea57612de9612ced565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e7b60258361266e565b9150612e8682612e1f565b604082019050919050565b60006020820190508181036000830152612eaa81612e6e565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612ee7601d8361266e565b9150612ef282612eb1565b602082019050919050565b60006020820190508181036000830152612f1681612eda565b9050919050565b6000608082019050612f3260008301876128e2565b612f3f6020830186612939565b612f4c6040830185612824565b612f596060830184612824565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612f9860198361266e565b9150612fa382612f62565b602082019050919050565b60006020820190508181036000830152612fc781612f8b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613004601d8361266e565b915061300f82612fce565b602082019050919050565b6000602082019050818103600083015261303381612ff7565b9050919050565b600060c08201905061304f60008301896128e2565b61305c6020830188612939565b6130696040830187612939565b6130766060830186612824565b6130836080830185612824565b61309060a0830184612824565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006130d1601e8361266e565b91506130dc8261309b565b602082019050919050565b60006020820190508181036000830152613100816130c4565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b600061316360308361266e565b915061316e82613107565b604082019050919050565b6000602082019050818103600083015261319281613156565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006131cf601f8361266e565b91506131da82613199565b602082019050919050565b600060208201905081810360008301526131fe816131c2565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061326160278361266e565b915061326c82613205565b604082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006132f360268361266e565b91506132fe82613297565b604082019050919050565b60006020820190508181036000830152613322816132e6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061338560248361266e565b915061339082613329565b604082019050919050565b600060208201905081810360008301526133b481613378565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061341760228361266e565b9150613422826133bb565b604082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613483601d8361266e565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061351560258361266e565b9150613520826134b9565b604082019050919050565b6000602082019050818103600083015261354481613508565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006135a760238361266e565b91506135b28261354b565b604082019050919050565b600060208201905081810360008301526135d68161359a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061363960268361266e565b9150613644826135dd565b604082019050919050565b600060208201905081810360008301526136688161362c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136a560208361266e565b91506136b08261366f565b602082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b60006040820190506136f06000830185612824565b6136fd6020830184612824565b9392505050565b600060a08201905061371960008301886128e2565b61372660208301876128e2565b61373360408301866128e2565b6137406060830185612824565b61374d6080830184612939565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061379182612778565b915061379c83612778565b9250826137ac576137ab613757565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006137f86002836137b7565b9150613803826137c2565b600282019050919050565b6000819050919050565b613829613824826128d8565b61380e565b82525050565b600061383a826137eb565b91506138468285613818565b6020820191506138568284613818565b6020820191508190509392505050565b600060808201905061387b60008301876128e2565b61388860208301866128ae565b61389560408301856128e2565b6138a260608301846128e2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061391060188361266e565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061397c601f8361266e565b915061398782613946565b602082019050919050565b600060208201905081810360008301526139ab8161396f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0e60228361266e565b9150613a19826139b2565b604082019050919050565b60006020820190508181036000830152613a3d81613a01565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613aa060228361266e565b9150613aab82613a44565b604082019050919050565b60006020820190508181036000830152613acf81613a93565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b3260218361266e565b9150613b3d82613ad6565b604082019050919050565b60006020820190508181036000830152613b6181613b25565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc460228361266e565b9150613bcf82613b68565b604082019050919050565b60006020820190508181036000830152613bf381613bb7565b905091905056fea26469706673582212208cef1b9fdc7e68a76433516319a5957edfb8b21989789d9b16fd80e4cfe8088d64736f6c63430008110033", "devdoc": { "kind": "dev", "methods": { @@ -801,7 +876,7 @@ { "astId": 10125, "contract": "contracts/GovernanceToken.sol:GovernanceToken", - "label": "s_maxSupply", + "label": "s_initialSupply", "offset": 0, "slot": "10", "type": "t_uint256" diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json deleted file mode 100644 index 107bc0f..0000000 --- a/deployments/localhost/GovernerContract.json +++ /dev/null @@ -1,1779 +0,0 @@ -{ - "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IVotes", - "name": "_token", - "type": "address" - }, - { - "internalType": "contract TimelockController", - "name": "_timelock", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_votingDelay", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_votingPeriod", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_quorumPercentage", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "Empty", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "ProposalCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "proposer", - "type": "address" - }, - { - "indexed": false, - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "indexed": false, - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "indexed": false, - "internalType": "string[]", - "name": "signatures", - "type": "string[]" - }, - { - "indexed": false, - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "startBlock", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "endBlock", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "description", - "type": "string" - } - ], - "name": "ProposalCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "ProposalExecuted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "eta", - "type": "uint256" - } - ], - "name": "ProposalQueued", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldProposalThreshold", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newProposalThreshold", - "type": "uint256" - } - ], - "name": "ProposalThresholdSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldQuorumNumerator", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newQuorumNumerator", - "type": "uint256" - } - ], - "name": "QuorumNumeratorUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "oldTimelock", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newTimelock", - "type": "address" - } - ], - "name": "TimelockChange", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "weight", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "reason", - "type": "string" - } - ], - "name": "VoteCast", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "weight", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "reason", - "type": "string" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "params", - "type": "bytes" - } - ], - "name": "VoteCastWithParams", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldVotingDelay", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newVotingDelay", - "type": "uint256" - } - ], - "name": "VotingDelaySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldVotingPeriod", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newVotingPeriod", - "type": "uint256" - } - ], - "name": "VotingPeriodSet", - "type": "event" - }, - { - "inputs": [], - "name": "BALLOT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "COUNTING_MODE", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "EXTENDED_BALLOT_TYPEHASH", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - } - ], - "name": "castVote", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "castVoteBySig", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - } - ], - "name": "castVoteWithReason", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - } - ], - "name": "castVoteWithReasonAndParams", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "castVoteWithReasonAndParamsBySig", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "descriptionHash", - "type": "bytes32" - } - ], - "name": "execute", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "getVotes", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - } - ], - "name": "getVotesWithParams", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasVoted", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "descriptionHash", - "type": "bytes32" - } - ], - "name": "hashProposal", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC1155BatchReceived", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC1155Received", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC721Received", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalDeadline", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalEta", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalSnapshot", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proposalThreshold", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "proposalVotes", - "outputs": [ - { - "internalType": "uint256", - "name": "againstVotes", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "forVotes", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "abstainVotes", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "string", - "name": "description", - "type": "string" - } - ], - "name": "propose", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "descriptionHash", - "type": "bytes32" - } - ], - "name": "queue", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "quorum", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "quorumDenominator", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "quorumNumerator", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "quorumNumerator", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "relay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newProposalThreshold", - "type": "uint256" - } - ], - "name": "setProposalThreshold", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newVotingDelay", - "type": "uint256" - } - ], - "name": "setVotingDelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newVotingPeriod", - "type": "uint256" - } - ], - "name": "setVotingPeriod", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - } - ], - "name": "state", - "outputs": [ - { - "internalType": "enum IGovernor.ProposalState", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "timelock", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "token", - "outputs": [ - { - "internalType": "contract IVotes", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newQuorumNumerator", - "type": "uint256" - } - ], - "name": "updateQuorumNumerator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract TimelockController", - "name": "newTimelock", - "type": "address" - } - ], - "name": "updateTimelock", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "votingDelay", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "votingPeriod", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", - "receipt": { - "to": null, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "transactionIndex": 0, - "gasUsed": "6149110", - "logsBloom": "0x00000000000000000100000000001000000000000000000000000000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000000000000000000000010000000000000000000000000080002000000000000000000000000000000000000000000001000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000001000000000080000800000000000000000000000000000000000000000000000000000000000000000002000", - "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d", - "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", - "logs": [ - { - "transactionIndex": 0, - "blockNumber": 4, - "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", - "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "topics": [ - "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" - ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 0, - "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" - }, - { - "transactionIndex": 0, - "blockNumber": 4, - "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", - "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "topics": [ - "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" - ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005", - "logIndex": 1, - "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" - }, - { - "transactionIndex": 0, - "blockNumber": 4, - "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", - "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "topics": [ - "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" - ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "logIndex": 2, - "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" - }, - { - "transactionIndex": 0, - "blockNumber": 4, - "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", - "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "topics": [ - "0x0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997" - ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004", - "logIndex": 3, - "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" - }, - { - "transactionIndex": 0, - "blockNumber": 4, - "transactionHash": "0x33bc5d2677b034f28fdcebb15a672afea0f80848203d2ac434339c63c7009a17", - "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "topics": [ - "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" - ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0", - "logIndex": 4, - "blockHash": "0xccd3ffad3d2f1fe150f4e0b277955c7bbb17b504fda96598337413bd3ad5652d" - } - ], - "blockNumber": 4, - "cumulativeGasUsed": "6149110", - "status": 1, - "byzantium": true - }, - "args": [ - "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - 1, - 5, - 4 - ], - "numDeployments": 1, - "solcInputHash": "0a567a41a96dc2d81abbf99faae0732b", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl\\n{\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0xef3706b6dd13ea3c8a30e0f5009c02abb1ed331bd3986c3b6bddca8ab806a67c\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6101606040523480156200001257600080fd5b5060405162007e1438038062007e14833981810160405281019062000038919062000af1565b838186858560006040518060400160405280601081526020017f476f7665726e6572436f6e7472616374000000000000000000000000000000008152508062000086620001e660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000ef8184846200022360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000149919062000de9565b50506200015c836200025f60201b60201c565b6200016d82620002a660201b60201c565b6200017e816200033360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001c8816200037a60201b60201c565b50620001da816200055960201b60201c565b505050505050620012f4565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200024095949392919062000f0d565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516200029492919062000f6a565b60405180910390a18060048190555050565b60008111620002ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e3906200101e565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600554826040516200032192919062000f6a565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516200036892919062000f6a565b60405180910390a18060068190555050565b6200038a620005fa60201b60201c565b811115620003cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c690620010dc565b60405180910390fd5b6000620003e16200060360201b60201c565b905060008114158015620003fd57506000600960000180549050145b15620004fd5760096000016040518060400160405280600063ffffffff16815260200162000436846200063b60201b62001e2e1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000518826009620006a960201b62001e991790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200054d92919062000f6a565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ae929190620010fe565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006064905090565b6000806009600001805490501462000632576200062c6009620008e760201b6200209b1760201c565b62000636565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620006a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069890620011a1565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620006cb86620008e760201b60201c565b90506000821180156200072757504386600001600184620006ed9190620011f2565b815481106200070157620007006200122d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620007cb5762000743856200063b60201b62001e2e1760201c565b86600001600184620007569190620011f2565b815481106200076a57620007696200122d565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620008d8565b856000016040518060400160405280620007f0436200098960201b620021361760201c565b63ffffffff16815260200162000811886200063b60201b62001e2e1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114620009605782600001600182620009109190620011f2565b815481106200092457620009236200122d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000963565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115620009d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009ce90620012d2565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a1182620009e4565b9050919050565b600062000a258262000a04565b9050919050565b62000a378162000a18565b811462000a4357600080fd5b50565b60008151905062000a578162000a2c565b92915050565b600062000a6a82620009e4565b9050919050565b600062000a7e8262000a5d565b9050919050565b62000a908162000a71565b811462000a9c57600080fd5b50565b60008151905062000ab08162000a85565b92915050565b6000819050919050565b62000acb8162000ab6565b811462000ad757600080fd5b50565b60008151905062000aeb8162000ac0565b92915050565b600080600080600060a0868803121562000b105762000b0f620009df565b5b600062000b208882890162000a46565b955050602062000b338882890162000a9f565b945050604062000b468882890162000ada565b935050606062000b598882890162000ada565b925050608062000b6c8882890162000ada565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bfb57607f821691505b60208210810362000c115762000c1062000bb3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c3c565b62000c87868362000c3c565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000cca62000cc462000cbe8462000ab6565b62000c9f565b62000ab6565b9050919050565b6000819050919050565b62000ce68362000ca9565b62000cfe62000cf58262000cd1565b84845462000c49565b825550505050565b600090565b62000d1562000d06565b62000d2281848462000cdb565b505050565b5b8181101562000d4a5762000d3e60008262000d0b565b60018101905062000d28565b5050565b601f82111562000d995762000d638162000c17565b62000d6e8462000c2c565b8101602085101562000d7e578190505b62000d9662000d8d8562000c2c565b83018262000d27565b50505b505050565b600082821c905092915050565b600062000dbe6000198460080262000d9e565b1980831691505092915050565b600062000dd9838362000dab565b9150826002028217905092915050565b62000df48262000b79565b67ffffffffffffffff81111562000e105762000e0f62000b84565b5b62000e1c825462000be2565b62000e2982828562000d4e565b600060209050601f83116001811462000e61576000841562000e4c578287015190505b62000e58858262000dcb565b86555062000ec8565b601f19841662000e718662000c17565b60005b8281101562000e9b5784890151825560018201915060208501945060208101905062000e74565b8683101562000ebb578489015162000eb7601f89168262000dab565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000ee58162000ed0565b82525050565b62000ef68162000ab6565b82525050565b62000f078162000a04565b82525050565b600060a08201905062000f24600083018862000eda565b62000f33602083018762000eda565b62000f42604083018662000eda565b62000f51606083018562000eeb565b62000f60608083018462000efc565b9695505050505050565b600060408201905062000f81600083018562000eeb565b62000f90602083018462000eeb565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200100660278362000f97565b9150620010138262000fa8565b604082019050919050565b60006020820190508181036000830152620010398162000ff7565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620010c460438362000f97565b9150620010d18262001040565b606082019050919050565b60006020820190508181036000830152620010f781620010b5565b9050919050565b600060408201905062001115600083018562000efc565b62001124602083018462000efc565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200118960278362000f97565b915062001196826200112b565b604082019050919050565b60006020820190508181036000830152620011bc816200117a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011ff8262000ab6565b91506200120c8362000ab6565b9250828203905081811115620012275762001226620011c3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620012ba60268362000f97565b9150620012c7826200125c565b604082019050919050565b60006020820190508181036000830152620012ed81620012ab565b9050919050565b60805160a05160c05160e051610100516101205161014051616ab76200135d60003960008181611e0c01528181612ee201526131560152600061341c0152600061345e0152600061343d01526000613372015260006133c8015260006133f10152616ab76000f3fe60806040526004361061024a5760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf146109cb578063eb9019d4146109f4578063ece40cc114610a31578063f23a6e6114610a5a578063f8ce560a14610a97578063fc0c546a14610ad457610290565b8063c28bc2fa146108e4578063c59057e41461090d578063d33219b41461094a578063dd4e2ba514610975578063deaaa7cc146109a057610290565b8063a890c910116100fd578063a890c910146107d9578063ab58fb8e14610802578063b58131b01461083f578063bc197c811461086a578063c01f9e37146108a757610290565b80637b3c71d3146106cc5780637d5e81e21461070957806397c3d334146107465780639a802a6d14610771578063a7713a70146107ae57610290565b80633932abb1116101c757806354fd4d501161018b57806354fd4d50146105c157806356781388146105ec5780635f398a141461062957806360c4247f1461066657806370b0f660146106a357610290565b80633932abb1146104a05780633bccf4fd146104cb5780633e4f49e6146105085780634385963214610545578063544ffc9c1461058257610290565b8063150b7a021161020e578063150b7a021461038e578063160cbed7146103cb5780632656227d146104085780632d63f693146104385780632fe3e2611461047557610290565b806301ffc9a71461029557806302a251a3146102d257806303420181146102fd57806306f3f9e61461033a57806306fdde031461036357610290565b36610290573073ffffffffffffffffffffffffffffffffffffffff1661026e610aff565b73ffffffffffffffffffffffffffffffffffffffff161461028e57600080fd5b005b600080fd5b3480156102a157600080fd5b506102bc60048036038101906102b79190614061565b610b0e565b6040516102c991906140a9565b60405180910390f35b3480156102de57600080fd5b506102e7610b20565b6040516102f491906140dd565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190614339565b610b2f565b60405161033191906140dd565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190614417565b610c14565b005b34801561036f57600080fd5b50610378610d0b565b60405161038591906144c3565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614543565b610d9d565b6040516103c291906145d5565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190614857565b610db1565b6040516103ff91906140dd565b60405180910390f35b610422600480360381019061041d9190614857565b61106b565b60405161042f91906140dd565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190614417565b6111b8565b60405161046c91906140dd565b60405180910390f35b34801561048157600080fd5b5061048a611226565b6040516104979190614921565b60405180910390f35b3480156104ac57600080fd5b506104b561124a565b6040516104c291906140dd565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed919061493c565b611259565b6040516104ff91906140dd565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a9190614417565b6112e3565b60405161053c9190614a2e565b60405180910390f35b34801561055157600080fd5b5061056c60048036038101906105679190614a49565b6112f5565b60405161057991906140a9565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190614417565b611360565b6040516105b893929190614a89565b60405180910390f35b3480156105cd57600080fd5b506105d6611398565b6040516105e391906144c3565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190614ac0565b6113d5565b60405161062091906140dd565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190614b00565b611406565b60405161065d91906140dd565b60405180910390f35b34801561067257600080fd5b5061068d60048036038101906106889190614417565b611470565b60405161069a91906140dd565b60405180910390f35b3480156106af57600080fd5b506106ca60048036038101906106c59190614417565b6115bc565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190614ba4565b6116b3565b60405161070091906140dd565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190614cb9565b61171b565b60405161073d91906140dd565b60405180910390f35b34801561075257600080fd5b5061075b611733565b60405161076891906140dd565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190614d90565b61173c565b6040516107a591906140dd565b60405180910390f35b3480156107ba57600080fd5b506107c3611752565b6040516107d091906140dd565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190614e4f565b61177b565b005b34801561080e57600080fd5b5061082960048036038101906108249190614417565b611872565b60405161083691906140dd565b60405180910390f35b34801561084b57600080fd5b5061085461193f565b60405161086191906140dd565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190614e7c565b61194e565b60405161089e91906145d5565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190614417565b611963565b6040516108db91906140dd565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190614fa1565b6119d1565b005b34801561091957600080fd5b50610934600480360381019061092f9190614857565b611b12565b60405161094191906140dd565b60405180910390f35b34801561095657600080fd5b5061095f611b4e565b60405161096c9190615024565b60405180910390f35b34801561098157600080fd5b5061098a611b78565b60405161099791906144c3565b60405180910390f35b3480156109ac57600080fd5b506109b5611bb5565b6040516109c29190614921565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed9190614417565b611bd9565b005b348015610a0057600080fd5b50610a1b6004803603810190610a16919061503f565b611cd0565b604051610a2891906140dd565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a539190614417565b611cec565b005b348015610a6657600080fd5b50610a816004803603810190610a7c919061507f565b611de3565b604051610a8e91906145d5565b60405180910390f35b348015610aa357600080fd5b50610abe6004803603810190610ab99190614417565b611df8565b604051610acb91906140dd565b60405180910390f35b348015610ae057600080fd5b50610ae9611e0a565b604051610af69190615175565b60405180910390f35b6000610b09612189565b905090565b6000610b19826121b3565b9050919050565b6000610b2a61222d565b905090565b600080610bb2610baa7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610b6b9291906151c0565b60405180910390208b80519060200120604051602001610b8f9594939291906151e8565b60405160208183030381529060405280519060200120612237565b868686612251565b9050610c058a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a61227c565b91505098975050505050505050565b610c1c610aff565b73ffffffffffffffffffffffffffffffffffffffff16610c3a612438565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16610caf610aff565b73ffffffffffffffffffffffffffffffffffffffff1614610cff576000610cd4612440565b604051610ce29291906151c0565b604051809103902090505b80610cf8600261244d565b03610ced57505b610d0881612529565b50565b606060008054610d1a906152d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d46906152d6565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b5050505050905090565b600063150b7a0260e01b9050949350505050565b600080610dc086868686611b12565b905060046007811115610dd657610dd56149b7565b5b610ddf826112e3565b6007811115610df157610df06149b7565b5b14610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890615379565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec491906153ae565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610f2a9594939291906156b6565b602060405180830381865afa158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190615733565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401610fe896959493929190615760565b600060405180830381600087803b15801561100257600080fd5b505af1158015611016573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426110489190615805565b604051611056929190615839565b60405180910390a18192505050949350505050565b60008061107a86868686611b12565b90506000611087826112e3565b90506004600781111561109d5761109c6149b7565b5b8160078111156110b0576110af6149b7565b5b14806110e05750600560078111156110cb576110ca6149b7565b5b8160078111156110de576110dd6149b7565b5b145b61111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690615379565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f8260405161117c91906140dd565b60405180910390a161119182888888886126dd565b61119e82888888886127c0565b6111ab82888888886127d4565b8192505050949350505050565b6000611215600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b600061125461283d565b905090565b6000806112ba6112b27f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f898960405160200161129793929190615862565b60405160208183030381529060405280519060200120612237565b868686612251565b90506112d787828860405180602001604052806000815250612847565b91505095945050505050565b60006112ee82612867565b9050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806113e0612438565b90506113fd84828560405180602001604052806000815250612847565b91505092915050565b600080611411612438565b905061146487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508761227c565b91505095945050505050565b600080600960000180549050905060008103611491576008549150506115b7565b600060096000016001836114a59190615899565b815481106114b6576114b56158cd565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161159e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506115b7565b6115b2846009612a3a90919063ffffffff16565b925050505b919050565b6115c4610aff565b73ffffffffffffffffffffffffffffffffffffffff166115e2612438565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611657610aff565b73ffffffffffffffffffffffffffffffffffffffff16146116a757600061167c612440565b60405161168a9291906151c0565b604051809103902090505b806116a0600261244d565b0361169557505b6116b081612b92565b50565b6000806116be612438565b905061171086828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612847565b915050949350505050565b600061172985858585612bd7565b9050949350505050565b60006064905090565b6000611749848484612ede565b90509392505050565b600080600960000180549050146117725761176d600961209b565b611776565b6008545b905090565b611783610aff565b73ffffffffffffffffffffffffffffffffffffffff166117a1612438565b73ffffffffffffffffffffffffffffffffffffffff16146117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611816610aff565b73ffffffffffffffffffffffffffffffffffffffff161461186657600061183b612440565b6040516118499291906151c0565b604051809103902090505b8061185f600261244d565b0361185457505b61186f81612f85565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b81526004016118e39190614921565b602060405180830381865afa158015611900573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192491906153ae565b9050600181146119345780611937565b60005b915050919050565b6000611949613024565b905090565b600063bc197c8160e01b905095945050505050565b60006119c0600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff169050919050565b6119d9610aff565b73ffffffffffffffffffffffffffffffffffffffff166119f7612438565b73ffffffffffffffffffffffffffffffffffffffff1614611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611a6c610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611abc576000611a91612440565b604051611a9f9291906151c0565b604051809103902090505b80611ab5600261244d565b03611aaa57505b611b0b8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508561302e565b5050505050565b600084848484604051602001611b2b94939291906158fc565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b611be1610aff565b73ffffffffffffffffffffffffffffffffffffffff16611bff612438565b73ffffffffffffffffffffffffffffffffffffffff1614611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611c74610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611cc4576000611c99612440565b604051611ca79291906151c0565b604051809103902090505b80611cbd600261244d565b03611cb257505b611ccd8161305d565b50565b6000611ce48383611cdf6130e5565b612ede565b905092915050565b611cf4610aff565b73ffffffffffffffffffffffffffffffffffffffff16611d12612438565b73ffffffffffffffffffffffffffffffffffffffff1614611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611d87610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611dd7576000611dac612440565b604051611dba9291906151c0565b604051809103902090505b80611dd0600261244d565b03611dc557505b611de0816130fc565b50565b600063f23a6e6160e01b905095945050505050565b6000611e0382613141565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e88906159c8565b60405180910390fd5b819050919050565b6000806000846000018054905090506000611eb38661209b565b9050600082118015611f0957504386600001600184611ed29190615899565b81548110611ee357611ee26158cd565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f9957611f1785611e2e565b86600001600184611f289190615899565b81548110611f3957611f386158cd565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061208c565b856000016040518060400160405280611fb143612136565b63ffffffff168152602001611fc588611e2e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811461210d57826000016001826120c19190615899565b815481106120d2576120d16158cd565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612110565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115612181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217890615a5a565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612226575061222582613209565b5b9050919050565b6000600554905090565b600061224a61224461336e565b83613488565b9050919050565b6000806000612262878787876134bb565b9150915061226f816135c7565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156122a8576122a76149b7565b5b6122b1886112e3565b60078111156122c3576122c26149b7565b5b14612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90615aec565b60405180910390fd5b600061236287612352846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff1686612ede565b90506123718888888488613793565b60008451036123d3578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516123c69493929190615b0c565b60405180910390a261242a565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612421959493929190615ba2565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b600061245882613997565b1561248f576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b612531611733565b811115612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a90615c9b565b60405180910390fd5b600061257d611752565b90506000811415801561259857506000600960000180549050145b1561268a5760096000016040518060400160405280600063ffffffff1681526020016125c384611e2e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b61269e826009611e9990919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516126d1929190615839565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff166126fc610aff565b73ffffffffffffffffffffffffffffffffffffffff16146127b95760005b84518110156127b7573073ffffffffffffffffffffffffffffffffffffffff1685828151811061274d5761274c6158cd565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036127a6576127a5838281518110612786576127856158cd565b5b60200260200101518051906020012060026139cc90919063ffffffff16565b5b806127b090615cbb565b905061271a565b505b5050505050565b6127cd8585858585613a48565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff166127f3610aff565b73ffffffffffffffffffffffffffffffffffffffff1614612828576128186002613997565b612827576128266002613ae6565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b600061285d858585856128586130e5565b61227c565b9050949350505050565b60008061287383613b67565b905060046007811115612889576128886149b7565b5b81600781111561289c5761289b6149b7565b5b146128aa5780915050612a35565b6000600b60008581526020019081526020016000205490506000801b81036128d6578192505050612a35565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016129319190614921565b602060405180830381865afa15801561294e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129729190615d2f565b1561298257600792505050612a35565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016129dd9190614921565b602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e9190615d2f565b15612a2e57600592505050612a35565b6002925050505b919050565b6000438210612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590615da8565b60405180910390fd5b60008360000180549050905060005b81811015612b02576000612aa18284613c7b565b905084866000018281548110612aba57612ab96158cd565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612aec57809250612afc565b600181612af99190615805565b91505b50612a8d565b60008214612b675784600001600183612b1b9190615899565b81548110612b2c57612b2b6158cd565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612b6a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051612bc5929190615839565b60405180910390a18060048190555050565b6000612be161193f565b612bfe612bec612438565b600143612bf99190615899565b611cd0565b1015612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690615e3a565b60405180910390fd5b6000612c548686868680519060200120611b12565b90508451865114612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9190615ecc565b60405180910390fd5b8351865114612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd590615ecc565b60405180910390fd5b6000865111612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1990615f38565b60405180910390fd5b6000600160008381526020019081526020016000209050612d82816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613ca1565b612dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db890615fca565b60405180910390fd5b6000612dd3612dce61124a565b613cbb565b612ddc43613cbb565b612de69190615ffe565b90506000612dfa612df5610b20565b613cbb565b82612e059190615ffe565b9050612e1d8284600001613d1290919063ffffffff16565b612e338184600101613d1290919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084612e5d612438565b8b8b8d5167ffffffffffffffff811115612e7a57612e796141d8565b5b604051908082528060200260200182016040528015612ead57816020015b6060815260200190600190039081612e985790505b508c88888e604051612ec799989796959493929190616177565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612f3b929190616227565b602060405180830381865afa158015612f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7c91906153ae565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612fd8929190616250565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b6060613054848484604051806060016040528060298152602001616a5960299139613d41565b90509392505050565b600081116130a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613097906162eb565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600554826040516130d3929190615839565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054616006548260405161312f929190615839565b60405180910390a18060068190555050565b600061314b611733565b61315483611470565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016131ad91906140dd565b602060405180830381865afa1580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee91906153ae565b6131f8919061630b565b613202919061637c565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806132ef57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061335757507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613367575061336682613e55565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156133ea57507f000000000000000000000000000000000000000000000000000000000000000046145b15613417577f00000000000000000000000000000000000000000000000000000000000000009050613485565b6134827f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613ebf565b90505b90565b6000828260405160200161349d929190616425565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134f65760006003915091506135be565b601b8560ff161415801561350e5750601c8560ff1614155b156135205760006004915091506135be565b600060018787878760405160008152602001604052604051613545949392919061645c565b6020604051602081039080840390855afa158015613567573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135b5576000600192509250506135be565b80600092509250505b94509492505050565b600060048111156135db576135da6149b7565b5b8160048111156135ee576135ed6149b7565b5b03156137905760016004811115613608576136076149b7565b5b81600481111561361b5761361a6149b7565b5b0361365b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613652906164ed565b60405180910390fd5b6002600481111561366f5761366e6149b7565b5b816004811115613682576136816149b7565b5b036136c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b990616559565b60405180910390fd5b600360048111156136d6576136d56149b7565b5b8160048111156136e9576136e86149b7565b5b03613729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613720906165eb565b60405180910390fd5b60048081111561373c5761373b6149b7565b5b81600481111561374f5761374e6149b7565b5b0361378f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137869061667d565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613839576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138309061670f565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060028111156138a7576138a66149b7565b5b60ff168460ff16036138d357828160000160008282546138c79190615805565b9250508190555061398f565b600160028111156138e7576138e66149b7565b5b60ff168460ff160361391357828160010160008282546139079190615805565b9250508190555061398e565b600280811115613926576139256149b7565b5b60ff168460ff160361395257828160020160008282546139469190615805565b9250508190555061398d565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613984906167a1565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401613aad9594939291906156b6565b6000604051808303818588803b158015613ac657600080fd5b505af1158015613ada573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615613ba0576007915050613c76565b8060020160019054906101000a900460ff1615613bc1576002915050613c76565b6000613bcc846111b8565b905060008103613c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c089061680d565b60405180910390fd5b438110613c2357600092505050613c76565b6000613c2e85611963565b9050438110613c435760019350505050613c76565b613c4c85613ef9565b8015613c5d5750613c5c85613f40565b5b15613c6e5760049350505050613c76565b600393505050505b919050565b60006002828418613c8c919061637c565b828416613c999190615805565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115613d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d019061689f565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015613d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7d90616931565b60405180910390fd5b613d8f85613f6b565b613dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc59061699d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613df791906169ee565b60006040518083038185875af1925050503d8060008114613e34576040519150601f19603f3d011682016040523d82523d6000602084013e613e39565b606091505b5091509150613e49828286613f8e565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001613eda959493929190616a05565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154613f259190615805565b613f36613f31856111b8565b611df8565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613f9e57829050613fee565b600083511115613fb15782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe591906144c3565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61403e81614009565b811461404957600080fd5b50565b60008135905061405b81614035565b92915050565b60006020828403121561407757614076613fff565b5b60006140858482850161404c565b91505092915050565b60008115159050919050565b6140a38161408e565b82525050565b60006020820190506140be600083018461409a565b92915050565b6000819050919050565b6140d7816140c4565b82525050565b60006020820190506140f260008301846140ce565b92915050565b614101816140c4565b811461410c57600080fd5b50565b60008135905061411e816140f8565b92915050565b600060ff82169050919050565b61413a81614124565b811461414557600080fd5b50565b60008135905061415781614131565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126141825761418161415d565b5b8235905067ffffffffffffffff81111561419f5761419e614162565b5b6020830191508360018202830111156141bb576141ba614167565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614210826141c7565b810181811067ffffffffffffffff8211171561422f5761422e6141d8565b5b80604052505050565b6000614242613ff5565b905061424e8282614207565b919050565b600067ffffffffffffffff82111561426e5761426d6141d8565b5b614277826141c7565b9050602081019050919050565b82818337600083830152505050565b60006142a66142a184614253565b614238565b9050828152602081018484840111156142c2576142c16141c2565b5b6142cd848285614284565b509392505050565b600082601f8301126142ea576142e961415d565b5b81356142fa848260208601614293565b91505092915050565b6000819050919050565b61431681614303565b811461432157600080fd5b50565b6000813590506143338161430d565b92915050565b60008060008060008060008060e0898b03121561435957614358613fff565b5b60006143678b828c0161410f565b98505060206143788b828c01614148565b975050604089013567ffffffffffffffff81111561439957614398614004565b5b6143a58b828c0161416c565b9650965050606089013567ffffffffffffffff8111156143c8576143c7614004565b5b6143d48b828c016142d5565b94505060806143e58b828c01614148565b93505060a06143f68b828c01614324565b92505060c06144078b828c01614324565b9150509295985092959890939650565b60006020828403121561442d5761442c613fff565b5b600061443b8482850161410f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561447e578082015181840152602081019050614463565b60008484015250505050565b600061449582614444565b61449f818561444f565b93506144af818560208601614460565b6144b8816141c7565b840191505092915050565b600060208201905081810360008301526144dd818461448a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614510826144e5565b9050919050565b61452081614505565b811461452b57600080fd5b50565b60008135905061453d81614517565b92915050565b6000806000806080858703121561455d5761455c613fff565b5b600061456b8782880161452e565b945050602061457c8782880161452e565b935050604061458d8782880161410f565b925050606085013567ffffffffffffffff8111156145ae576145ad614004565b5b6145ba878288016142d5565b91505092959194509250565b6145cf81614009565b82525050565b60006020820190506145ea60008301846145c6565b92915050565b600067ffffffffffffffff82111561460b5761460a6141d8565b5b602082029050602081019050919050565b600061462f61462a846145f0565b614238565b9050808382526020820190506020840283018581111561465257614651614167565b5b835b8181101561467b5780614667888261452e565b845260208401935050602081019050614654565b5050509392505050565b600082601f83011261469a5761469961415d565b5b81356146aa84826020860161461c565b91505092915050565b600067ffffffffffffffff8211156146ce576146cd6141d8565b5b602082029050602081019050919050565b60006146f26146ed846146b3565b614238565b9050808382526020820190506020840283018581111561471557614714614167565b5b835b8181101561473e578061472a888261410f565b845260208401935050602081019050614717565b5050509392505050565b600082601f83011261475d5761475c61415d565b5b813561476d8482602086016146df565b91505092915050565b600067ffffffffffffffff821115614791576147906141d8565b5b602082029050602081019050919050565b60006147b56147b084614776565b614238565b905080838252602082019050602084028301858111156147d8576147d7614167565b5b835b8181101561481f57803567ffffffffffffffff8111156147fd576147fc61415d565b5b80860161480a89826142d5565b855260208501945050506020810190506147da565b5050509392505050565b600082601f83011261483e5761483d61415d565b5b813561484e8482602086016147a2565b91505092915050565b6000806000806080858703121561487157614870613fff565b5b600085013567ffffffffffffffff81111561488f5761488e614004565b5b61489b87828801614685565b945050602085013567ffffffffffffffff8111156148bc576148bb614004565b5b6148c887828801614748565b935050604085013567ffffffffffffffff8111156148e9576148e8614004565b5b6148f587828801614829565b925050606061490687828801614324565b91505092959194509250565b61491b81614303565b82525050565b60006020820190506149366000830184614912565b92915050565b600080600080600060a0868803121561495857614957613fff565b5b60006149668882890161410f565b955050602061497788828901614148565b945050604061498888828901614148565b935050606061499988828901614324565b92505060806149aa88828901614324565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600881106149f7576149f66149b7565b5b50565b6000819050614a08826149e6565b919050565b6000614a18826149fa565b9050919050565b614a2881614a0d565b82525050565b6000602082019050614a436000830184614a1f565b92915050565b60008060408385031215614a6057614a5f613fff565b5b6000614a6e8582860161410f565b9250506020614a7f8582860161452e565b9150509250929050565b6000606082019050614a9e60008301866140ce565b614aab60208301856140ce565b614ab860408301846140ce565b949350505050565b60008060408385031215614ad757614ad6613fff565b5b6000614ae58582860161410f565b9250506020614af685828601614148565b9150509250929050565b600080600080600060808688031215614b1c57614b1b613fff565b5b6000614b2a8882890161410f565b9550506020614b3b88828901614148565b945050604086013567ffffffffffffffff811115614b5c57614b5b614004565b5b614b688882890161416c565b9350935050606086013567ffffffffffffffff811115614b8b57614b8a614004565b5b614b97888289016142d5565b9150509295509295909350565b60008060008060608587031215614bbe57614bbd613fff565b5b6000614bcc8782880161410f565b9450506020614bdd87828801614148565b935050604085013567ffffffffffffffff811115614bfe57614bfd614004565b5b614c0a8782880161416c565b925092505092959194509250565b600067ffffffffffffffff821115614c3357614c326141d8565b5b614c3c826141c7565b9050602081019050919050565b6000614c5c614c5784614c18565b614238565b905082815260208101848484011115614c7857614c776141c2565b5b614c83848285614284565b509392505050565b600082601f830112614ca057614c9f61415d565b5b8135614cb0848260208601614c49565b91505092915050565b60008060008060808587031215614cd357614cd2613fff565b5b600085013567ffffffffffffffff811115614cf157614cf0614004565b5b614cfd87828801614685565b945050602085013567ffffffffffffffff811115614d1e57614d1d614004565b5b614d2a87828801614748565b935050604085013567ffffffffffffffff811115614d4b57614d4a614004565b5b614d5787828801614829565b925050606085013567ffffffffffffffff811115614d7857614d77614004565b5b614d8487828801614c8b565b91505092959194509250565b600080600060608486031215614da957614da8613fff565b5b6000614db78682870161452e565b9350506020614dc88682870161410f565b925050604084013567ffffffffffffffff811115614de957614de8614004565b5b614df5868287016142d5565b9150509250925092565b6000614e0a826144e5565b9050919050565b6000614e1c82614dff565b9050919050565b614e2c81614e11565b8114614e3757600080fd5b50565b600081359050614e4981614e23565b92915050565b600060208284031215614e6557614e64613fff565b5b6000614e7384828501614e3a565b91505092915050565b600080600080600060a08688031215614e9857614e97613fff565b5b6000614ea68882890161452e565b9550506020614eb78882890161452e565b945050604086013567ffffffffffffffff811115614ed857614ed7614004565b5b614ee488828901614748565b935050606086013567ffffffffffffffff811115614f0557614f04614004565b5b614f1188828901614748565b925050608086013567ffffffffffffffff811115614f3257614f31614004565b5b614f3e888289016142d5565b9150509295509295909350565b60008083601f840112614f6157614f6061415d565b5b8235905067ffffffffffffffff811115614f7e57614f7d614162565b5b602083019150836001820283011115614f9a57614f99614167565b5b9250929050565b60008060008060608587031215614fbb57614fba613fff565b5b6000614fc98782880161452e565b9450506020614fda8782880161410f565b935050604085013567ffffffffffffffff811115614ffb57614ffa614004565b5b61500787828801614f4b565b925092505092959194509250565b61501e81614505565b82525050565b60006020820190506150396000830184615015565b92915050565b6000806040838503121561505657615055613fff565b5b60006150648582860161452e565b92505060206150758582860161410f565b9150509250929050565b600080600080600060a0868803121561509b5761509a613fff565b5b60006150a98882890161452e565b95505060206150ba8882890161452e565b94505060406150cb8882890161410f565b93505060606150dc8882890161410f565b925050608086013567ffffffffffffffff8111156150fd576150fc614004565b5b615109888289016142d5565b9150509295509295909350565b6000819050919050565b600061513b615136615131846144e5565b615116565b6144e5565b9050919050565b600061514d82615120565b9050919050565b600061515f82615142565b9050919050565b61516f81615154565b82525050565b600060208201905061518a6000830184615166565b92915050565b600081905092915050565b60006151a78385615190565b93506151b4838584614284565b82840190509392505050565b60006151cd82848661519b565b91508190509392505050565b6151e281614124565b82525050565b600060a0820190506151fd6000830188614912565b61520a60208301876140ce565b61521760408301866151d9565b6152246060830185614912565b6152316080830184614912565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b600061527160188361444f565b915061527c8261523b565b602082019050919050565b600060208201905081810360008301526152a081615264565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806152ee57607f821691505b602082108103615301576153006152a7565b5b50919050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b600061536360218361444f565b915061536e82615307565b604082019050919050565b6000602082019050818103600083015261539281615356565b9050919050565b6000815190506153a8816140f8565b92915050565b6000602082840312156153c4576153c3613fff565b5b60006153d284828501615399565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61541081614505565b82525050565b60006154228383615407565b60208301905092915050565b6000602082019050919050565b6000615446826153db565b61545081856153e6565b935061545b836153f7565b8060005b8381101561548c5781516154738882615416565b975061547e8361542e565b92505060018101905061545f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154ce816140c4565b82525050565b60006154e083836154c5565b60208301905092915050565b6000602082019050919050565b600061550482615499565b61550e81856154a4565b9350615519836154b5565b8060005b8381101561554a57815161553188826154d4565b975061553c836154ec565b92505060018101905061551d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006155aa82615583565b6155b4818561558e565b93506155c4818560208601614460565b6155cd816141c7565b840191505092915050565b60006155e4838361559f565b905092915050565b6000602082019050919050565b600061560482615557565b61560e8185615562565b93508360208202850161562085615573565b8060005b8581101561565c578484038952815161563d85826155d8565b9450615648836155ec565b925060208a01995050600181019050615624565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b60006156a061569b6156968461566e565b615678565b614303565b9050919050565b6156b081615685565b82525050565b600060a08201905081810360008301526156d0818861543b565b905081810360208301526156e481876154f9565b905081810360408301526156f881866155f9565b905061570760608301856156a7565b6157146080830184614912565b9695505050505050565b60008151905061572d8161430d565b92915050565b60006020828403121561574957615748613fff565b5b60006157578482850161571e565b91505092915050565b600060c082019050818103600083015261577a818961543b565b9050818103602083015261578e81886154f9565b905081810360408301526157a281876155f9565b90506157b160608301866156a7565b6157be6080830185614912565b6157cb60a08301846140ce565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615810826140c4565b915061581b836140c4565b9250828201905080821115615833576158326157d6565b5b92915050565b600060408201905061584e60008301856140ce565b61585b60208301846140ce565b9392505050565b60006060820190506158776000830186614912565b61588460208301856140ce565b61589160408301846151d9565b949350505050565b60006158a4826140c4565b91506158af836140c4565b92508282039050818111156158c7576158c66157d6565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152615916818761543b565b9050818103602083015261592a81866154f9565b9050818103604083015261593e81856155f9565b905061594d6060830184614912565b95945050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006159b260278361444f565b91506159bd82615956565b604082019050919050565b600060208201905081810360008301526159e1816159a5565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615a4460268361444f565b9150615a4f826159e8565b604082019050919050565b60006020820190508181036000830152615a7381615a37565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000615ad660238361444f565b9150615ae182615a7a565b604082019050919050565b60006020820190508181036000830152615b0581615ac9565b9050919050565b6000608082019050615b2160008301876140ce565b615b2e60208301866151d9565b615b3b60408301856140ce565b8181036060830152615b4d818461448a565b905095945050505050565b600082825260208201905092915050565b6000615b7482615583565b615b7e8185615b58565b9350615b8e818560208601614460565b615b97816141c7565b840191505092915050565b600060a082019050615bb760008301886140ce565b615bc460208301876151d9565b615bd160408301866140ce565b8181036060830152615be3818561448a565b90508181036080830152615bf78184615b69565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000615c8560438361444f565b9150615c9082615c03565b606082019050919050565b60006020820190508181036000830152615cb481615c78565b9050919050565b6000615cc6826140c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615cf857615cf76157d6565b5b600182019050919050565b615d0c8161408e565b8114615d1757600080fd5b50565b600081519050615d2981615d03565b92915050565b600060208284031215615d4557615d44613fff565b5b6000615d5384828501615d1a565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000615d9260208361444f565b9150615d9d82615d5c565b602082019050919050565b60006020820190508181036000830152615dc181615d85565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000615e2460318361444f565b9150615e2f82615dc8565b604082019050919050565b60006020820190508181036000830152615e5381615e17565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000615eb660218361444f565b9150615ec182615e5a565b604082019050919050565b60006020820190508181036000830152615ee581615ea9565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000615f2260188361444f565b9150615f2d82615eec565b602082019050919050565b60006020820190508181036000830152615f5181615f15565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615fb460218361444f565b9150615fbf82615f58565b604082019050919050565b60006020820190508181036000830152615fe381615fa7565b9050919050565b600067ffffffffffffffff82169050919050565b600061600982615fea565b915061601483615fea565b9250828201905067ffffffffffffffff811115616034576160336157d6565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061608282614444565b61608c8185616066565b935061609c818560208601614460565b6160a5816141c7565b840191505092915050565b60006160bc8383616077565b905092915050565b6000602082019050919050565b60006160dc8261603a565b6160e68185616045565b9350836020820285016160f885616056565b8060005b85811015616134578484038952815161611585826160b0565b9450616120836160c4565b925060208a019950506001810190506160fc565b50829750879550505050505092915050565b600061616161615c61615784615fea565b615116565b6140c4565b9050919050565b61617181616146565b82525050565b60006101208201905061618d600083018c6140ce565b61619a602083018b615015565b81810360408301526161ac818a61543b565b905081810360608301526161c081896154f9565b905081810360808301526161d481886160d1565b905081810360a08301526161e881876155f9565b90506161f760c0830186616168565b61620460e0830185616168565b818103610100830152616217818461448a565b90509a9950505050505050505050565b600060408201905061623c6000830185615015565b61624960208301846140ce565b9392505050565b60006040820190506162656000830185615015565b6162726020830184615015565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006162d560278361444f565b91506162e082616279565b604082019050919050565b60006020820190508181036000830152616304816162c8565b9050919050565b6000616316826140c4565b9150616321836140c4565b925082820261632f816140c4565b91508282048414831517616346576163456157d6565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000616387826140c4565b9150616392836140c4565b9250826163a2576163a161634d565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006163ee6002836163ad565b91506163f9826163b8565b600282019050919050565b6000819050919050565b61641f61641a82614303565b616404565b82525050565b6000616430826163e1565b915061643c828561640e565b60208201915061644c828461640e565b6020820191508190509392505050565b60006080820190506164716000830187614912565b61647e60208301866151d9565b61648b6040830185614912565b6164986060830184614912565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006164d760188361444f565b91506164e2826164a1565b602082019050919050565b60006020820190508181036000830152616506816164ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000616543601f8361444f565b915061654e8261650d565b602082019050919050565b6000602082019050818103600083015261657281616536565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006165d560228361444f565b91506165e082616579565b604082019050919050565b60006020820190508181036000830152616604816165c8565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061666760228361444f565b91506166728261660b565b604082019050919050565b600060208201905081810360008301526166968161665a565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006166f960278361444f565b91506167048261669d565b604082019050919050565b60006020820190508181036000830152616728816166ec565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061678b60358361444f565b91506167968261672f565b604082019050919050565b600060208201905081810360008301526167ba8161677e565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006167f7601d8361444f565b9150616802826167c1565b602082019050919050565b60006020820190508181036000830152616826816167ea565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061688960268361444f565b91506168948261682d565b604082019050919050565b600060208201905081810360008301526168b88161687c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061691b60268361444f565b9150616926826168bf565b604082019050919050565b6000602082019050818103600083015261694a8161690e565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000616987601d8361444f565b915061699282616951565b602082019050919050565b600060208201905081810360008301526169b68161697a565b9050919050565b60006169c882615583565b6169d28185615190565b93506169e2818560208601614460565b80840191505092915050565b60006169fa82846169bd565b915081905092915050565b600060a082019050616a1a6000830188614912565b616a276020830187614912565b616a346040830186614912565b616a4160608301856140ce565b616a4e6080830184615015565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122076f7f0920f4a36dd17b990acfe35ea72436b313a782b0a06d885eb17b7488e1164736f6c63430008110033", - "deployedBytecode": "0x60806040526004361061024a5760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf146109cb578063eb9019d4146109f4578063ece40cc114610a31578063f23a6e6114610a5a578063f8ce560a14610a97578063fc0c546a14610ad457610290565b8063c28bc2fa146108e4578063c59057e41461090d578063d33219b41461094a578063dd4e2ba514610975578063deaaa7cc146109a057610290565b8063a890c910116100fd578063a890c910146107d9578063ab58fb8e14610802578063b58131b01461083f578063bc197c811461086a578063c01f9e37146108a757610290565b80637b3c71d3146106cc5780637d5e81e21461070957806397c3d334146107465780639a802a6d14610771578063a7713a70146107ae57610290565b80633932abb1116101c757806354fd4d501161018b57806354fd4d50146105c157806356781388146105ec5780635f398a141461062957806360c4247f1461066657806370b0f660146106a357610290565b80633932abb1146104a05780633bccf4fd146104cb5780633e4f49e6146105085780634385963214610545578063544ffc9c1461058257610290565b8063150b7a021161020e578063150b7a021461038e578063160cbed7146103cb5780632656227d146104085780632d63f693146104385780632fe3e2611461047557610290565b806301ffc9a71461029557806302a251a3146102d257806303420181146102fd57806306f3f9e61461033a57806306fdde031461036357610290565b36610290573073ffffffffffffffffffffffffffffffffffffffff1661026e610aff565b73ffffffffffffffffffffffffffffffffffffffff161461028e57600080fd5b005b600080fd5b3480156102a157600080fd5b506102bc60048036038101906102b79190614061565b610b0e565b6040516102c991906140a9565b60405180910390f35b3480156102de57600080fd5b506102e7610b20565b6040516102f491906140dd565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f9190614339565b610b2f565b60405161033191906140dd565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c9190614417565b610c14565b005b34801561036f57600080fd5b50610378610d0b565b60405161038591906144c3565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614543565b610d9d565b6040516103c291906145d5565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190614857565b610db1565b6040516103ff91906140dd565b60405180910390f35b610422600480360381019061041d9190614857565b61106b565b60405161042f91906140dd565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190614417565b6111b8565b60405161046c91906140dd565b60405180910390f35b34801561048157600080fd5b5061048a611226565b6040516104979190614921565b60405180910390f35b3480156104ac57600080fd5b506104b561124a565b6040516104c291906140dd565b60405180910390f35b3480156104d757600080fd5b506104f260048036038101906104ed919061493c565b611259565b6040516104ff91906140dd565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a9190614417565b6112e3565b60405161053c9190614a2e565b60405180910390f35b34801561055157600080fd5b5061056c60048036038101906105679190614a49565b6112f5565b60405161057991906140a9565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190614417565b611360565b6040516105b893929190614a89565b60405180910390f35b3480156105cd57600080fd5b506105d6611398565b6040516105e391906144c3565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190614ac0565b6113d5565b60405161062091906140dd565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190614b00565b611406565b60405161065d91906140dd565b60405180910390f35b34801561067257600080fd5b5061068d60048036038101906106889190614417565b611470565b60405161069a91906140dd565b60405180910390f35b3480156106af57600080fd5b506106ca60048036038101906106c59190614417565b6115bc565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190614ba4565b6116b3565b60405161070091906140dd565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b9190614cb9565b61171b565b60405161073d91906140dd565b60405180910390f35b34801561075257600080fd5b5061075b611733565b60405161076891906140dd565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190614d90565b61173c565b6040516107a591906140dd565b60405180910390f35b3480156107ba57600080fd5b506107c3611752565b6040516107d091906140dd565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190614e4f565b61177b565b005b34801561080e57600080fd5b5061082960048036038101906108249190614417565b611872565b60405161083691906140dd565b60405180910390f35b34801561084b57600080fd5b5061085461193f565b60405161086191906140dd565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190614e7c565b61194e565b60405161089e91906145d5565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190614417565b611963565b6040516108db91906140dd565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190614fa1565b6119d1565b005b34801561091957600080fd5b50610934600480360381019061092f9190614857565b611b12565b60405161094191906140dd565b60405180910390f35b34801561095657600080fd5b5061095f611b4e565b60405161096c9190615024565b60405180910390f35b34801561098157600080fd5b5061098a611b78565b60405161099791906144c3565b60405180910390f35b3480156109ac57600080fd5b506109b5611bb5565b6040516109c29190614921565b60405180910390f35b3480156109d757600080fd5b506109f260048036038101906109ed9190614417565b611bd9565b005b348015610a0057600080fd5b50610a1b6004803603810190610a16919061503f565b611cd0565b604051610a2891906140dd565b60405180910390f35b348015610a3d57600080fd5b50610a586004803603810190610a539190614417565b611cec565b005b348015610a6657600080fd5b50610a816004803603810190610a7c919061507f565b611de3565b604051610a8e91906145d5565b60405180910390f35b348015610aa357600080fd5b50610abe6004803603810190610ab99190614417565b611df8565b604051610acb91906140dd565b60405180910390f35b348015610ae057600080fd5b50610ae9611e0a565b604051610af69190615175565b60405180910390f35b6000610b09612189565b905090565b6000610b19826121b3565b9050919050565b6000610b2a61222d565b905090565b600080610bb2610baa7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610b6b9291906151c0565b60405180910390208b80519060200120604051602001610b8f9594939291906151e8565b60405160208183030381529060405280519060200120612237565b868686612251565b9050610c058a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a61227c565b91505098975050505050505050565b610c1c610aff565b73ffffffffffffffffffffffffffffffffffffffff16610c3a612438565b73ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8790615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16610caf610aff565b73ffffffffffffffffffffffffffffffffffffffff1614610cff576000610cd4612440565b604051610ce29291906151c0565b604051809103902090505b80610cf8600261244d565b03610ced57505b610d0881612529565b50565b606060008054610d1a906152d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d46906152d6565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b5050505050905090565b600063150b7a0260e01b9050949350505050565b600080610dc086868686611b12565b905060046007811115610dd657610dd56149b7565b5b610ddf826112e3565b6007811115610df157610df06149b7565b5b14610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890615379565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec491906153ae565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610f2a9594939291906156b6565b602060405180830381865afa158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190615733565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401610fe896959493929190615760565b600060405180830381600087803b15801561100257600080fd5b505af1158015611016573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426110489190615805565b604051611056929190615839565b60405180910390a18192505050949350505050565b60008061107a86868686611b12565b90506000611087826112e3565b90506004600781111561109d5761109c6149b7565b5b8160078111156110b0576110af6149b7565b5b14806110e05750600560078111156110cb576110ca6149b7565b5b8160078111156110de576110dd6149b7565b5b145b61111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690615379565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f8260405161117c91906140dd565b60405180910390a161119182888888886126dd565b61119e82888888886127c0565b6111ab82888888886127d4565b8192505050949350505050565b6000611215600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b600061125461283d565b905090565b6000806112ba6112b27f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f898960405160200161129793929190615862565b60405160208183030381529060405280519060200120612237565b868686612251565b90506112d787828860405180602001604052806000815250612847565b91505095945050505050565b60006112ee82612867565b9050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806113e0612438565b90506113fd84828560405180602001604052806000815250612847565b91505092915050565b600080611411612438565b905061146487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508761227c565b91505095945050505050565b600080600960000180549050905060008103611491576008549150506115b7565b600060096000016001836114a59190615899565b815481106114b6576114b56158cd565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161159e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506115b7565b6115b2846009612a3a90919063ffffffff16565b925050505b919050565b6115c4610aff565b73ffffffffffffffffffffffffffffffffffffffff166115e2612438565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611657610aff565b73ffffffffffffffffffffffffffffffffffffffff16146116a757600061167c612440565b60405161168a9291906151c0565b604051809103902090505b806116a0600261244d565b0361169557505b6116b081612b92565b50565b6000806116be612438565b905061171086828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612847565b915050949350505050565b600061172985858585612bd7565b9050949350505050565b60006064905090565b6000611749848484612ede565b90509392505050565b600080600960000180549050146117725761176d600961209b565b611776565b6008545b905090565b611783610aff565b73ffffffffffffffffffffffffffffffffffffffff166117a1612438565b73ffffffffffffffffffffffffffffffffffffffff16146117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611816610aff565b73ffffffffffffffffffffffffffffffffffffffff161461186657600061183b612440565b6040516118499291906151c0565b604051809103902090505b8061185f600261244d565b0361185457505b61186f81612f85565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b81526004016118e39190614921565b602060405180830381865afa158015611900573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192491906153ae565b9050600181146119345780611937565b60005b915050919050565b6000611949613024565b905090565b600063bc197c8160e01b905095945050505050565b60006119c0600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff169050919050565b6119d9610aff565b73ffffffffffffffffffffffffffffffffffffffff166119f7612438565b73ffffffffffffffffffffffffffffffffffffffff1614611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611a6c610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611abc576000611a91612440565b604051611a9f9291906151c0565b604051809103902090505b80611ab5600261244d565b03611aaa57505b611b0b8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508561302e565b5050505050565b600084848484604051602001611b2b94939291906158fc565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b611be1610aff565b73ffffffffffffffffffffffffffffffffffffffff16611bff612438565b73ffffffffffffffffffffffffffffffffffffffff1614611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611c74610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611cc4576000611c99612440565b604051611ca79291906151c0565b604051809103902090505b80611cbd600261244d565b03611cb257505b611ccd8161305d565b50565b6000611ce48383611cdf6130e5565b612ede565b905092915050565b611cf4610aff565b73ffffffffffffffffffffffffffffffffffffffff16611d12612438565b73ffffffffffffffffffffffffffffffffffffffff1614611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90615287565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611d87610aff565b73ffffffffffffffffffffffffffffffffffffffff1614611dd7576000611dac612440565b604051611dba9291906151c0565b604051809103902090505b80611dd0600261244d565b03611dc557505b611de0816130fc565b50565b600063f23a6e6160e01b905095945050505050565b6000611e0382613141565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e88906159c8565b60405180910390fd5b819050919050565b6000806000846000018054905090506000611eb38661209b565b9050600082118015611f0957504386600001600184611ed29190615899565b81548110611ee357611ee26158cd565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f9957611f1785611e2e565b86600001600184611f289190615899565b81548110611f3957611f386158cd565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061208c565b856000016040518060400160405280611fb143612136565b63ffffffff168152602001611fc588611e2e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811461210d57826000016001826120c19190615899565b815481106120d2576120d16158cd565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612110565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115612181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217890615a5a565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612226575061222582613209565b5b9050919050565b6000600554905090565b600061224a61224461336e565b83613488565b9050919050565b6000806000612262878787876134bb565b9150915061226f816135c7565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156122a8576122a76149b7565b5b6122b1886112e3565b60078111156122c3576122c26149b7565b5b14612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fa90615aec565b60405180910390fd5b600061236287612352846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061282f565b67ffffffffffffffff1686612ede565b90506123718888888488613793565b60008451036123d3578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4898884896040516123c69493929190615b0c565b60405180910390a261242a565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612421959493929190615ba2565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b600061245882613997565b1561248f576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b612531611733565b811115612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a90615c9b565b60405180910390fd5b600061257d611752565b90506000811415801561259857506000600960000180549050145b1561268a5760096000016040518060400160405280600063ffffffff1681526020016125c384611e2e565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b61269e826009611e9990919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516126d1929190615839565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff166126fc610aff565b73ffffffffffffffffffffffffffffffffffffffff16146127b95760005b84518110156127b7573073ffffffffffffffffffffffffffffffffffffffff1685828151811061274d5761274c6158cd565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036127a6576127a5838281518110612786576127856158cd565b5b60200260200101518051906020012060026139cc90919063ffffffff16565b5b806127b090615cbb565b905061271a565b505b5050505050565b6127cd8585858585613a48565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff166127f3610aff565b73ffffffffffffffffffffffffffffffffffffffff1614612828576128186002613997565b612827576128266002613ae6565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b600061285d858585856128586130e5565b61227c565b9050949350505050565b60008061287383613b67565b905060046007811115612889576128886149b7565b5b81600781111561289c5761289b6149b7565b5b146128aa5780915050612a35565b6000600b60008581526020019081526020016000205490506000801b81036128d6578192505050612a35565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016129319190614921565b602060405180830381865afa15801561294e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129729190615d2f565b1561298257600792505050612a35565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016129dd9190614921565b602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e9190615d2f565b15612a2e57600592505050612a35565b6002925050505b919050565b6000438210612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590615da8565b60405180910390fd5b60008360000180549050905060005b81811015612b02576000612aa18284613c7b565b905084866000018281548110612aba57612ab96158cd565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612aec57809250612afc565b600181612af99190615805565b91505b50612a8d565b60008214612b675784600001600183612b1b9190615899565b81548110612b2c57612b2b6158cd565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612b6a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051612bc5929190615839565b60405180910390a18060048190555050565b6000612be161193f565b612bfe612bec612438565b600143612bf99190615899565b611cd0565b1015612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690615e3a565b60405180910390fd5b6000612c548686868680519060200120611b12565b90508451865114612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9190615ecc565b60405180910390fd5b8351865114612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd590615ecc565b60405180910390fd5b6000865111612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1990615f38565b60405180910390fd5b6000600160008381526020019081526020016000209050612d82816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613ca1565b612dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db890615fca565b60405180910390fd5b6000612dd3612dce61124a565b613cbb565b612ddc43613cbb565b612de69190615ffe565b90506000612dfa612df5610b20565b613cbb565b82612e059190615ffe565b9050612e1d8284600001613d1290919063ffffffff16565b612e338184600101613d1290919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084612e5d612438565b8b8b8d5167ffffffffffffffff811115612e7a57612e796141d8565b5b604051908082528060200260200182016040528015612ead57816020015b6060815260200190600190039081612e985790505b508c88888e604051612ec799989796959493929190616177565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612f3b929190616227565b602060405180830381865afa158015612f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7c91906153ae565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051612fd8929190616250565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b6060613054848484604051806060016040528060298152602001616a5960299139613d41565b90509392505050565b600081116130a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613097906162eb565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600554826040516130d3929190615839565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054616006548260405161312f929190615839565b60405180910390a18060068190555050565b600061314b611733565b61315483611470565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016131ad91906140dd565b602060405180830381865afa1580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee91906153ae565b6131f8919061630b565b613202919061637c565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806132ef57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061335757507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613367575061336682613e55565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156133ea57507f000000000000000000000000000000000000000000000000000000000000000046145b15613417577f00000000000000000000000000000000000000000000000000000000000000009050613485565b6134827f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613ebf565b90505b90565b6000828260405160200161349d929190616425565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134f65760006003915091506135be565b601b8560ff161415801561350e5750601c8560ff1614155b156135205760006004915091506135be565b600060018787878760405160008152602001604052604051613545949392919061645c565b6020604051602081039080840390855afa158015613567573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135b5576000600192509250506135be565b80600092509250505b94509492505050565b600060048111156135db576135da6149b7565b5b8160048111156135ee576135ed6149b7565b5b03156137905760016004811115613608576136076149b7565b5b81600481111561361b5761361a6149b7565b5b0361365b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613652906164ed565b60405180910390fd5b6002600481111561366f5761366e6149b7565b5b816004811115613682576136816149b7565b5b036136c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b990616559565b60405180910390fd5b600360048111156136d6576136d56149b7565b5b8160048111156136e9576136e86149b7565b5b03613729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613720906165eb565b60405180910390fd5b60048081111561373c5761373b6149b7565b5b81600481111561374f5761374e6149b7565b5b0361378f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137869061667d565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613839576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138309061670f565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060028111156138a7576138a66149b7565b5b60ff168460ff16036138d357828160000160008282546138c79190615805565b9250508190555061398f565b600160028111156138e7576138e66149b7565b5b60ff168460ff160361391357828160010160008282546139079190615805565b9250508190555061398e565b600280811115613926576139256149b7565b5b60ff168460ff160361395257828160020160008282546139469190615805565b9250508190555061398d565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613984906167a1565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401613aad9594939291906156b6565b6000604051808303818588803b158015613ac657600080fd5b505af1158015613ada573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615613ba0576007915050613c76565b8060020160019054906101000a900460ff1615613bc1576002915050613c76565b6000613bcc846111b8565b905060008103613c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c089061680d565b60405180910390fd5b438110613c2357600092505050613c76565b6000613c2e85611963565b9050438110613c435760019350505050613c76565b613c4c85613ef9565b8015613c5d5750613c5c85613f40565b5b15613c6e5760049350505050613c76565b600393505050505b919050565b60006002828418613c8c919061637c565b828416613c999190615805565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115613d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d019061689f565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015613d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7d90616931565b60405180910390fd5b613d8f85613f6b565b613dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc59061699d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613df791906169ee565b60006040518083038185875af1925050503d8060008114613e34576040519150601f19603f3d011682016040523d82523d6000602084013e613e39565b606091505b5091509150613e49828286613f8e565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001613eda959493929190616a05565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154613f259190615805565b613f36613f31856111b8565b611df8565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613f9e57829050613fee565b600083511115613fb15782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fe591906144c3565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61403e81614009565b811461404957600080fd5b50565b60008135905061405b81614035565b92915050565b60006020828403121561407757614076613fff565b5b60006140858482850161404c565b91505092915050565b60008115159050919050565b6140a38161408e565b82525050565b60006020820190506140be600083018461409a565b92915050565b6000819050919050565b6140d7816140c4565b82525050565b60006020820190506140f260008301846140ce565b92915050565b614101816140c4565b811461410c57600080fd5b50565b60008135905061411e816140f8565b92915050565b600060ff82169050919050565b61413a81614124565b811461414557600080fd5b50565b60008135905061415781614131565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126141825761418161415d565b5b8235905067ffffffffffffffff81111561419f5761419e614162565b5b6020830191508360018202830111156141bb576141ba614167565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614210826141c7565b810181811067ffffffffffffffff8211171561422f5761422e6141d8565b5b80604052505050565b6000614242613ff5565b905061424e8282614207565b919050565b600067ffffffffffffffff82111561426e5761426d6141d8565b5b614277826141c7565b9050602081019050919050565b82818337600083830152505050565b60006142a66142a184614253565b614238565b9050828152602081018484840111156142c2576142c16141c2565b5b6142cd848285614284565b509392505050565b600082601f8301126142ea576142e961415d565b5b81356142fa848260208601614293565b91505092915050565b6000819050919050565b61431681614303565b811461432157600080fd5b50565b6000813590506143338161430d565b92915050565b60008060008060008060008060e0898b03121561435957614358613fff565b5b60006143678b828c0161410f565b98505060206143788b828c01614148565b975050604089013567ffffffffffffffff81111561439957614398614004565b5b6143a58b828c0161416c565b9650965050606089013567ffffffffffffffff8111156143c8576143c7614004565b5b6143d48b828c016142d5565b94505060806143e58b828c01614148565b93505060a06143f68b828c01614324565b92505060c06144078b828c01614324565b9150509295985092959890939650565b60006020828403121561442d5761442c613fff565b5b600061443b8482850161410f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561447e578082015181840152602081019050614463565b60008484015250505050565b600061449582614444565b61449f818561444f565b93506144af818560208601614460565b6144b8816141c7565b840191505092915050565b600060208201905081810360008301526144dd818461448a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614510826144e5565b9050919050565b61452081614505565b811461452b57600080fd5b50565b60008135905061453d81614517565b92915050565b6000806000806080858703121561455d5761455c613fff565b5b600061456b8782880161452e565b945050602061457c8782880161452e565b935050604061458d8782880161410f565b925050606085013567ffffffffffffffff8111156145ae576145ad614004565b5b6145ba878288016142d5565b91505092959194509250565b6145cf81614009565b82525050565b60006020820190506145ea60008301846145c6565b92915050565b600067ffffffffffffffff82111561460b5761460a6141d8565b5b602082029050602081019050919050565b600061462f61462a846145f0565b614238565b9050808382526020820190506020840283018581111561465257614651614167565b5b835b8181101561467b5780614667888261452e565b845260208401935050602081019050614654565b5050509392505050565b600082601f83011261469a5761469961415d565b5b81356146aa84826020860161461c565b91505092915050565b600067ffffffffffffffff8211156146ce576146cd6141d8565b5b602082029050602081019050919050565b60006146f26146ed846146b3565b614238565b9050808382526020820190506020840283018581111561471557614714614167565b5b835b8181101561473e578061472a888261410f565b845260208401935050602081019050614717565b5050509392505050565b600082601f83011261475d5761475c61415d565b5b813561476d8482602086016146df565b91505092915050565b600067ffffffffffffffff821115614791576147906141d8565b5b602082029050602081019050919050565b60006147b56147b084614776565b614238565b905080838252602082019050602084028301858111156147d8576147d7614167565b5b835b8181101561481f57803567ffffffffffffffff8111156147fd576147fc61415d565b5b80860161480a89826142d5565b855260208501945050506020810190506147da565b5050509392505050565b600082601f83011261483e5761483d61415d565b5b813561484e8482602086016147a2565b91505092915050565b6000806000806080858703121561487157614870613fff565b5b600085013567ffffffffffffffff81111561488f5761488e614004565b5b61489b87828801614685565b945050602085013567ffffffffffffffff8111156148bc576148bb614004565b5b6148c887828801614748565b935050604085013567ffffffffffffffff8111156148e9576148e8614004565b5b6148f587828801614829565b925050606061490687828801614324565b91505092959194509250565b61491b81614303565b82525050565b60006020820190506149366000830184614912565b92915050565b600080600080600060a0868803121561495857614957613fff565b5b60006149668882890161410f565b955050602061497788828901614148565b945050604061498888828901614148565b935050606061499988828901614324565b92505060806149aa88828901614324565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600881106149f7576149f66149b7565b5b50565b6000819050614a08826149e6565b919050565b6000614a18826149fa565b9050919050565b614a2881614a0d565b82525050565b6000602082019050614a436000830184614a1f565b92915050565b60008060408385031215614a6057614a5f613fff565b5b6000614a6e8582860161410f565b9250506020614a7f8582860161452e565b9150509250929050565b6000606082019050614a9e60008301866140ce565b614aab60208301856140ce565b614ab860408301846140ce565b949350505050565b60008060408385031215614ad757614ad6613fff565b5b6000614ae58582860161410f565b9250506020614af685828601614148565b9150509250929050565b600080600080600060808688031215614b1c57614b1b613fff565b5b6000614b2a8882890161410f565b9550506020614b3b88828901614148565b945050604086013567ffffffffffffffff811115614b5c57614b5b614004565b5b614b688882890161416c565b9350935050606086013567ffffffffffffffff811115614b8b57614b8a614004565b5b614b97888289016142d5565b9150509295509295909350565b60008060008060608587031215614bbe57614bbd613fff565b5b6000614bcc8782880161410f565b9450506020614bdd87828801614148565b935050604085013567ffffffffffffffff811115614bfe57614bfd614004565b5b614c0a8782880161416c565b925092505092959194509250565b600067ffffffffffffffff821115614c3357614c326141d8565b5b614c3c826141c7565b9050602081019050919050565b6000614c5c614c5784614c18565b614238565b905082815260208101848484011115614c7857614c776141c2565b5b614c83848285614284565b509392505050565b600082601f830112614ca057614c9f61415d565b5b8135614cb0848260208601614c49565b91505092915050565b60008060008060808587031215614cd357614cd2613fff565b5b600085013567ffffffffffffffff811115614cf157614cf0614004565b5b614cfd87828801614685565b945050602085013567ffffffffffffffff811115614d1e57614d1d614004565b5b614d2a87828801614748565b935050604085013567ffffffffffffffff811115614d4b57614d4a614004565b5b614d5787828801614829565b925050606085013567ffffffffffffffff811115614d7857614d77614004565b5b614d8487828801614c8b565b91505092959194509250565b600080600060608486031215614da957614da8613fff565b5b6000614db78682870161452e565b9350506020614dc88682870161410f565b925050604084013567ffffffffffffffff811115614de957614de8614004565b5b614df5868287016142d5565b9150509250925092565b6000614e0a826144e5565b9050919050565b6000614e1c82614dff565b9050919050565b614e2c81614e11565b8114614e3757600080fd5b50565b600081359050614e4981614e23565b92915050565b600060208284031215614e6557614e64613fff565b5b6000614e7384828501614e3a565b91505092915050565b600080600080600060a08688031215614e9857614e97613fff565b5b6000614ea68882890161452e565b9550506020614eb78882890161452e565b945050604086013567ffffffffffffffff811115614ed857614ed7614004565b5b614ee488828901614748565b935050606086013567ffffffffffffffff811115614f0557614f04614004565b5b614f1188828901614748565b925050608086013567ffffffffffffffff811115614f3257614f31614004565b5b614f3e888289016142d5565b9150509295509295909350565b60008083601f840112614f6157614f6061415d565b5b8235905067ffffffffffffffff811115614f7e57614f7d614162565b5b602083019150836001820283011115614f9a57614f99614167565b5b9250929050565b60008060008060608587031215614fbb57614fba613fff565b5b6000614fc98782880161452e565b9450506020614fda8782880161410f565b935050604085013567ffffffffffffffff811115614ffb57614ffa614004565b5b61500787828801614f4b565b925092505092959194509250565b61501e81614505565b82525050565b60006020820190506150396000830184615015565b92915050565b6000806040838503121561505657615055613fff565b5b60006150648582860161452e565b92505060206150758582860161410f565b9150509250929050565b600080600080600060a0868803121561509b5761509a613fff565b5b60006150a98882890161452e565b95505060206150ba8882890161452e565b94505060406150cb8882890161410f565b93505060606150dc8882890161410f565b925050608086013567ffffffffffffffff8111156150fd576150fc614004565b5b615109888289016142d5565b9150509295509295909350565b6000819050919050565b600061513b615136615131846144e5565b615116565b6144e5565b9050919050565b600061514d82615120565b9050919050565b600061515f82615142565b9050919050565b61516f81615154565b82525050565b600060208201905061518a6000830184615166565b92915050565b600081905092915050565b60006151a78385615190565b93506151b4838584614284565b82840190509392505050565b60006151cd82848661519b565b91508190509392505050565b6151e281614124565b82525050565b600060a0820190506151fd6000830188614912565b61520a60208301876140ce565b61521760408301866151d9565b6152246060830185614912565b6152316080830184614912565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b600061527160188361444f565b915061527c8261523b565b602082019050919050565b600060208201905081810360008301526152a081615264565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806152ee57607f821691505b602082108103615301576153006152a7565b5b50919050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b600061536360218361444f565b915061536e82615307565b604082019050919050565b6000602082019050818103600083015261539281615356565b9050919050565b6000815190506153a8816140f8565b92915050565b6000602082840312156153c4576153c3613fff565b5b60006153d284828501615399565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61541081614505565b82525050565b60006154228383615407565b60208301905092915050565b6000602082019050919050565b6000615446826153db565b61545081856153e6565b935061545b836153f7565b8060005b8381101561548c5781516154738882615416565b975061547e8361542e565b92505060018101905061545f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154ce816140c4565b82525050565b60006154e083836154c5565b60208301905092915050565b6000602082019050919050565b600061550482615499565b61550e81856154a4565b9350615519836154b5565b8060005b8381101561554a57815161553188826154d4565b975061553c836154ec565b92505060018101905061551d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006155aa82615583565b6155b4818561558e565b93506155c4818560208601614460565b6155cd816141c7565b840191505092915050565b60006155e4838361559f565b905092915050565b6000602082019050919050565b600061560482615557565b61560e8185615562565b93508360208202850161562085615573565b8060005b8581101561565c578484038952815161563d85826155d8565b9450615648836155ec565b925060208a01995050600181019050615624565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b60006156a061569b6156968461566e565b615678565b614303565b9050919050565b6156b081615685565b82525050565b600060a08201905081810360008301526156d0818861543b565b905081810360208301526156e481876154f9565b905081810360408301526156f881866155f9565b905061570760608301856156a7565b6157146080830184614912565b9695505050505050565b60008151905061572d8161430d565b92915050565b60006020828403121561574957615748613fff565b5b60006157578482850161571e565b91505092915050565b600060c082019050818103600083015261577a818961543b565b9050818103602083015261578e81886154f9565b905081810360408301526157a281876155f9565b90506157b160608301866156a7565b6157be6080830185614912565b6157cb60a08301846140ce565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615810826140c4565b915061581b836140c4565b9250828201905080821115615833576158326157d6565b5b92915050565b600060408201905061584e60008301856140ce565b61585b60208301846140ce565b9392505050565b60006060820190506158776000830186614912565b61588460208301856140ce565b61589160408301846151d9565b949350505050565b60006158a4826140c4565b91506158af836140c4565b92508282039050818111156158c7576158c66157d6565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152615916818761543b565b9050818103602083015261592a81866154f9565b9050818103604083015261593e81856155f9565b905061594d6060830184614912565b95945050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006159b260278361444f565b91506159bd82615956565b604082019050919050565b600060208201905081810360008301526159e1816159a5565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615a4460268361444f565b9150615a4f826159e8565b604082019050919050565b60006020820190508181036000830152615a7381615a37565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000615ad660238361444f565b9150615ae182615a7a565b604082019050919050565b60006020820190508181036000830152615b0581615ac9565b9050919050565b6000608082019050615b2160008301876140ce565b615b2e60208301866151d9565b615b3b60408301856140ce565b8181036060830152615b4d818461448a565b905095945050505050565b600082825260208201905092915050565b6000615b7482615583565b615b7e8185615b58565b9350615b8e818560208601614460565b615b97816141c7565b840191505092915050565b600060a082019050615bb760008301886140ce565b615bc460208301876151d9565b615bd160408301866140ce565b8181036060830152615be3818561448a565b90508181036080830152615bf78184615b69565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000615c8560438361444f565b9150615c9082615c03565b606082019050919050565b60006020820190508181036000830152615cb481615c78565b9050919050565b6000615cc6826140c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615cf857615cf76157d6565b5b600182019050919050565b615d0c8161408e565b8114615d1757600080fd5b50565b600081519050615d2981615d03565b92915050565b600060208284031215615d4557615d44613fff565b5b6000615d5384828501615d1a565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000615d9260208361444f565b9150615d9d82615d5c565b602082019050919050565b60006020820190508181036000830152615dc181615d85565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000615e2460318361444f565b9150615e2f82615dc8565b604082019050919050565b60006020820190508181036000830152615e5381615e17565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000615eb660218361444f565b9150615ec182615e5a565b604082019050919050565b60006020820190508181036000830152615ee581615ea9565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000615f2260188361444f565b9150615f2d82615eec565b602082019050919050565b60006020820190508181036000830152615f5181615f15565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615fb460218361444f565b9150615fbf82615f58565b604082019050919050565b60006020820190508181036000830152615fe381615fa7565b9050919050565b600067ffffffffffffffff82169050919050565b600061600982615fea565b915061601483615fea565b9250828201905067ffffffffffffffff811115616034576160336157d6565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061608282614444565b61608c8185616066565b935061609c818560208601614460565b6160a5816141c7565b840191505092915050565b60006160bc8383616077565b905092915050565b6000602082019050919050565b60006160dc8261603a565b6160e68185616045565b9350836020820285016160f885616056565b8060005b85811015616134578484038952815161611585826160b0565b9450616120836160c4565b925060208a019950506001810190506160fc565b50829750879550505050505092915050565b600061616161615c61615784615fea565b615116565b6140c4565b9050919050565b61617181616146565b82525050565b60006101208201905061618d600083018c6140ce565b61619a602083018b615015565b81810360408301526161ac818a61543b565b905081810360608301526161c081896154f9565b905081810360808301526161d481886160d1565b905081810360a08301526161e881876155f9565b90506161f760c0830186616168565b61620460e0830185616168565b818103610100830152616217818461448a565b90509a9950505050505050505050565b600060408201905061623c6000830185615015565b61624960208301846140ce565b9392505050565b60006040820190506162656000830185615015565b6162726020830184615015565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006162d560278361444f565b91506162e082616279565b604082019050919050565b60006020820190508181036000830152616304816162c8565b9050919050565b6000616316826140c4565b9150616321836140c4565b925082820261632f816140c4565b91508282048414831517616346576163456157d6565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000616387826140c4565b9150616392836140c4565b9250826163a2576163a161634d565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006163ee6002836163ad565b91506163f9826163b8565b600282019050919050565b6000819050919050565b61641f61641a82614303565b616404565b82525050565b6000616430826163e1565b915061643c828561640e565b60208201915061644c828461640e565b6020820191508190509392505050565b60006080820190506164716000830187614912565b61647e60208301866151d9565b61648b6040830185614912565b6164986060830184614912565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006164d760188361444f565b91506164e2826164a1565b602082019050919050565b60006020820190508181036000830152616506816164ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000616543601f8361444f565b915061654e8261650d565b602082019050919050565b6000602082019050818103600083015261657281616536565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006165d560228361444f565b91506165e082616579565b604082019050919050565b60006020820190508181036000830152616604816165c8565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061666760228361444f565b91506166728261660b565b604082019050919050565b600060208201905081810360008301526166968161665a565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006166f960278361444f565b91506167048261669d565b604082019050919050565b60006020820190508181036000830152616728816166ec565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061678b60358361444f565b91506167968261672f565b604082019050919050565b600060208201905081810360008301526167ba8161677e565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006167f7601d8361444f565b9150616802826167c1565b602082019050919050565b60006020820190508181036000830152616826816167ea565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061688960268361444f565b91506168948261682d565b604082019050919050565b600060208201905081810360008301526168b88161687c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061691b60268361444f565b9150616926826168bf565b604082019050919050565b6000602082019050818103600083015261694a8161690e565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000616987601d8361444f565b915061699282616951565b602082019050919050565b600060208201905081810360008301526169b68161697a565b9050919050565b60006169c882615583565b6169d28185615190565b93506169e2818560208601614460565b80840191505092915050565b60006169fa82846169bd565b915081905092915050565b600060a082019050616a1a6000830188614912565b616a276020830187614912565b616a346040830186614912565b616a4160608301856140ce565b616a4e6080830184615015565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a264697066735822122076f7f0920f4a36dd17b990acfe35ea72436b313a782b0a06d885eb17b7488e1164736f6c63430008110033", - "devdoc": { - "errors": { - "Empty()": [ - { - "details": "An operation (e.g. {front}) couldn't be completed due to the queue being empty." - } - ] - }, - "kind": "dev", - "methods": { - "COUNTING_MODE()": { - "details": "See {IGovernor-COUNTING_MODE}." - }, - "castVote(uint256,uint8)": { - "details": "See {IGovernor-castVote}." - }, - "castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)": { - "details": "See {IGovernor-castVoteBySig}." - }, - "castVoteWithReason(uint256,uint8,string)": { - "details": "See {IGovernor-castVoteWithReason}." - }, - "castVoteWithReasonAndParams(uint256,uint8,string,bytes)": { - "details": "See {IGovernor-castVoteWithReasonAndParams}." - }, - "castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)": { - "details": "See {IGovernor-castVoteWithReasonAndParamsBySig}." - }, - "execute(address[],uint256[],bytes[],bytes32)": { - "details": "See {IGovernor-execute}." - }, - "getVotes(address,uint256)": { - "details": "See {IGovernor-getVotes}." - }, - "getVotesWithParams(address,uint256,bytes)": { - "details": "See {IGovernor-getVotesWithParams}." - }, - "hasVoted(uint256,address)": { - "details": "See {IGovernor-hasVoted}." - }, - "hashProposal(address[],uint256[],bytes[],bytes32)": { - "details": "See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts." - }, - "name()": { - "details": "See {IGovernor-name}." - }, - "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { - "details": "See {IERC1155Receiver-onERC1155BatchReceived}." - }, - "onERC1155Received(address,address,uint256,uint256,bytes)": { - "details": "See {IERC1155Receiver-onERC1155Received}." - }, - "onERC721Received(address,address,uint256,bytes)": { - "details": "See {IERC721Receiver-onERC721Received}." - }, - "proposalDeadline(uint256)": { - "details": "See {IGovernor-proposalDeadline}." - }, - "proposalEta(uint256)": { - "details": "Public accessor to check the eta of a queued proposal" - }, - "proposalSnapshot(uint256)": { - "details": "See {IGovernor-proposalSnapshot}." - }, - "proposalVotes(uint256)": { - "details": "Accessor to the internal vote counts." - }, - "queue(address[],uint256[],bytes[],bytes32)": { - "details": "Function to queue a proposal to the timelock." - }, - "quorumDenominator()": { - "details": "Returns the quorum denominator. Defaults to 100, but may be overridden." - }, - "quorumNumerator()": { - "details": "Returns the current quorum numerator. See {quorumDenominator}." - }, - "quorumNumerator(uint256)": { - "details": "Returns the quorum numerator at a specific block number. See {quorumDenominator}." - }, - "relay(address,uint256,bytes)": { - "details": "Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant." - }, - "setProposalThreshold(uint256)": { - "details": "Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event." - }, - "setVotingDelay(uint256)": { - "details": "Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event." - }, - "setVotingPeriod(uint256)": { - "details": "Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event." - }, - "timelock()": { - "details": "Public accessor to check the address of the timelock" - }, - "updateQuorumNumerator(uint256)": { - "details": "Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator." - }, - "updateTimelock(address)": { - "details": "Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals." - }, - "version()": { - "details": "See {IGovernor-version}." - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 565, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_name", - "offset": 0, - "slot": "0", - "type": "t_string_storage" - }, - { - "astId": 570, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_proposals", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_uint256,t_struct(ProposalCore)563_storage)" - }, - { - "astId": 573, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_governanceCall", - "offset": 0, - "slot": "2", - "type": "t_struct(Bytes32Deque)9759_storage" - }, - { - "astId": 3238, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_votingDelay", - "offset": 0, - "slot": "4", - "type": "t_uint256" - }, - { - "astId": 3240, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_votingPeriod", - "offset": 0, - "slot": "5", - "type": "t_uint256" - }, - { - "astId": 3242, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_proposalThreshold", - "offset": 0, - "slot": "6", - "type": "t_uint256" - }, - { - "astId": 3030, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_proposalVotes", - "offset": 0, - "slot": "7", - "type": "t_mapping(t_uint256,t_struct(ProposalVote)3025_storage)" - }, - { - "astId": 3841, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_quorumNumerator", - "offset": 0, - "slot": "8", - "type": "t_uint256" - }, - { - "astId": 3844, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_quorumNumeratorHistory", - "offset": 0, - "slot": "9", - "type": "t_struct(History)6052_storage" - }, - { - "astId": 3421, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_timelock", - "offset": 0, - "slot": "10", - "type": "t_contract(TimelockController)3004" - }, - { - "astId": 3425, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_timelockIds", - "offset": 0, - "slot": "11", - "type": "t_mapping(t_uint256,t_bytes32)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_struct(Checkpoint)6047_storage)dyn_storage": { - "base": "t_struct(Checkpoint)6047_storage", - "encoding": "dynamic_array", - "label": "struct Checkpoints.Checkpoint[]", - "numberOfBytes": "32" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(TimelockController)3004": { - "encoding": "inplace", - "label": "contract TimelockController", - "numberOfBytes": "20" - }, - "t_int128": { - "encoding": "inplace", - "label": "int128", - "numberOfBytes": "16" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_int128,t_bytes32)": { - "encoding": "mapping", - "key": "t_int128", - "label": "mapping(int128 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_mapping(t_uint256,t_bytes32)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bytes32)", - "numberOfBytes": "32", - "value": "t_bytes32" - }, - "t_mapping(t_uint256,t_struct(ProposalCore)563_storage)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => struct Governor.ProposalCore)", - "numberOfBytes": "32", - "value": "t_struct(ProposalCore)563_storage" - }, - "t_mapping(t_uint256,t_struct(ProposalVote)3025_storage)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => struct GovernorCountingSimple.ProposalVote)", - "numberOfBytes": "32", - "value": "t_struct(ProposalVote)3025_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(BlockNumber)6704_storage": { - "encoding": "inplace", - "label": "struct Timers.BlockNumber", - "members": [ - { - "astId": 6703, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_deadline", - "offset": 0, - "slot": "0", - "type": "t_uint64" - } - ], - "numberOfBytes": "32" - }, - "t_struct(Bytes32Deque)9759_storage": { - "encoding": "inplace", - "label": "struct DoubleEndedQueue.Bytes32Deque", - "members": [ - { - "astId": 9752, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_begin", - "offset": 0, - "slot": "0", - "type": "t_int128" - }, - { - "astId": 9754, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_end", - "offset": 16, - "slot": "0", - "type": "t_int128" - }, - { - "astId": 9758, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_data", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_int128,t_bytes32)" - } - ], - "numberOfBytes": "64" - }, - "t_struct(Checkpoint)6047_storage": { - "encoding": "inplace", - "label": "struct Checkpoints.Checkpoint", - "members": [ - { - "astId": 6044, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_blockNumber", - "offset": 0, - "slot": "0", - "type": "t_uint32" - }, - { - "astId": 6046, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_value", - "offset": 4, - "slot": "0", - "type": "t_uint224" - } - ], - "numberOfBytes": "32" - }, - "t_struct(History)6052_storage": { - "encoding": "inplace", - "label": "struct Checkpoints.History", - "members": [ - { - "astId": 6051, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "_checkpoints", - "offset": 0, - "slot": "0", - "type": "t_array(t_struct(Checkpoint)6047_storage)dyn_storage" - } - ], - "numberOfBytes": "32" - }, - "t_struct(ProposalCore)563_storage": { - "encoding": "inplace", - "label": "struct Governor.ProposalCore", - "members": [ - { - "astId": 555, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "voteStart", - "offset": 0, - "slot": "0", - "type": "t_struct(BlockNumber)6704_storage" - }, - { - "astId": 558, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "voteEnd", - "offset": 0, - "slot": "1", - "type": "t_struct(BlockNumber)6704_storage" - }, - { - "astId": 560, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "executed", - "offset": 0, - "slot": "2", - "type": "t_bool" - }, - { - "astId": 562, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "canceled", - "offset": 1, - "slot": "2", - "type": "t_bool" - } - ], - "numberOfBytes": "96" - }, - "t_struct(ProposalVote)3025_storage": { - "encoding": "inplace", - "label": "struct GovernorCountingSimple.ProposalVote", - "members": [ - { - "astId": 3016, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "againstVotes", - "offset": 0, - "slot": "0", - "type": "t_uint256" - }, - { - "astId": 3018, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "forVotes", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 3020, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "abstainVotes", - "offset": 0, - "slot": "2", - "type": "t_uint256" - }, - { - "astId": 3024, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "hasVoted", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_address,t_bool)" - } - ], - "numberOfBytes": "128" - }, - "t_uint224": { - "encoding": "inplace", - "label": "uint224", - "numberOfBytes": "28" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint32": { - "encoding": "inplace", - "label": "uint32", - "numberOfBytes": "4" - }, - "t_uint64": { - "encoding": "inplace", - "label": "uint64", - "numberOfBytes": "8" - } - } - } -} \ No newline at end of file diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json deleted file mode 100644 index ba3b75b..0000000 --- a/deployments/localhost/TimeLock.json +++ /dev/null @@ -1,1173 +0,0 @@ -{ - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "abi": [ - { - "inputs": [ - { - "internalType": "uint256", - "name": "minDelay", - "type": "uint256" - }, - { - "internalType": "address[]", - "name": "proposers", - "type": "address[]" - }, - { - "internalType": "address[]", - "name": "executers", - "type": "address[]" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "CallExecuted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "predecessor", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "delay", - "type": "uint256" - } - ], - "name": "CallScheduled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - } - ], - "name": "Cancelled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldDuration", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newDuration", - "type": "uint256" - } - ], - "name": "MinDelayChange", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "inputs": [], - "name": "CANCELLER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "EXECUTOR_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PROPOSER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "TIMELOCK_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - } - ], - "name": "cancel", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "payload", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "predecessor", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - } - ], - "name": "execute", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "payloads", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "predecessor", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - } - ], - "name": "executeBatch", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "getMinDelay", - "outputs": [ - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - } - ], - "name": "getTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "timestamp", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "predecessor", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - } - ], - "name": "hashOperation", - "outputs": [ - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "payloads", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "predecessor", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - } - ], - "name": "hashOperationBatch", - "outputs": [ - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - } - ], - "name": "isOperation", - "outputs": [ - { - "internalType": "bool", - "name": "registered", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - } - ], - "name": "isOperationDone", - "outputs": [ - { - "internalType": "bool", - "name": "done", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - } - ], - "name": "isOperationPending", - "outputs": [ - { - "internalType": "bool", - "name": "pending", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - } - ], - "name": "isOperationReady", - "outputs": [ - { - "internalType": "bool", - "name": "ready", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC1155BatchReceived", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC1155Received", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC721Received", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "predecessor", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "delay", - "type": "uint256" - } - ], - "name": "schedule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "payloads", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "predecessor", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "salt", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "delay", - "type": "uint256" - } - ], - "name": "scheduleBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newDelay", - "type": "uint256" - } - ], - "name": "updateDelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "receipt": { - "to": null, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "transactionIndex": 0, - "gasUsed": "3041375", - "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000400000001000000400000000040200200000010200000000000000000000000000010000000000000000000000000000000000001400000000000020000400000000100000800000000000000000000020000000000000000000000000000000000000000000000000000000000080000000000000000000000000020000000000000000000000000000000000000001000000000000000000000000000204000000000000000000200002000000100000100200020000000000000001000000000000000000000000000000000400000000000000000", - "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105", - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "logs": [ - { - "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "topics": [ - "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", - "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - ], - "data": "0x", - "logIndex": 0, - "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" - }, - { - "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "topics": [ - "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", - "0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - ], - "data": "0x", - "logIndex": 1, - "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" - }, - { - "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "topics": [ - "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", - "0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - ], - "data": "0x", - "logIndex": 2, - "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" - }, - { - "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "topics": [ - "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", - "0xfd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" - ], - "data": "0x", - "logIndex": 3, - "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" - }, - { - "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "topics": [ - "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", - "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ], - "data": "0x", - "logIndex": 4, - "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" - }, - { - "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "topics": [ - "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", - "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0", - "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ], - "data": "0x", - "logIndex": 5, - "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" - }, - { - "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0xfd87b42a53393ca6238d2c2ed74d8446724ccec251e71ba6563f8a0159633d18", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "topics": [ - "0x11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5" - ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e10", - "logIndex": 6, - "blockHash": "0x2a447c75764863845c319cdd6f2c4b0b56eeb687d6a72089251861b9a8650105" - } - ], - "blockNumber": 3, - "cumulativeGasUsed": "3041375", - "status": 1, - "byzantium": true - }, - "args": [ - 3600, - [], - [] - ], - "numDeployments": 1, - "solcInputHash": "0a567a41a96dc2d81abbf99faae0732b", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minDelay\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"executers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"CallScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"Cancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDuration\",\"type\":\"uint256\"}],\"name\":\"MinDelayChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCELLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXECUTOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMELOCK_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"cancel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperationBatch\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationDone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationPending\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ready\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"schedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"scheduleBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDelay\",\"type\":\"uint256\"}],\"name\":\"updateDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancel(bytes32)\":{\"details\":\"Cancel an operation. Requirements: - the caller must have the 'canceller' role.\"},\"execute(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role.\"},\"executeBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role.\"},\"getMinDelay()\":{\"details\":\"Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations).\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hashOperation(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a single transaction.\"},\"hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a batch of transactions.\"},\"isOperation(bytes32)\":{\"details\":\"Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations.\"},\"isOperationDone(bytes32)\":{\"details\":\"Returns whether an operation is done or not.\"},\"isOperationPending(bytes32)\":{\"details\":\"Returns whether an operation is pending or not.\"},\"isOperationReady(bytes32)\":{\"details\":\"Returns whether an operation is ready or not.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"schedule(address,uint256,bytes,bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role.\"},\"scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"updateDelay(uint256)\":{\"details\":\"Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLock.sol\":\"TimeLock\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/TimeLock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/TimelockController.sol\\\";\\n\\ncontract TimeLock is TimelockController {\\n // minDelay: How long you have to wait before executing\\n // proposers is the list of addresses that can purpose\\n // executers: Who can execute when proposal passes\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executers\\n ) TimelockController(minDelay, proposers, executers) {}\\n}\\n\",\"keccak256\":\"0x6e48ab9ddd3998d94cdd53158d3d0d16984ac638fb4f685fae7fd734254e3c11\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162003bd838038062003bd8833981810160405281019062000037919062000779565b8282826200006c7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5806200035560201b60201c565b620000be7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc17f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001107fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e637f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7837f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001a37f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca562000197620003b860201b60201c565b620003c060201b60201c565b620001d57f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca530620003c060201b60201c565b60005b82518110156200029457620002317fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc18483815181106200021d576200021c62000813565b5b6020026020010151620003c060201b60201c565b620002807ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7838483815181106200026c576200026b62000813565b5b6020026020010151620003c060201b60201c565b806200028c9062000871565b9050620001d8565b5060005b81518110156200030557620002f17fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63838381518110620002dd57620002dc62000813565b5b6020026020010151620003c060201b60201c565b80620002fd9062000871565b905062000298565b50826002819055507f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5600084604051620003419291906200091c565b60405180910390a150505050505062000949565b60006200036883620003d660201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b620003d28282620003f560201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b620004078282620004e660201b60201c565b620004e257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000487620003b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620005798162000564565b81146200058557600080fd5b50565b60008151905062000599816200056e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005ef82620005a4565b810181811067ffffffffffffffff82111715620006115762000610620005b5565b5b80604052505050565b60006200062662000550565b9050620006348282620005e4565b919050565b600067ffffffffffffffff821115620006575762000656620005b5565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200069a826200066d565b9050919050565b620006ac816200068d565b8114620006b857600080fd5b50565b600081519050620006cc81620006a1565b92915050565b6000620006e9620006e38462000639565b6200061a565b905080838252602082019050602084028301858111156200070f576200070e62000668565b5b835b818110156200073c5780620007278882620006bb565b84526020840193505060208101905062000711565b5050509392505050565b600082601f8301126200075e576200075d6200059f565b5b815162000770848260208601620006d2565b91505092915050565b6000806000606084860312156200079557620007946200055a565b5b6000620007a58682870162000588565b935050602084015167ffffffffffffffff811115620007c957620007c86200055f565b5b620007d78682870162000746565b925050604084015167ffffffffffffffff811115620007fb57620007fa6200055f565b5b620008098682870162000746565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200087e8262000564565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620008b357620008b262000842565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000620008f3620008ed620008e784620008be565b620008c8565b62000564565b9050919050565b6200090581620008d2565b82525050565b620009168162000564565b82525050565b6000604082019050620009336000830185620008fa565b6200094260208301846200090b565b9392505050565b61327f80620009596000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", - "devdoc": { - "kind": "dev", - "methods": { - "cancel(bytes32)": { - "details": "Cancel an operation. Requirements: - the caller must have the 'canceller' role." - }, - "execute(address,uint256,bytes,bytes32,bytes32)": { - "details": "Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role." - }, - "executeBatch(address[],uint256[],bytes[],bytes32,bytes32)": { - "details": "Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role." - }, - "getMinDelay()": { - "details": "Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`." - }, - "getRoleAdmin(bytes32)": { - "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." - }, - "getTimestamp(bytes32)": { - "details": "Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations)." - }, - "grantRole(bytes32,address)": { - "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." - }, - "hasRole(bytes32,address)": { - "details": "Returns `true` if `account` has been granted `role`." - }, - "hashOperation(address,uint256,bytes,bytes32,bytes32)": { - "details": "Returns the identifier of an operation containing a single transaction." - }, - "hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)": { - "details": "Returns the identifier of an operation containing a batch of transactions." - }, - "isOperation(bytes32)": { - "details": "Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations." - }, - "isOperationDone(bytes32)": { - "details": "Returns whether an operation is done or not." - }, - "isOperationPending(bytes32)": { - "details": "Returns whether an operation is pending or not." - }, - "isOperationReady(bytes32)": { - "details": "Returns whether an operation is ready or not." - }, - "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { - "details": "See {IERC1155Receiver-onERC1155BatchReceived}." - }, - "onERC1155Received(address,address,uint256,uint256,bytes)": { - "details": "See {IERC1155Receiver-onERC1155Received}." - }, - "onERC721Received(address,address,uint256,bytes)": { - "details": "See {IERC721Receiver-onERC721Received}." - }, - "renounceRole(bytes32,address)": { - "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." - }, - "revokeRole(bytes32,address)": { - "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." - }, - "schedule(address,uint256,bytes,bytes32,bytes32,uint256)": { - "details": "Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role." - }, - "scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)": { - "details": "Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role." - }, - "supportsInterface(bytes4)": { - "details": "See {IERC165-supportsInterface}." - }, - "updateDelay(uint256)": { - "details": "Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function." - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 24, - "contract": "contracts/TimeLock.sol:TimeLock", - "label": "_roles", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" - }, - { - "astId": 2142, - "contract": "contracts/TimeLock.sol:TimeLock", - "label": "_timestamps", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_uint256)" - }, - { - "astId": 2144, - "contract": "contracts/TimeLock.sol:TimeLock", - "label": "_minDelay", - "offset": 0, - "slot": "2", - "type": "t_uint256" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_bool)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => struct AccessControl.RoleData)", - "numberOfBytes": "32", - "value": "t_struct(RoleData)19_storage" - }, - "t_mapping(t_bytes32,t_uint256)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_struct(RoleData)19_storage": { - "encoding": "inplace", - "label": "struct AccessControl.RoleData", - "members": [ - { - "astId": 16, - "contract": "contracts/TimeLock.sol:TimeLock", - "label": "members", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_bool)" - }, - { - "astId": 18, - "contract": "contracts/TimeLock.sol:TimeLock", - "label": "adminRole", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - } - ], - "numberOfBytes": "64" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/deployments/localhost/solcInputs/0a567a41a96dc2d81abbf99faae0732b.json b/deployments/localhost/solcInputs/1fbca7b8c0c69581356fdb74c6edaebf.json similarity index 99% rename from deployments/localhost/solcInputs/0a567a41a96dc2d81abbf99faae0732b.json rename to deployments/localhost/solcInputs/1fbca7b8c0c69581356fdb74c6edaebf.json index 827c760..f49ad68 100644 --- a/deployments/localhost/solcInputs/0a567a41a96dc2d81abbf99faae0732b.json +++ b/deployments/localhost/solcInputs/1fbca7b8c0c69581356fdb74c6edaebf.json @@ -37,14 +37,23 @@ "@openzeppelin/contracts/utils/Strings.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 Strings {\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" }, - "@openzeppelin/contracts/governance/Governor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + "@openzeppelin/contracts/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" }, - "@openzeppelin/contracts/utils/Timers.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/governance/TimelockController.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" @@ -52,68 +61,59 @@ "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, - "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/math/SafeCast.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" }, - "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" + "@openzeppelin/contracts/governance/Governor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IGovernor.sol\";\n\n/**\n * @dev Extension of the {IGovernor} for timelock supporting modules.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernorTimelock is IGovernor {\n event ProposalQueued(uint256 proposalId, uint256 eta);\n\n function timelock() public view virtual returns (address);\n\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\n\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual returns (uint256 proposalId);\n}\n" }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + "@openzeppelin/contracts/governance/IGovernor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" + "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" }, - "contracts/GovernerContract.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl\n{\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + "@openzeppelin/contracts/utils/Timers.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" }, "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" }, - "@openzeppelin/contracts/utils/Checkpoints.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" + "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" }, "@openzeppelin/contracts/utils/math/Math.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" + "@openzeppelin/contracts/utils/Checkpoints.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" }, - "@openzeppelin/contracts/governance/TimelockController.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IGovernor.sol\";\n\n/**\n * @dev Extension of the {IGovernor} for timelock supporting modules.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernorTimelock is IGovernor {\n event ProposalQueued(uint256 proposalId, uint256 eta);\n\n function timelock() public view virtual returns (address);\n\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\n\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual returns (uint256 proposalId);\n}\n" + "contracts/GovernerContract.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl\n{\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" }, - "@openzeppelin/contracts/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" }, - "@openzeppelin/contracts/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" + }, + "contracts/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\ncontract GovernanceToken is ERC20Votes {\n uint256 public s_initialSupply = 1000000e18;\n address private immutable i_owner;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n modifier onlyOwner() {\n require(i_owner == msg.sender, \"Ownable: caller is not the owner\");\n _;\n }\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n i_owner = msg.sender;\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" }, "contracts/TimeLock.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/TimelockController.sol\";\n\ncontract TimeLock is TimelockController {\n // minDelay: How long you have to wait before executing\n // proposers is the list of addresses that can purpose\n // executers: Who can execute when proposal passes\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executers\n ) TimelockController(minDelay, proposers, executers) {}\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" - }, - "contracts/GovernanceToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\ncontract GovernanceToken is ERC20Votes {\n uint256 public s_maxSupply = 1000000000000000000000000;\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n _mint(msg.sender, s_maxSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount) internal override(ERC20Votes) {\n super._mint(to, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" } }, "settings": { diff --git a/helper-config.js b/helper-config.js index ebb8a09..3121eec 100644 --- a/helper-config.js +++ b/helper-config.js @@ -10,11 +10,11 @@ const networkConfig = { }; const developmentChains = ["hardhat", "localhost"]; -const INITIAL_SUPPLY = (10e18).toString(); -const MIN_DELAY = 3600; -const VOTING_PERIOD = 5; -const VOTING_DELAY = 1; -const QUORUM_PERCENTAGE = 4; +const INITIAL_SUPPLY = "1000000000000000000000000"; +const MIN_DELAY = 0; +const VOTING_DELAY = 0; +const VOTING_PERIOD = 200; +const QUORUM_PERCENTAGE = 0; const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; const NEW_VALUE = 77; const FUNC = "store"; diff --git a/test/unit/dao.test.js b/test/unit/dao.test.js new file mode 100644 index 0000000..3ee71c4 --- /dev/null +++ b/test/unit/dao.test.js @@ -0,0 +1,274 @@ +const { ethers, deployments, getNamedAccounts, network } = require("hardhat"); + +const { assert, expect } = require("chai"); + +const { + FUNC, + NEW_VALUE, + PROPOSAL_DESCRIPTION, + developmentChains, + VOTING_DELAY, + proposalsFile, + VOTING_PERIOD, +} = require("../../helper-config"); +const { moveBlocks } = require("../../utils/move-blocks"); +const fs = require("fs"); + +!developmentChains.includes(network.name) + ? describe.skip + : describe("Unit tests", () => { + let gtToken, + account1, + account2, + account3, + governor, + timeLock, + box, + blockNumber; + beforeEach(async function () { + account1 = (await ethers.getSigners())[1]; + account2 = (await ethers.getSigners())[2]; + account3 = (await ethers.getSigners())[3]; + deployer = (await getNamedAccounts()).deployer; + + await deployments.fixture("all"); + gtToken = await ethers.getContract("GovernanceToken"); + governor = await ethers.getContract("GovernerContract"); + timeLock = await ethers.getContract("TimeLock"); + box = await ethers.getContract("Box"); + + gtToken = await ethers.getContract("GovernanceToken", deployer); + + let tx1 = await gtToken.transfer( + account1.address, + ethers.utils.parseEther("500000") + ); + tx1 = await gtToken.transfer( + account2.address, + ethers.utils.parseEther("300000") + ); + tx1 = await gtToken.transfer( + account3.address, + ethers.utils.parseEther("100000") + ); + + await tx1.wait(1); + + console.log( + `Account1 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account1.address)) + .toString()}` + ); + console.log( + `Account2 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account2.address)) + .toString()}` + ); + + console.log( + `Account3 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account3.address)) + .toString()}` + ); + + gtToken = await ethers.getContract("GovernanceToken", account1.address); + tx1 = await gtToken.delegate(account1.address); + await tx1.wait(1); + gtToken = await ethers.getContract("GovernanceToken", account2.address); + tx1 = await gtToken.delegate(account2.address); + gtToken = await ethers.getContract("GovernanceToken", account3.address); + tx1 = await gtToken.delegate(account3.address); + await tx1.wait(1); + + moveBlocks(1); + + blockNumber = await ethers.provider.getBlockNumber(); + console.log( + `account1 voting power : ${await governor.getVotes( + account1.address, + blockNumber - 1 + )}` + ); + console.log( + `account2 voting power : ${await governor.getVotes( + account2.address, + blockNumber - 1 + )}` + ); + console.log( + `account3 voting power : ${await governor.getVotes( + account3.address, + blockNumber - 1 + )}` + ); + }); + + it("was deployed", async () => { + assert(gtToken.address); + assert(governor.address); + assert(timeLock.address); + assert(box.address); + }); + + it("Only Owner can mint token", async () => { + // console.log((await gtToken.balanceOf(deployer)).toString()); + gtToken = await ethers.getContract("GovernanceToken", deployer); + const tx = await gtToken.mintToken( + deployer, + ethers.BigNumber.from("1000000000000000000000000") + ); + await tx.wait(1); + + // console.log((await gtToken.balanceOf(deployer)).toString()); + + expect((await gtToken.balanceOf(deployer)).toString()).to.equal( + "1100000000000000000000000" + ); + gtToken = await ethers.getContract("GovernanceToken", account1.address); + + await expect( + gtToken.mintToken( + account1.address, + ethers.BigNumber.from("1000000000000000000000000") + ) + ).to.be.revertedWith("Ownable: caller is not the owner"); + }); + + it("can only be changed through governance", async () => { + await expect(box.store(55)).to.be.revertedWith( + "Ownable: caller is not the owner" + ); + }); + + //-------------------------------------------------------------------------------- + + describe("proposes, votes, waits, queues, and then executesxx", async () => { + it("Create a purposal make a vote", async () => { + const encodedFunctionCall = box.interface.encodeFunctionData(FUNC, [ + NEW_VALUE, + ]); + + const proposalTx = await governor.propose( + [box.address], + [0], + [encodedFunctionCall], + PROPOSAL_DESCRIPTION + ); + const proposeReceipt = await proposalTx.wait(1); + + console.log( + `Purposal start Block number= ${await ethers.provider.getBlockNumber()}` + ); + const proposalId = proposeReceipt.events[0].args.proposalId; + let proposalState = await governor.state(proposalId); + + const deadline = await governor.proposalDeadline(proposalId); + console.log(`Proposal deadline on block ${deadline.toString()}`); + + console.log(`Current Proposal State: ${proposalState}`); + /* enum ProposalState { + Pending, + Active, + Canceled, + Defeated, + Succeeded, + Queued, + Expired, + Executed + } */ + expect(proposalState == 1); + blockNumber = await ethers.provider.getBlockNumber(); + console.log( + `account1 voting power : ${await governor.getVotes( + account1.address, + blockNumber - 1 + )}` + ); + console.log( + `account2 voting power : ${await governor.getVotes( + account2.address, + blockNumber - 1 + )}` + ); + console.log( + `account3 voting power : ${await governor.getVotes( + account3.address, + blockNumber - 1 + )}` + ); + await moveBlocks(VOTING_DELAY + 1); + console.log( + `after voting delay Block number= ${await ethers.provider.getBlockNumber()}` + ); + + // connect with account1 + governor = await ethers.getContract( + "GovernerContract", + account1.address + ); + // voting... + // 0 = Against, 1 = For, 2 = Abstain + let voteTxResponse = await governor.castVote(proposalId, 1); + await voteTxResponse.wait(1); + console.log( + `after voting account1 Block number= ${await ethers.provider.getBlockNumber()}` + ); + /* const hasVoted = await governor.hasVoted( + proposalId, + account1.address + ); + console.log(`account1 hasVoted: ${hasVoted}`); */ + + console.log( + `after voting period Block number= ${await ethers.provider.getBlockNumber()}` + ); + + // voting with account 2 ************************************************ + + // connect with account2 + const governor1 = await ethers.getContract( + "GovernerContract", + account2.address + ); + + const voteTxResponse1 = await governor1.castVote(proposalId, 0); + await voteTxResponse1.wait(1); + console.log( + `after voting account2 Block number= ${await ethers.provider.getBlockNumber()}` + ); + + /* const hasVoted2 = await governor.hasVoted( + proposalId, + account2.address + ); + console.log(`account2 hasVoted: ${hasVoted2}`); */ + + // account3 is voting ********************************************************** */ + // connect with account1 + governor = await ethers.getContract( + "GovernerContract", + account3.address + ); + // voting... + // 0 = Against, 1 = For, 2 = Abstain + voteTxResponse = await governor.castVote(proposalId, 1); + + // finish the voting + await moveBlocks(VOTING_PERIOD + 1); + + proposalState = await governor.state(proposalId); + console.log(`Current Proposal State: ${proposalState}`); + + // getting to results + const { againstVotes, forVotes, abstainVotes } = + await governor.proposalVotes(proposalId); + console.log( + `Vote on against: ${ethers.utils.formatEther(againstVotes)}` + ); + console.log(`Vote on for: ${ethers.utils.formatEther(forVotes)}`); + console.log( + `Vote on abstain: ${ethers.utils.formatEther(abstainVotes)}` + ); + }); + }); + }); From 64bd7d7502c75242e80237664acf44c0fbd5acff Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 28 Oct 2022 08:10:35 +0300 Subject: [PATCH 04/28] add tests v1.1 --- coverage.json | 2 +- coverage/contracts/Box.sol.html | 32 ++-- coverage/contracts/GovernanceToken.sol.html | 6 +- coverage/contracts/GovernerContract.sol.html | 32 ++-- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 48 ++--- coverage/coverage-final.json | 6 +- coverage/index.html | 32 ++-- coverage/lcov-report/contracts/Box.sol.html | 32 ++-- .../contracts/GovernanceToken.sol.html | 6 +- .../contracts/GovernerContract.sol.html | 32 ++-- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 48 ++--- coverage/lcov-report/index.html | 32 ++-- coverage/lcov.info | 40 ++-- test/unit/dao.test.js | 177 +++++++++++------- 16 files changed, 286 insertions(+), 243 deletions(-) diff --git a/coverage.json b/coverage.json index dc9226a..44566ac 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/Box.sol":{"l":{"15":0,"16":0,"21":0},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":0,"2":0,"3":0},"b":{},"f":{"1":0,"2":0},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":16,"35":16,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":16,"5":16,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":16,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"45":1,"54":1,"63":1,"72":5,"81":1,"90":1,"100":0,"109":0,"118":0,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":1,"2":1,"3":1,"4":5,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0},"b":{},"f":{"1":3,"2":1,"3":1,"4":1,"5":5,"6":1,"7":1,"8":0,"9":0,"10":0,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":1},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":1},"b":{},"f":{"1":1,"2":1},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":7,"35":7,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":7,"5":7,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":7,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"45":1,"54":1,"63":3,"72":7,"81":1,"90":1,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":1,"2":1,"3":3,"4":7,"5":1,"6":1,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":1,"3":1,"4":3,"5":7,"6":1,"7":1,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/Box.sol.html b/coverage/contracts/Box.sol.html index cf82677..2c57b2d 100644 --- a/coverage/contracts/Box.sol.html +++ b/coverage/contracts/Box.sol.html @@ -20,9 +20,9 @@

- 0% + 100% Statements - 0/3 + 3/3
100% @@ -30,18 +30,18 @@

0/0

- 0% + 100% Functions - 0/2 + 2/2
- 0% + 100% Lines - 0/3 + 3/3
-
+

@@ -118,7 +118,7 @@ 

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index 11fa19d..f1d1ed5 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -136,8 +136,8 @@

      -16× -16× + +       @@ -229,7 +229,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 8962af8..e524b71 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -20,9 +20,9 @@

- 60% + 80% Statements - 6/10 + 8/10
100% @@ -30,18 +30,18 @@

0/0

- 63.64% + 81.82% Functions - 7/11 + 9/11
- 60% + 80% Lines - 6/10 + 8/10
-
+
1 2 @@ -80,13 +80,13 @@

      -  -  + +         -  +      

// contracts/Box.sol
@@ -102,14 +102,14 @@ 

event ValueChanged(uint256 newValue);   // Stores a new value in the contract - function store(uint256 newValue) public onlyOwner { - value = newValue; - emit ValueChanged(newValue); + function store(uint256 newValue) public onlyOwner { + value = newValue; + emit ValueChanged(newValue); }   // Reads the last stored value - function retrieve() public view returns (uint256) { - return value; + function retrieve() public view returns (uint256) { + return value; } }  

1 2 @@ -234,7 +234,7 @@

      - +       @@ -243,7 +243,7 @@

      - +       @@ -271,7 +271,7 @@

      -  +       @@ -289,7 +289,7 @@

      -  +       @@ -393,14 +393,14 @@

return super.proposalThreshold(); }   - function _execute( + function _execute( uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) internal override(Governor, GovernorTimelockControl) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); + super._execute(proposalId, targets, values, calldatas, descriptionHash); }   function _cancel( @@ -412,13 +412,13 @@

return super._cancel(targets, values, calldatas, descriptionHash); }   - function _executor() + function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) { - return super._executor(); + return super._executor(); }   function supportsInterface(bytes4 interfaceId) @@ -436,7 +436,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index fe58459..14e8299 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index 1f17f81..c976550 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,9 +20,9 @@

- 59.09% + 81.82% Statements - 13/22 + 18/22
100% @@ -30,18 +30,18 @@

2/2

- 61.9% + 80.95% Functions - 13/21 + 17/21
- 60.87% + 82.61% Lines - 14/23 + 19/23
-
+
@@ -59,16 +59,16 @@

- - - - + + + + - - - - + + + + @@ -85,16 +85,16 @@

- - - - + + + + - - - - + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 023a39f..864f293 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,5 @@ { -"contracts/Box.sol":{"l":{"15":0,"16":0,"21":0},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":0,"2":0,"3":0},"b":{},"f":{"1":0,"2":0},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, -"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":16,"35":16,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":16,"5":16,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":16,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, -"contracts/GovernerContract.sol":{"l":{"45":1,"54":1,"63":1,"72":5,"81":1,"90":1,"100":0,"109":0,"118":0,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":1,"2":1,"3":1,"4":5,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0},"b":{},"f":{"1":3,"2":1,"3":1,"4":1,"5":5,"6":1,"7":1,"8":0,"9":0,"10":0,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}}, +"contracts/Box.sol":{"l":{"15":1,"16":1,"21":1},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":1},"b":{},"f":{"1":1,"2":1},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, +"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":7,"35":7,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":7,"5":7,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":7,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, +"contracts/GovernerContract.sol":{"l":{"45":1,"54":1,"63":3,"72":7,"81":1,"90":1,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":1,"2":1,"3":3,"4":7,"5":1,"6":1,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":1,"3":1,"4":3,"5":7,"6":1,"7":1,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index 96a7fc1..e5fc16f 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,9 +20,9 @@

- 59.09% + 81.82% Statements - 13/22 + 18/22
100% @@ -30,18 +30,18 @@

2/2

- 61.9% + 80.95% Functions - 13/21 + 17/21
- 60.87% + 82.61% Lines - 14/23 + 19/23
-
+
Box.sol
0%0/3Box.sol
100%3/3 100% 0/00%0/20%0/3100%2/2100%3/3
GovernerContract.sol
60%6/10GovernerContract.sol
80%8/10 100% 0/063.64%7/1160%6/1081.82%9/1180%8/10
@@ -59,16 +59,16 @@

- - - - + + + + - - - - + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/Box.sol.html b/coverage/lcov-report/contracts/Box.sol.html index cf82677..2c57b2d 100644 --- a/coverage/lcov-report/contracts/Box.sol.html +++ b/coverage/lcov-report/contracts/Box.sol.html @@ -20,9 +20,9 @@

- 0% + 100% Statements - 0/3 + 3/3
100% @@ -30,18 +30,18 @@

0/0

- 0% + 100% Functions - 0/2 + 2/2
- 0% + 100% Lines - 0/3 + 3/3
-
+
contracts/
59.09%13/22contracts/
81.82%18/22 100% 2/261.9%13/2160.87%14/2380.95%17/2182.61%19/23
@@ -118,7 +118,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index 11fa19d..f1d1ed5 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -136,8 +136,8 @@

      -16× -16× + +       @@ -229,7 +229,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 8962af8..e524b71 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -20,9 +20,9 @@

- 60% + 80% Statements - 6/10 + 8/10
100% @@ -30,18 +30,18 @@

0/0

- 63.64% + 81.82% Functions - 7/11 + 9/11
- 60% + 80% Lines - 6/10 + 8/10
-
+
1 2 @@ -80,13 +80,13 @@

      -  -  + +         -  +      

// contracts/Box.sol
@@ -102,14 +102,14 @@ 

event ValueChanged(uint256 newValue);   // Stores a new value in the contract - function store(uint256 newValue) public onlyOwner { - value = newValue; - emit ValueChanged(newValue); + function store(uint256 newValue) public onlyOwner { + value = newValue; + emit ValueChanged(newValue); }   // Reads the last stored value - function retrieve() public view returns (uint256) { - return value; + function retrieve() public view returns (uint256) { + return value; } }  

1 2 @@ -234,7 +234,7 @@

      - +       @@ -243,7 +243,7 @@

      - +       @@ -271,7 +271,7 @@

      -  +       @@ -289,7 +289,7 @@

      -  +       @@ -393,14 +393,14 @@

return super.proposalThreshold(); }   - function _execute( + function _execute( uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) internal override(Governor, GovernorTimelockControl) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); + super._execute(proposalId, targets, values, calldatas, descriptionHash); }   function _cancel( @@ -412,13 +412,13 @@

return super._cancel(targets, values, calldatas, descriptionHash); }   - function _executor() + function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) { - return super._executor(); + return super._executor(); }   function supportsInterface(bytes4 interfaceId) @@ -436,7 +436,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index fe58459..14e8299 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index 1f17f81..c976550 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,9 +20,9 @@

- 59.09% + 81.82% Statements - 13/22 + 18/22
100% @@ -30,18 +30,18 @@

2/2

- 61.9% + 80.95% Functions - 13/21 + 17/21
- 60.87% + 82.61% Lines - 14/23 + 19/23
-
+
@@ -59,16 +59,16 @@

- - - - + + + + - - - - + + + + @@ -85,16 +85,16 @@

- - - - + + + + - - - - + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index 96a7fc1..e5fc16f 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,9 +20,9 @@

- 59.09% + 81.82% Statements - 13/22 + 18/22
100% @@ -30,18 +30,18 @@

2/2

- 61.9% + 80.95% Functions - 13/21 + 17/21
- 60.87% + 82.61% Lines - 14/23 + 19/23
-
+
Box.sol
0%0/3Box.sol
100%3/3 100% 0/00%0/20%0/3100%2/2100%3/3
GovernerContract.sol
60%6/10GovernerContract.sol
80%8/10 100% 0/063.64%7/1160%6/1081.82%9/1180%8/10
@@ -59,16 +59,16 @@

- - - - + + + + - - - - + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index b976e1f..3506013 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -3,14 +3,14 @@ SF:/home/furkansezal/dao/contracts/Box.sol FN:14,store FN:20,retrieve FNF:2 -FNH:0 -FNDA:0,store -FNDA:0,retrieve -DA:15,0 -DA:16,0 -DA:21,0 +FNH:2 +FNDA:1,store +FNDA:1,retrieve +DA:15,1 +DA:16,1 +DA:21,1 LF:3 -LH:0 +LH:3 BRF:0 BRH:0 end_of_record @@ -27,7 +27,7 @@ FNF:7 FNH:5 FNDA:5,onlyOwner FNDA:3,constructor -FNDA:16,_afterTokenTransfer +FNDA:7,_afterTokenTransfer FNDA:4,_mint FNDA:2,mintToken FNDA:0,burnToken @@ -36,8 +36,8 @@ DA:17,5 DA:18,4 DA:25,3 DA:26,3 -DA:34,16 -DA:35,16 +DA:34,7 +DA:35,7 DA:43,4 DA:47,2 DA:51,0 @@ -63,30 +63,30 @@ FN:103,_cancel FN:112,_executor FN:121,supportsInterface FNF:11 -FNH:7 +FNH:9 FNDA:3,constructor FNDA:1,votingDelay FNDA:1,votingPeriod -FNDA:1,quorum -FNDA:5,state +FNDA:3,quorum +FNDA:7,state FNDA:1,propose FNDA:1,proposalThreshold -FNDA:0,_execute +FNDA:1,_execute FNDA:0,_cancel -FNDA:0,_executor +FNDA:2,_executor FNDA:0,supportsInterface DA:45,1 DA:54,1 -DA:63,1 -DA:72,5 +DA:63,3 +DA:72,7 DA:81,1 DA:90,1 -DA:100,0 +DA:100,1 DA:109,0 -DA:118,0 +DA:118,2 DA:127,0 LF:10 -LH:6 +LH:8 BRF:0 BRH:0 end_of_record diff --git a/test/unit/dao.test.js b/test/unit/dao.test.js index 3ee71c4..19c2a18 100644 --- a/test/unit/dao.test.js +++ b/test/unit/dao.test.js @@ -10,8 +10,10 @@ const { VOTING_DELAY, proposalsFile, VOTING_PERIOD, + MIN_DELAY, } = require("../../helper-config"); const { moveBlocks } = require("../../utils/move-blocks"); +const { moveTime } = require("../../utils/move-time"); const fs = require("fs"); !developmentChains.includes(network.name) @@ -38,69 +40,6 @@ const fs = require("fs"); box = await ethers.getContract("Box"); gtToken = await ethers.getContract("GovernanceToken", deployer); - - let tx1 = await gtToken.transfer( - account1.address, - ethers.utils.parseEther("500000") - ); - tx1 = await gtToken.transfer( - account2.address, - ethers.utils.parseEther("300000") - ); - tx1 = await gtToken.transfer( - account3.address, - ethers.utils.parseEther("100000") - ); - - await tx1.wait(1); - - console.log( - `Account1 balance= ${ethers.utils - .formatEther(await gtToken.balanceOf(account1.address)) - .toString()}` - ); - console.log( - `Account2 balance= ${ethers.utils - .formatEther(await gtToken.balanceOf(account2.address)) - .toString()}` - ); - - console.log( - `Account3 balance= ${ethers.utils - .formatEther(await gtToken.balanceOf(account3.address)) - .toString()}` - ); - - gtToken = await ethers.getContract("GovernanceToken", account1.address); - tx1 = await gtToken.delegate(account1.address); - await tx1.wait(1); - gtToken = await ethers.getContract("GovernanceToken", account2.address); - tx1 = await gtToken.delegate(account2.address); - gtToken = await ethers.getContract("GovernanceToken", account3.address); - tx1 = await gtToken.delegate(account3.address); - await tx1.wait(1); - - moveBlocks(1); - - blockNumber = await ethers.provider.getBlockNumber(); - console.log( - `account1 voting power : ${await governor.getVotes( - account1.address, - blockNumber - 1 - )}` - ); - console.log( - `account2 voting power : ${await governor.getVotes( - account2.address, - blockNumber - 1 - )}` - ); - console.log( - `account3 voting power : ${await governor.getVotes( - account3.address, - blockNumber - 1 - )}` - ); }); it("was deployed", async () => { @@ -112,7 +51,7 @@ const fs = require("fs"); it("Only Owner can mint token", async () => { // console.log((await gtToken.balanceOf(deployer)).toString()); - gtToken = await ethers.getContract("GovernanceToken", deployer); + const tx = await gtToken.mintToken( deployer, ethers.BigNumber.from("1000000000000000000000000") @@ -122,7 +61,7 @@ const fs = require("fs"); // console.log((await gtToken.balanceOf(deployer)).toString()); expect((await gtToken.balanceOf(deployer)).toString()).to.equal( - "1100000000000000000000000" + "2000000000000000000000000" ); gtToken = await ethers.getContract("GovernanceToken", account1.address); @@ -142,8 +81,80 @@ const fs = require("fs"); //-------------------------------------------------------------------------------- - describe("proposes, votes, waits, queues, and then executesxx", async () => { + describe("proposes, votes, waits, queues, and then executes & queue & execute", async () => { it("Create a purposal make a vote", async () => { + let tx1 = await gtToken.transfer( + account1.address, + ethers.utils.parseEther("500000") + ); + tx1 = await gtToken.transfer( + account2.address, + ethers.utils.parseEther("300000") + ); + tx1 = await gtToken.transfer( + account3.address, + ethers.utils.parseEther("100000") + ); + + await tx1.wait(1); + + console.log( + `Account1 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account1.address)) + .toString()}` + ); + console.log( + `Account2 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account2.address)) + .toString()}` + ); + + console.log( + `Account3 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account3.address)) + .toString()}` + ); + + gtToken = await ethers.getContract( + "GovernanceToken", + account1.address + ); + tx1 = await gtToken.delegate(account1.address); + await tx1.wait(1); + gtToken = await ethers.getContract( + "GovernanceToken", + account2.address + ); + tx1 = await gtToken.delegate(account2.address); + gtToken = await ethers.getContract( + "GovernanceToken", + account3.address + ); + tx1 = await gtToken.delegate(account3.address); + await tx1.wait(1); + + moveBlocks(1); + + blockNumber = await ethers.provider.getBlockNumber(); + console.log( + `account1 voting power : ${await governor.getVotes( + account1.address, + blockNumber - 1 + )}` + ); + console.log( + `account2 voting power : ${await governor.getVotes( + account2.address, + blockNumber - 1 + )}` + ); + console.log( + `account3 voting power : ${await governor.getVotes( + account3.address, + blockNumber - 1 + )}` + ); + const encodedFunctionCall = box.interface.encodeFunctionData(FUNC, [ NEW_VALUE, ]); @@ -177,7 +188,10 @@ const fs = require("fs"); Executed } */ expect(proposalState == 1); + + await moveBlocks(VOTING_DELAY + 1); blockNumber = await ethers.provider.getBlockNumber(); + console.log( `account1 voting power : ${await governor.getVotes( account1.address, @@ -196,7 +210,7 @@ const fs = require("fs"); blockNumber - 1 )}` ); - await moveBlocks(VOTING_DELAY + 1); + console.log( `after voting delay Block number= ${await ethers.provider.getBlockNumber()}` ); @@ -269,6 +283,35 @@ const fs = require("fs"); console.log( `Vote on abstain: ${ethers.utils.formatEther(abstainVotes)}` ); + + assert.equal(proposalState.toString(), "4"); + + // its time to queue & execute + + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(PROPOSAL_DESCRIPTION) + ); + governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + const queueTx = await governor.queue( + [box.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await queueTx.wait(1); + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + console.log("Executing..."); + const executeTx = await governor.execute( + [box.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await executeTx.wait(1); + const boxNewValue = await box.retrieve(); + console.log(`New Box Value: ${boxNewValue.toString()}`); }); }); }); From c6f35b290fdac63b324ca1d1b7a34b29bf0acd91 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 28 Oct 2022 09:23:12 +0300 Subject: [PATCH 05/28] add test v1.1 --- coverage.json | 2 +- coverage/contracts/Box.sol.html | 4 +- coverage/contracts/GovernanceToken.sol.html | 6 +- coverage/contracts/GovernerContract.sol.html | 14 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 2 +- coverage/coverage-final.json | 6 +- coverage/index.html | 2 +- coverage/lcov-report/contracts/Box.sol.html | 4 +- .../contracts/GovernanceToken.sol.html | 6 +- .../contracts/GovernerContract.sol.html | 14 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 2 +- coverage/lcov-report/index.html | 2 +- coverage/lcov.info | 34 ++--- test/unit/dao.test.js | 144 ++++++++++++++++++ 16 files changed, 195 insertions(+), 51 deletions(-) diff --git a/coverage.json b/coverage.json index 44566ac..3e857d3 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":1},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":1},"b":{},"f":{"1":1,"2":1},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":7,"35":7,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":7,"5":7,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":7,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"45":1,"54":1,"63":3,"72":7,"81":1,"90":1,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":1,"2":1,"3":3,"4":7,"5":1,"6":1,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":1,"3":1,"4":3,"5":7,"6":1,"7":1,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":10,"35":10,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":10,"5":10,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":10,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"45":2,"54":2,"63":6,"72":14,"81":2,"90":2,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":2,"2":2,"3":6,"4":14,"5":2,"6":2,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/Box.sol.html b/coverage/contracts/Box.sol.html index 2c57b2d..7d647a0 100644 --- a/coverage/contracts/Box.sol.html +++ b/coverage/contracts/Box.sol.html @@ -86,7 +86,7 @@

      - +      

contracts/
59.09%13/22contracts/
81.82%18/22 100% 2/261.9%13/2160.87%14/2380.95%17/2182.61%19/23
// contracts/Box.sol
@@ -118,7 +118,7 @@ 

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index f1d1ed5..f0b17d9 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -136,8 +136,8 @@

      - - +10× +10×       @@ -229,7 +229,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index e524b71..f9fe116 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -216,7 +216,7 @@

      - +       @@ -225,7 +225,7 @@

      - +       @@ -234,7 +234,7 @@

      - +       @@ -243,7 +243,7 @@

      - +14×       @@ -252,7 +252,7 @@

      - +       @@ -261,7 +261,7 @@

      - +       @@ -436,7 +436,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index 14e8299..21827e7 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index c976550..6ab1b72 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -116,7 +116,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 864f293..a2384fa 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,5 @@ { -"contracts/Box.sol":{"l":{"15":1,"16":1,"21":1},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":1},"b":{},"f":{"1":1,"2":1},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, -"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":7,"35":7,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":7,"5":7,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":7,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, -"contracts/GovernerContract.sol":{"l":{"45":1,"54":1,"63":3,"72":7,"81":1,"90":1,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":1,"2":1,"3":3,"4":7,"5":1,"6":1,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":1,"3":1,"4":3,"5":7,"6":1,"7":1,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}}, +"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, +"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":10,"35":10,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":10,"5":10,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":10,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, +"contracts/GovernerContract.sol":{"l":{"45":2,"54":2,"63":6,"72":14,"81":2,"90":2,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":2,"2":2,"3":6,"4":14,"5":2,"6":2,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index e5fc16f..ee948e7 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/Box.sol.html b/coverage/lcov-report/contracts/Box.sol.html index 2c57b2d..7d647a0 100644 --- a/coverage/lcov-report/contracts/Box.sol.html +++ b/coverage/lcov-report/contracts/Box.sol.html @@ -86,7 +86,7 @@

      - +      

// contracts/Box.sol
@@ -118,7 +118,7 @@ 

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index f1d1ed5..f0b17d9 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -136,8 +136,8 @@

      - - +10× +10×       @@ -229,7 +229,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index e524b71..f9fe116 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -216,7 +216,7 @@

      - +       @@ -225,7 +225,7 @@

      - +       @@ -234,7 +234,7 @@

      - +       @@ -243,7 +243,7 @@

      - +14×       @@ -252,7 +252,7 @@

      - +       @@ -261,7 +261,7 @@

      - +       @@ -436,7 +436,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index 14e8299..21827e7 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index c976550..6ab1b72 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -116,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index e5fc16f..ee948e7 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 3506013..a104903 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -5,10 +5,10 @@ FN:20,retrieve FNF:2 FNH:2 FNDA:1,store -FNDA:1,retrieve +FNDA:2,retrieve DA:15,1 DA:16,1 -DA:21,1 +DA:21,2 LF:3 LH:3 BRF:0 @@ -27,7 +27,7 @@ FNF:7 FNH:5 FNDA:5,onlyOwner FNDA:3,constructor -FNDA:7,_afterTokenTransfer +FNDA:10,_afterTokenTransfer FNDA:4,_mint FNDA:2,mintToken FNDA:0,burnToken @@ -36,8 +36,8 @@ DA:17,5 DA:18,4 DA:25,3 DA:26,3 -DA:34,7 -DA:35,7 +DA:34,10 +DA:35,10 DA:43,4 DA:47,2 DA:51,0 @@ -65,22 +65,22 @@ FN:121,supportsInterface FNF:11 FNH:9 FNDA:3,constructor -FNDA:1,votingDelay -FNDA:1,votingPeriod -FNDA:3,quorum -FNDA:7,state -FNDA:1,propose -FNDA:1,proposalThreshold +FNDA:2,votingDelay +FNDA:2,votingPeriod +FNDA:6,quorum +FNDA:14,state +FNDA:2,propose +FNDA:2,proposalThreshold FNDA:1,_execute FNDA:0,_cancel FNDA:2,_executor FNDA:0,supportsInterface -DA:45,1 -DA:54,1 -DA:63,3 -DA:72,7 -DA:81,1 -DA:90,1 +DA:45,2 +DA:54,2 +DA:63,6 +DA:72,14 +DA:81,2 +DA:90,2 DA:100,1 DA:109,0 DA:118,2 diff --git a/test/unit/dao.test.js b/test/unit/dao.test.js index 19c2a18..487131a 100644 --- a/test/unit/dao.test.js +++ b/test/unit/dao.test.js @@ -312,6 +312,150 @@ const fs = require("fs"); await executeTx.wait(1); const boxNewValue = await box.retrieve(); console.log(`New Box Value: ${boxNewValue.toString()}`); + assert.equal(boxNewValue.toString(), "77"); + }); + + it("Result of voting against", async () => { + let tx1 = await gtToken.transfer( + account1.address, + ethers.utils.parseEther("500000") + ); + tx1 = await gtToken.transfer( + account2.address, + ethers.utils.parseEther("300000") + ); + tx1 = await gtToken.transfer( + account3.address, + ethers.utils.parseEther("100000") + ); + + await tx1.wait(1); + + gtToken = await ethers.getContract( + "GovernanceToken", + account1.address + ); + tx1 = await gtToken.delegate(account1.address); + await tx1.wait(1); + gtToken = await ethers.getContract( + "GovernanceToken", + account2.address + ); + tx1 = await gtToken.delegate(account2.address); + gtToken = await ethers.getContract( + "GovernanceToken", + account3.address + ); + tx1 = await gtToken.delegate(account3.address); + await tx1.wait(1); + + moveBlocks(1); + + blockNumber = await ethers.provider.getBlockNumber(); + + const encodedFunctionCall = box.interface.encodeFunctionData(FUNC, [ + NEW_VALUE, + ]); + + const proposalTx = await governor.propose( + [box.address], + [0], + [encodedFunctionCall], + PROPOSAL_DESCRIPTION + ); + const proposeReceipt = await proposalTx.wait(1); + + const proposalId = proposeReceipt.events[0].args.proposalId; + let proposalState = await governor.state(proposalId); + + const deadline = await governor.proposalDeadline(proposalId); + + expect(proposalState == 1); + + await moveBlocks(VOTING_DELAY + 1); + blockNumber = await ethers.provider.getBlockNumber(); + + // connect with account1 + governor = await ethers.getContract( + "GovernerContract", + account1.address + ); + // voting... + // 0 = Against, 1 = For, 2 = Abstain + let voteTxResponse = await governor.castVote(proposalId, 0); + await voteTxResponse.wait(1); + + // voting with account 2 ************************************************ + + // connect with account2 + const governor1 = await ethers.getContract( + "GovernerContract", + account2.address + ); + + const voteTxResponse1 = await governor1.castVote(proposalId, 0); + await voteTxResponse1.wait(1); + + // account3 is voting ********************************************************** */ + // connect with account1 + governor = await ethers.getContract( + "GovernerContract", + account3.address + ); + // voting... + // 0 = Against, 1 = For, 2 = Abstain + voteTxResponse = await governor.castVote(proposalId, 1); + + // finish the voting + await moveBlocks(VOTING_PERIOD + 1); + + proposalState = await governor.state(proposalId); + console.log(`Current Proposal State: ${proposalState}`); + + // getting to results + const { againstVotes, forVotes, abstainVotes } = + await governor.proposalVotes(proposalId); + console.log( + `Vote on against: ${ethers.utils.formatEther(againstVotes)}` + ); + console.log(`Vote on for: ${ethers.utils.formatEther(forVotes)}`); + console.log( + `Vote on abstain: ${ethers.utils.formatEther(abstainVotes)}` + ); + + assert.equal(proposalState.toString(), "3"); + + // its time to queue & execute + + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(PROPOSAL_DESCRIPTION) + ); + governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + + await expect( + governor.queue( + [box.address], + [0], + [encodedFunctionCall], + descriptionHash + ) + ).to.be.revertedWith("Governor: proposal not successful"); + + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + + await expect( + governor.execute( + [box.address], + [0], + [encodedFunctionCall], + descriptionHash + ) + ).to.be.revertedWith("Governor: proposal not successful"); + + const boxNewValue = await box.retrieve(); + assert.equal(boxNewValue.toString(), "0"); }); }); }); From 7b0be876522f1ff16bd16e012db0e490957a2ac7 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 28 Oct 2022 09:55:45 +0300 Subject: [PATCH 06/28] Add tests v1.2 --- coverage.json | 2 +- coverage/contracts/Box.sol.html | 2 +- coverage/contracts/GovernanceToken.sol.html | 32 +++---- coverage/contracts/GovernerContract.sol.html | 2 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 30 +++--- coverage/coverage-final.json | 2 +- coverage/index.html | 28 +++--- coverage/lcov-report/contracts/Box.sol.html | 2 +- .../contracts/GovernanceToken.sol.html | 32 +++---- .../contracts/GovernerContract.sol.html | 2 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 30 +++--- coverage/lcov-report/index.html | 28 +++--- coverage/lcov.info | 18 ++-- test/unit/dao.test.js | 92 +++++++++++++++++++ 16 files changed, 199 insertions(+), 107 deletions(-) diff --git a/coverage.json b/coverage.json index 3e857d3..a81181a 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":10,"35":10,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":10,"5":10,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":10,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"45":2,"54":2,"63":6,"72":14,"81":2,"90":2,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":2,"2":2,"3":6,"4":14,"5":2,"6":2,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":14,"35":14,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":14,"5":14,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":14,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"45":2,"54":2,"63":6,"72":14,"81":2,"90":2,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":2,"2":2,"3":6,"4":14,"5":2,"6":2,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/Box.sol.html b/coverage/contracts/Box.sol.html index 7d647a0..7067ecf 100644 --- a/coverage/contracts/Box.sol.html +++ b/coverage/contracts/Box.sol.html @@ -118,7 +118,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index f0b17d9..325455b 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -20,9 +20,9 @@

- 77.78% + 100% Statements - 7/9 + 9/9
100% @@ -30,18 +30,18 @@

2/2

- 71.43% + 100% Functions - 5/7 + 7/7
- 80% + 100% Lines - 8/10 + 10/10
-
+

@@ -229,7 +229,7 @@ 

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index f9fe116..09fee71 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -436,7 +436,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index 21827e7..7f91a37 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index 6ab1b72..db928cc 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,9 +20,9 @@

- 81.82% + 90.91% Statements - 18/22 + 20/22
100% @@ -30,14 +30,14 @@

2/2

- 80.95% + 90.48% Functions - 17/21 + 19/21
- 82.61% + 91.3% Lines - 19/23 + 21/23
@@ -72,16 +72,16 @@

- - - - + + + + - - - - + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index a2384fa..8693ac2 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,5 @@ { "contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, -"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":10,"35":10,"43":4,"47":2,"51":0,"58":0},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":10,"5":10,"6":4,"7":2,"8":0,"9":0},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":10,"4":4,"5":2,"6":0,"7":0},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, +"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":14,"35":14,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":14,"5":14,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":14,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, "contracts/GovernerContract.sol":{"l":{"45":2,"54":2,"63":6,"72":14,"81":2,"90":2,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":2,"2":2,"3":6,"4":14,"5":2,"6":2,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index ee948e7..d4fa9a3 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,9 +20,9 @@

- 81.82% + 90.91% Statements - 18/22 + 20/22
100% @@ -30,14 +30,14 @@

2/2

- 80.95% + 90.48% Functions - 17/21 + 19/21
- 82.61% + 91.3% Lines - 19/23 + 21/23
@@ -60,15 +60,15 @@

- - - + + + - - - - + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/Box.sol.html b/coverage/lcov-report/contracts/Box.sol.html index 7d647a0..7067ecf 100644 --- a/coverage/lcov-report/contracts/Box.sol.html +++ b/coverage/lcov-report/contracts/Box.sol.html @@ -118,7 +118,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index f0b17d9..325455b 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -20,9 +20,9 @@

- 77.78% + 100% Statements - 7/9 + 9/9
100% @@ -30,18 +30,18 @@

2/2

- 71.43% + 100% Functions - 5/7 + 7/7
- 80% + 100% Lines - 8/10 + 10/10
-
+
1 2 @@ -136,8 +136,8 @@

      -10× -10× +14× +14×       @@ -153,14 +153,14 @@

      -  +             -  +      

// SPDX-License-Identifier: MIT
@@ -212,15 +212,15 @@ 

_mint(to, amount); }   - function burnToken(address account, uint256 amount) external { - _burn(account, amount); + function burnToken(address account, uint256 amount) external { + _burn(account, amount); }   - function _burn(address account, uint256 amount) + function _burn(address account, uint256 amount) internal override(ERC20Votes) { - super._burn(account, amount); + super._burn(account, amount); } }  

GovernanceToken.sol
77.78%7/9GovernanceToken.sol
100%9/9 100% 2/271.43%5/780%8/10100%7/7100%10/10
contracts/
81.82%18/22
90.91%20/22 100% 2/280.95%17/2182.61%19/2390.48%19/2191.3%21/23
@@ -229,7 +229,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index f9fe116..09fee71 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -436,7 +436,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index 21827e7..7f91a37 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index 6ab1b72..db928cc 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,9 +20,9 @@

- 81.82% + 90.91% Statements - 18/22 + 20/22
100% @@ -30,14 +30,14 @@

2/2

- 80.95% + 90.48% Functions - 17/21 + 19/21
- 82.61% + 91.3% Lines - 19/23 + 21/23
@@ -72,16 +72,16 @@

- - - - + + + + - - - - + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index ee948e7..d4fa9a3 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,9 +20,9 @@

- 81.82% + 90.91% Statements - 18/22 + 20/22
100% @@ -30,14 +30,14 @@

2/2

- 80.95% + 90.48% Functions - 17/21 + 19/21
- 82.61% + 91.3% Lines - 19/23 + 21/23
@@ -60,15 +60,15 @@

- - - + + + - - - - + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index a104903..3460ebe 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -24,26 +24,26 @@ FN:46,mintToken FN:50,burnToken FN:54,_burn FNF:7 -FNH:5 +FNH:7 FNDA:5,onlyOwner FNDA:3,constructor -FNDA:10,_afterTokenTransfer +FNDA:14,_afterTokenTransfer FNDA:4,_mint FNDA:2,mintToken -FNDA:0,burnToken -FNDA:0,_burn +FNDA:1,burnToken +FNDA:1,_burn DA:17,5 DA:18,4 DA:25,3 DA:26,3 -DA:34,10 -DA:35,10 +DA:34,14 +DA:35,14 DA:43,4 DA:47,2 -DA:51,0 -DA:58,0 +DA:51,1 +DA:58,1 LF:10 -LH:8 +LH:10 BRDA:17,1,0,4 BRDA:17,1,1,1 BRF:2 diff --git a/test/unit/dao.test.js b/test/unit/dao.test.js index 487131a..c49a380 100644 --- a/test/unit/dao.test.js +++ b/test/unit/dao.test.js @@ -11,6 +11,7 @@ const { proposalsFile, VOTING_PERIOD, MIN_DELAY, + INITIAL_SUPPLY, } = require("../../helper-config"); const { moveBlocks } = require("../../utils/move-blocks"); const { moveTime } = require("../../utils/move-time"); @@ -458,4 +459,95 @@ const fs = require("fs"); assert.equal(boxNewValue.toString(), "0"); }); }); + //******************************************************************************** */ + //Checking erc20 tokens ******************************** */ + + describe("constructor", async () => { + it("Check the initial supply", async () => { + const iintial_supply = (await gtToken.totalSupply()).toString(); + //console.log(ethers.utils.formatEther(iintial_supply)); + assert.equal(INITIAL_SUPPLY, iintial_supply); + }); + it("Name is correct", async () => { + const tokenName = (await gtToken.name()).toString(); + assert.equal(tokenName, "GovernanceToken"); + }); + it("Symbol is correct", async () => { + const tokenSymbol = (await gtToken.symbol()).toString(); + assert.equal(tokenSymbol, "GT"); + }); + }); + describe("tranfers", async () => { + it("allow transfer to another address", async () => { + const tokenToSend = ethers.utils.parseEther("10"); + //console.log(account1.address); + const tx = await gtToken.transfer(account1.address, tokenToSend); + assert(tx); + expect(await gtToken.balanceOf(account1.address)).to.equal( + tokenToSend + ); + }); + it("emits an transfer event, when an transfer occurs", async () => { + const tokenToSend = ethers.utils.parseEther("10"); + const tx = await gtToken.transfer(account1.address, tokenToSend); + expect(tx).to.emit(gtToken, "Transfer"); + }); + + describe("allowances", () => { + beforeEach(async () => { + userContract = await ethers.getContract( + "GovernanceToken", + account1.address + ); + }); + it("Should approve other address to spend token", async () => { + const tokenToSend = ethers.utils.parseEther("10"); + await gtToken.approve(account1.address, tokenToSend); + const erc20_1 = await ethers.getContract( + "GovernanceToken", + account1.address + ); + await erc20_1.transferFrom(deployer, account1.address, tokenToSend); + expect(await erc20_1.balanceOf(account1.address)).to.equal( + tokenToSend + ); + }); + it("doesn't allow an unnaproved member to do transfers", async () => { + const tokenToSend = ethers.utils.parseEther("10"); + await expect( + userContract.transferFrom(deployer, account1.address, tokenToSend) + ).to.be.revertedWith("ERC20: insufficient allowance"); + }); + it("emits an approval event, when an approval occurs", async () => { + const tokenToSend = ethers.utils.parseEther("10"); + const tx = await gtToken.approve(account1.address, tokenToSend); + expect(tx).to.emit(gtToken, "Approval"); + }); + it("won't allow a user to go over the allowance", async () => { + const tokenToSend = ethers.utils.parseEther("10"); + const tokenToSendOver = ethers.utils.parseEther("20"); + await gtToken.approve(account1.address, tokenToSend); + await expect( + userContract.transferFrom( + deployer, + account1.address, + tokenToSendOver + ) + ).to.be.revertedWith("ERC20: insufficient allowance"); + }); + it("burn GT token", async () => { + const beforeBurn = await gtToken.balanceOf(deployer); + console.log(ethers.utils.formatEther(beforeBurn).toString()); + const ethersToWei = ethers.utils.parseUnits("10", "ether"); + const txBurn = await gtToken.burnToken( + deployer, + ethers.utils.parseEther("100000") + ); + txBurn.wait(1); + const afterBurn = await gtToken.balanceOf(deployer); + console.log(ethers.utils.formatEther(afterBurn).toString()); + assert.isAbove(beforeBurn, afterBurn); + }); + }); + }); }); From 15038d94efc52fc5b981d6cb19341c8233980141 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Mon, 31 Oct 2022 09:45:29 +0300 Subject: [PATCH 07/28] Add submit --- helper-config.js | 17 ++++++ images/project1.jpg | Bin 0 -> 113054 bytes images/project2.png | Bin 0 -> 146334 bytes images/project3.png | Bin 0 -> 96413 bytes package.json | 7 ++- scripts/submit.js | 89 +++++++++++++++++++++++++++ scripts/uploadToPinata.js | 38 ++++++++++++ yarn.lock | 124 ++++++++++++++++++++++++++++++++++++-- 8 files changed, 266 insertions(+), 9 deletions(-) create mode 100644 images/project1.jpg create mode 100644 images/project2.png create mode 100644 images/project3.png create mode 100644 scripts/submit.js create mode 100644 scripts/uploadToPinata.js diff --git a/helper-config.js b/helper-config.js index 3121eec..bd3ce74 100644 --- a/helper-config.js +++ b/helper-config.js @@ -20,6 +20,15 @@ const NEW_VALUE = 77; const FUNC = "store"; const PROPOSAL_DESCRIPTION = "Propasol #1: Store 77 in the Box!"; const proposalsFile = "./proposals.json"; +const s_projectID = 1; +const s_projectName = "Sample Project"; +const s_website = "www.sampleProject.com"; +const s_description = "Amazing way to make money"; +const s_video = + "https://www.youtube.com/watch?v=5abamRO41fE&list=RD5abamRO41fE&start_radio=1&ab_channel=Slipknot"; +const s_fundRaisingGoalAmount = 10000; +const s_roadMap = "Just click the video"; +const s_otherSources = "You dont need anything else"; module.exports = { developmentChains, @@ -34,4 +43,12 @@ module.exports = { FUNC, PROPOSAL_DESCRIPTION, proposalsFile, + s_projectID, + s_projectName, + s_website, + s_description, + s_video, + s_fundRaisingGoalAmount, + s_roadMap, + s_otherSources, }; diff --git a/images/project1.jpg b/images/project1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..54bde52ec4551582cd1c964aef774d4bce516104 GIT binary patch literal 113054 zcmd?Qby!@@vNt+-@Zj$5!F@<@ch}%P6Wk$!1Shx?Y;c#sc@x}ifZ*;Bf(GYK-hIyA z`+m=JzPq3A-v4gRT0Ot1s_w3??zMV#ubSr{&+CAf%JNF`00aaCfFk?@c;3V^RFaXg z(A3tDS5lRO3jhEtMO8--81W?l;0p3|*H)0GH8e7&MH>eo0?+}d0A2vV(%R#lnvT3K z08UDBGPE9Wr9b#zbUg=vmjnRJa4Bli(*BG8A0a&JckZ450D>l5o8QLP!y1l5;n>B; z^W7i*FE}Q&a{hx6k^f+KxPfp?`Ul(p19SeZ^AG&`54Ldy*}!%F*!<4M)#eZGh2ziO zUbb+IqzcF3-j23Da14WEMi(zvM>xKLV?tM3OAi158S4+<)7IJnj$gqsmb-@U z057oY{|#IH8}_vIh1&@L$bjGZxjWiBc+#?3v(fU3ii*%G+WNTIdU|qcT3S0>y4%po zfL-5Ng8Tr0f3*2eE&%=?-_pXJEW|4+B*ewX4R`-P>3=Kyr`G=-{OQ|&Xk2Lh-De2I zqyOUlEAPK}-~s?Z;m?3r}cPe zX>Ci(^}i0{|Kp7RX4b#i!KrO)XX|bYf>)&vA7zdpdw6$)Y#cou!5~^k(ErrK|A*QB z&4xelALAMh2#THngcjU@mlK2lq?1tqG65z4$ut)(LHK9CsiNxx{#=8f+UI>8*pAe!E5)m>H@)61q>JVBHz99@DOd%{FY#B1WP^;zANZ zl0niyGDfmPaz_eAib6_7DnP16YC{@8nn7AeI!3xhMnxt-rbXsL7DrY@)Nc0&$E zjzP{uE=6ue?nRzK-a!6^{DgvyLW#nGB8H-bVu)go;)4>7l8ORBX+r5knMK(_xkg1r zB}QdI6-HG=H9~bl4M2@S%|Wd}{R?#pbqn*O#{sm%@ZvgEd#9*ts89` zZ3pe<1?CHy7kn?|Ul_jtz4-Vd^+oxMt{2lU_FmkhzeHz37em)Tw?X$qk4G;;Z$qCz z-$B2}z{6m{ki^i%aKiY2k&aP~(TA~&ae;}6NslRtsfFo?`5rSJvlep@a|81h3m=Oe zO9smn%L^+Gs|4#WtOcwKY;0_1?AO@F*q+#N*k#x~*sIt#I0QJ{I7&D+I3YM$IL$cI zI6raGahY)6;F{z5P2%q@s4}Q}sE(+(UI+F;K z15+B)0Ml<~7G?wH2xchrJ_{*}5{o}e1O&xOVHhRd6)f@_1Dm|K?UAjs7w~Uxfkj!7QNU{pDQL^K5_;Px3nR2W0^z!!d74p9n1Qh}l{!&CyR8jn* zIIl#dWUW-D^h;S-IY_xz1xrOoB~xWnm0i_cwM`9CO<65TZCRa39i$G`0B9&_Bx$T@ zvS_+#wrinkX=-I@?P~LC2Wk)K5a?Lwl7-TqNL~i70)MAWgtZxi4zA}+BNio?m6*LVuoik%G^EDeXCpUL7@3g?Ru(W7+ zi}KdsZTZ^=OAX5c%PT7-t8A-Z)-u*<)<-t4ZIW#cY$a_IZTIXX?Go+w?IrD#><=8I z98w*Q9c3Id9nYK;o${Q1J8L+XI6u1>xYW45aDD6A3c?3DgL=W#U|;amJC1kZ@7CSK z+)~_rxvRKCJPojzr25O z0CIqJ!1qA9zz=~NL2rWcgAszQg1?6_goK9dyjOT%`T^sE^M|pIuRbPzy!>SFsV$T$ z^nK`7m_k@ZI8L~G_N?T7?O>fCy z%t*+1$aKh@&63Wl$)?PX%>JEYlQW(BI=4EHDla~Q_sfDP8-i5nG z`b7i9BE@A8a!54fu>@4IUaDQ%TP9pqR!&(SUx8TRRdG;hS~*!ITh&s{Rh?f$ToYXj zsP(Entb1EGSFck4y+Nd*x{;|dyNRGFsu`i#ulX0$0lMB|)H2no-1@yuysfF7yS=1? zt|P0Hs58C`qbs!Qx!b?{>aTZy9e=a`w)NfO`%;f#53E-+qGeKavTaIYs%u(m`rC}`Og~HsHZrR| zJ2j^__ha64e*K5dkNpLgg|kKP#rviA%P7lHD=$}4S1DHu*4Wl+)`iwPH)J4Nu^q1kU zoiq2d=ku5gvWt>Sfy?h#npdmWuGja!qi)Dqqs*&f@TRGyZf zU7w$ymjIyvL^vTKBEbpy522!>prE3n!zU^Z4e6_3BrAW2Kvt| z0QmjhIIYi?y6B3pdNO@=c(V7}UvT@$azfLv#Qw_ZM(|_;%O(1}VNFCBEnn>FmSf&b zX|GGta4zwB{xiQH$9(fm1jwBCUTx5@ggbZaRD&-_=(q2CvGf11dI0M{a>JR}@gB^c zI#ToidB5#KmUCl{IU;&KI7aje-Jfx9S>EjkDaO=(=tnDelp@_=B|-9Cbk7d7cGz}K&vrfXc!Bk;K2_1v)cXtk`PlL z4$n_6-&my2M1V_}p57MYLe_UIEYixIw|E*1C&?9jSJHgle)0e#={7A0&X2ChG}0S{ z4|e8FcTx?1 z{&^ma6oEj6Eg;oXzD9caUWoe9L*66l<<``OhC;UE_%lFYS^Ux4AW>|shE_lgObE2r zV5vA5yp8SCDEGfbIC=&YjwhOP|Ehu4r4=!1#@}6{*JT+re=t(^*QH@5**5VraL-1Nb)Wc>*w|rpVdRl$6zvNb0U7nDc z=w0l-eA|!CmRw8!fQz#csD*#hgy_$@i<--dbGJEj9-pbmi_H0{JI9Vp_*!8%Eh0o;67jZf@aF1{^Mc`n=lPw_VRd%m)oqt2 zFcD}B&5KyL1cS$Q<PARoxd5GulQv1gy{`R>)5$y`NnjAkA*lU8WDdinp@xII%zk3N z*gWXSBJWaiSb|^N{kO2Aukfjqxn_t^?)BLOcju`Z#6PeL=Nd9IxvF6S3HI<8+!YQc zrtJG=RdE;SFNljU}dl``KYj2+Z`x(HoryhOj_g?S|lgy5= zollp-1u%E-r*fXc9>AIQznTr-PbvkVu>bjm!VZW3O`3m0?XQ2>aPdDh{s{je_=EJL z0Pg_^GAY+W{vduWVC%weK}?#jc1N_Cr^kc78M{z#Q}&O^rCHrqH?j+M70G7r9j@_D z@5~0S=4Yo!7iR2oCya*J;kQqEa^8-W zYpc8KG1yzfp_Vbp7W}V<00ij*ySPf*8@4nvhXNp~t%BV~M*3qjWL-oV`fkIqjcR9dAV>uVQ% z`?9~53WMH0+*!VQ#C?AxRzllXT-VXgJ8{;P-P*&t;I!rcMXkR$GqJrLtNQiPLwrVE z760@SkabZ^CgAWXyRp&x{?mYARZ!<%<@BNJgYLZhQm2YQ^)nzmV~(A$wTcU>Qd!5< zhZ>>oXB#(jYoQbypLj5qLsiltRB(ODI%RB_P{pa*76y2Y%%++DXMY7w7=Lyn|C=y~ z{ziX)6~BgKR{hka;<+g^97w(QPL7~Xa$P+_ zmC@L1r!m(rXl*U!k^8T@la4Jh5y+N_nTfTsIHXWFDla6~Xws7u4wD(gthGNp!d zj(l-*Wrv(Y1-}4R6o#zY!o^+ir;)G!*Qya-H;sfsrbLGgb7wKEO37yn(G2Rb}j_J866Ek0<(B_W4;nE5nCKcH5{K8I_0YJ02P{0 zE_F1iZ3c{}P@8l#s2x=DHtl4^C^R2&?jNRcp)ti)`Pd4R6wq?1;1PXI$hXqfl?`)L zih7X|Bs)@WXd&C!R$=L-{ry*C)tHGKtFeADW;v4;tcjcp6uDRoTZ~?)EVK&$wQQXE zU8v_Gc}>v+%qMg66be)4{T_@9mdlp*y$4;sQX)UfJvp1!sFuVSYON`|zu1q9+^lwt zcVpWI>z;YD`{MNNI%O5@nqZo>%=I0W&dswOGB{n%X;KpNHJu2OL#|U_74F`T_=^Zq z7_YawI%k25r&gMU3P0|2l9US<^f9u(h(@whf#UO2GU@S9OwE?BSQ;woAJ5I|ugI1j zh-((4%xM!NyBep`xkD-}gB(G9;K9J7xXz`~z>cGc0{6^kKzc`4-1s&&=H#-N2lc~# zOj@(oSwe2Ega-i!-g(fJhs(zXl6s@ch_Ea;}Ph+*YR8E{YqzDx6fYU zO_zOl{Db(a#A@lnp7-zGgXFWA5oRwpmnw%d@t1{JY@L(~l|`9zhxE~nZL+LYS!2y2 zYIp^gt@3>%$(V=3O6|qM1u$7T*P`;KW+vw-dN2J3edEo<0xl=*rSi|qRj$tNzjaI~ z--_GoU)ZHNch%MK3fim{w^1Z4Z#A2JY?^)u0Jn0}fAa;GieB(8Fn?GxVw)$sBjpcK zkj%%6Y7}Doh(4^?*{~Ckx!hU)3Eg`toc4>I%eLyCAWTiLXUMi^t;#bwA?Kxvssh?QoxI|~7JL$*>^%vXB6^S*%^J`11GJEd@6XYc^1;I~j zHVu}X=?X%UaxcSHk=ShcWpVQm-l?N28~s9R z(X{KNQmR@NOS+tBSxf1BZ&_8Ge^92gqPfr4OpnVrhz}8+FoZC*Kffw*$ny43Y(Q~L zs7{4nr}+BrcTjoB0CAwM_ViPxwrolupW?;5r6g1OBptehpwwNbG}3B@bW$&KGr zP$`9uU2O$jH;0a>Ue~I;OP{-0x&4!$5gUqd$Je;mVF}9Ju3S9^a&h5BIk7ZOBId+} zdt79?7tA1StwzH1jZqcL?Ofr{cE|Sq)+GJVU4n8`k5#o#JAA$^Y`Ns)9(;Uv!DJ9e ziIgnI@SA0Emz-^(Kqf)PM#%~;G^Zae$KJN8M<`G+*Br~=Hm-vKcA5-mth-B&mR`*) zm@IFhM#kt1{_l)T^p{ku8k?sZi@yYE6|{Di7q+KQ=V1{lfHEeNn)#X)tNV;oL!#E~ z-j4H**B=m8u)8A(yqoPz9J7e-ueN2WwzhWYeG4k2>(5<%Ei^_5o1gaczu$|gs&&s@ zzM{xEV_8ZQRz8(Ce!Jb8wRD3MM6^a8Lb?{ydYV}m*ILx^5vuuG{*!{Moas>yudR(r zKaQhZCM)|UZ@+WjBFw0v1b<7lLD%*>!30NEjpjlOf0fI;^IGgd?{CSBHmCNuy5gCY zQ4%$}R@m6o!kZa$avv6(1+i8$GEYxJFH zXAxy_1XoqOz=f;KzM#zWG38TtMX(rm`{SOf$5zgD93;i3v2fJNuadEKWJQT6_LNjj zNmx^Xe&}KNi0qR#(oio@A+**hSr}wt~FKTwo+H zo*Mc^hCI~%3!}AKJtQ)=LikNVlk`Be3?1Z+sb%MQFQiq)=m+t-kN&rI6#YG3D6Z^C zrnL{ZY%_bk1~f{&9`mfNa!Frp)3%@2#*Sp;nyjGhw*J^za7J~dIqFuS#(&kiL+M2mm++Cxsm_P8pXx1pHMG+|JLP!9%#tjpTdG`n zx|)-#4hxmJoTl03ri0=7^^@8%^P636;Aas{MoiN24|`{U4>%%I{i1^ zTYNEUH_P?B$&6KTswrMCevai>Gj;-f*`#2EPZOsyl# z6JR5Ii{o8Jo%QWa6lh9cr5okkgjw4mzm=ENIK5}_nxz+vxX;AoW@qcm^WRvOW~Hg_ z{E!M}hfEFN%rVC{s4S0fCsxQ^WvrxCFJ14DIg8!imp2IEk4S{I6=^}i{W;LdpB?=j zuk!9Z)|d~3uo3xaMm6gp=IwB8FFWMY(;GL-5v$^yixj%)mVUp-DASB#;vbD?XRv zYOkJ-?#Dv*#QN=y;5q6_lwt0L#*^yN3`e64{p5F;2>?arsLVyb0fY!*jQ*{1~q9dzRc zA>+JI-Wm%pjg(hU!JRv`9UF&S+uN%#yT?w_CNEQVTEGeto0kMLBOGxlp;x!NNl`;6 z9+eC{d@n@Pbw{t~3YJzi)Z^#w`Ay;7#JlsP7q=apH|FdOn*a3-Q25@$GiPSMvz8!y zz540me4alCsYL9`u}c&wpvxX20G`*-+OhPv>C z@3>_0_ss!yZTrCc2!lJRe&Cug(AKcob?;J8YpRUmAS7!w=}0n#yu+T$vh9equWeH) z$8s(tMw}sD#B2Uned*18+hLc*LGX`(*7o97Xl|yMz3_zA%E9-Q)`P8vb+hIxx41#K zlqMn0C*dz6f_MzLc3v%>yW3~}p1Ey57B6OR*LayW&F`K83{^tcp`qs?vOlRc93yX^ zgn|Y;Gb$Q3c9uD2fhHHvfHxOQzWXOj6C3_!=nN!xYiHhRk#|_5Pd@O>dx#UoMr4;y z_VagkA@-w5rx2*Z=twt2usYbWs4KBFa7XzOXRY$#e&l{ZMS?y3`aE+YhQR!sNPHePOG8uI*j+25>;th^*yb&_-~dF5NDv!yM1B~Y*Gh@LpOzKm=M)rH zNGXr#6iQ7D1APuwu8nMk_F@kv_Q>XEO}nqA*u@KJm?H#l8x&TRWq$uoq{)4<%t zZ_CG#^N>3jFE}9SxLWdvMuGCs1bwhGkf7OuBu(OnSe6YLvOpzWt+0CXN-mFj+I%~K z`5llZ?FveC9n53a88-{$IWPhhg~i{lJ_FPw5|2JpT!=KVpFDYOT=~U&I=YV4BpvV* z)jay#l&nc?nI4BkKJ|6=vE@~+MlDquBWkA+YcK5!H}x&XqM`p-?i!PwcC$ByR`qWp zhSyzKd{$QQ3tD0zU24&X#PruMtBlQIP&+ZO@O_zn1Ic%n`3_dj_cb z-?&jzWNmcOsEZQ`<0Z8!9stwtsLo`T^U#H9yzKdY3ma9yemI@JY9DwxEEqdWy&@7} zod6O4@~JVSnKIF;RH;I2XjopTXjhB7OUH6OaUsw+GZEU)UeDgYhOazOCeX-#<7({) z?nIcRkyLaWPPCD2a@&|} zl9}WN{gy^bXIiEAGeAlqzvFghdH!gt$1v3~>ZX0GmP|;BWLRO)nMUymG3Z6$nMq?O z_BvQCV9#9PgmpZlADr9&(>sxCsc?j}*m@(%jmhO5c!-mSZeyM&)Po?JiH^FqD{q0k z!tYJ5*<&4hhjATyrS(TS!`U5kx=YC{aK7k7Auyyt!};V>P5VP0<15Z*fU$o_Ubln5 z#v@RiXwWU!KP@aP%G3#sJ9@8D-pJ2jY|SJ>@zetPBy<&BBI;b$C46^loU--1su-qB zgue(=VRO^1(>)x~Z7`~zC8!^^P*c&-6DL42ywzV3Gx49$$TvOf5dA&h6Xg~dL4I}} zJ-~8%s42Q<@T|Q;l_(RlC9>%Topuhm0I$bapgCJf5Bb^X5Cd zI59h?2Gj~sUj{nNw$_WR>Jw@kAi}Ppj}%Da)`qKWnxO3C`VLJ;>6r5IexDgvN@;qZ{~a4*ufX#+OKT+qen%C z(nsQWv+T=i?=2DnD0&X&#O7_Bx!{v9b0g$s9WI~AR_U5 zGN`V1<-^HNqGT_FaLiKS!|G)`|69RftH7Kq?vIBjZw_}xt1kLY#>wn_^WR(KqN14o zTzEG?7Njb-eexp3V&R1fzhUqprz*q)F}PJH&^v4V=;$Z&Njz?a@!?oSnc(_)VNM%E zCVY|>O?AqWlDd+sT~2#BeqK78t{Cc(erq!F*N_JB@^KvF$prLC@YMWlo%-qK8F1uv zsFSv@;_RfqsJ(dv#`wVX+E{yfH`O$E!xhTpXv_ovY6vLB% z={bn7tB@$Md&`&G@s!o|E;u&WP1JKA2-(5;d=m+Prlq|p%1UJB%H7mw7l;$hi#OPS$J=rPszyg+f!n7&ad9wY8CV>aF* z^i*QZKCv?c4=>FO?5n7`PL zXz}Hr+jog-Sb~FG$H%VpH-8jKSR_?^J}Tp^4*BFI+%R$+5en?RDKn#JZ<(-J@eE0$ z672(mPVWs~d(H8fTr04GX!5uAf$p?V95pg*6Huc`4v)j3$vDxS z1$c60ydT!OF_!akE9bO2#%J7#MWJO6^Qfp^UB|;d&_0`jF-u`$@F&aJU4vW`Q!cLh zuk=0VqmtrVITNub>lizq+&-_tdCvj!iUF6SI;vme7cIZRUxB^^NAU$5K%WZx$*Vkx zIipK4=y>APrH;>df%B!cMRx6-0CZ23IXL$8wpV|xFyP6pTB9(l%gq%SpM2X={>VTh z6qe9B@WyuDbhb(yYC@^rQ%mdTxkGW6C~co1c244b*YUWwu~rWZ7%33~DJAUHh@L+K zeElLeuKYb(AIx*&9Ulq~#!=?{A();vkFDoIJ!|eG6C{`HV&k8>{VJW*e5Tc$lQa*j zEjOmh)0+wQPFijKPMI3Y5+*86F5V_jWRu^Gefgw3)J62^7Jga9DIa?6R=EjI<_33c zBwZcP*F+FAE#XIGPvn!|NNQg=^cbbv-S{}%`CfG9WZBn5(7H;_vQ=K3bds5=d$s3R zn|nD=HDH}LJ&q+G?3J5`wMZN(Of^sKMVX!AbnvUsJ5n0%)fUF7gJ*^Y1PlsantKc1 zCOzmh**sFVIF0}OoR+i$%?`_S-Tlidy}tFgw$-n5^NwHeji|CYBVY;Ht@EYXUk_q_ zn3=;nPg45r{lDT}8{FmYRx~OuZrOj{w=|QM-Oh^(QdZ)YUY{0pU1MA#R1LaxknOprTx*y2+^Ue zbLP(j?`aQA^=#`BAaJEjo*+@V6Ba+jz{C{76-#DcTN_*K{!xtyjCG9(1&Z{F4N#43 zwoo5}qkBs1@UPfgnL94uP0)YogKQhj*6X_p-Sw&DtHOZ&caeK>2be9r2DGBc?icUwP$597L{KX@61d=M}b0ny{KHj~!ZQke6 zz;!eA_2b>&Io`~DGhtA+O5(*MbiT%2N7n_0F5p~mR<0dA{47z(Ve(fy&&_eOTQo7X zQ4;hPO0j9);*2>M$8<|I35D`kyptt(t7ER;%n{@xBM{w}Nq|>*WTiD>sH45f*DLA_ zsdjhhP|@H%`V9NL(3an%b1(FBU=P@B4{7~md9J~=t3z58zJS9Kx86E;_al3tiQ%nf zCBqR@M8#rERJQi05Q#)(n?3nHv-|lt+DfzC?Lf^VM?Y^3Pu+yB)=oED%H=2K@fK8> zj<0vtkvxZkWPVd>4e^_s1T||0;?BA6B_3-#zr;wax-%2-Kx6bI->*+EZspVZohI+V z7u!2CswWalpt}|i_fE6m+jEb&(bRdM=}N}gG;oMF<$8jtskhi(-Am__M}7&nP?T7c z^5WLt*3#xJf& z`oLyhp&|+;5|^1Ll_h!SaY;D4L1W{q!3*4n)9v1)APo52lVx+#W{te$zsC^sA<*_G z#3q&fA*1KKgM9E!RQmFVjIGk<0Ema)nvVafjNfSb5ftBE>zxm`7FRVR0cAHr!rqL7 zNd-hWwt@g5XymAFKDA*!Lx_tTop#keb@Pry<~V1MC+S1fyu=fOkxc993p4ek>cOCL zGPR$ff=C1bDjxp4-GzC>1`dcoSzp<~@phH>iag)0pN6xAT2dh*UoaiE0M+^&Xg}ig# z%IVnt_L7b@85BTFQ@JgpP2bQ}keXEW%&NDvFGhHeTbWUo6k&{lu+@-rEB25-f2EDG z_1vL4=_t1ehJk)tRSr|N``AvhjEi$Fqs}*89MfiU@}ZwW3*3BT5+DWI?+g8g^MoB^ zJUvA<67zNkCy^&lA>6s$DI0e~ik>F+2SXNk&e}@7RRSBtk}NnzV;V3cphHVTs=!@{ zmo#hqD$cAmjR!IA*E#XvvEwX#)mR!Wh&k$tn=0W**0`@%(ct;#eWb%?j?3zn)*x~vhABuuTVDK7(ID3~+Ju7bG5R$7lW zTHC7jpmO6SR)%S~Hah?71Y8_cTn;FSVQx*U!GlQ4Ys>1JZpQLh2IYpI1N+^U*UmrBhRdfvC4+%$HI>c=iB^2o|Hj`+5%CMcS3$ofh z)Xu6>=6b1BR52?kz2r*LCPr$aXSrIn}Y%(J4{K<(#|T@vAy)tqtX7n@f9* z<>w;5?})fvy}E}Bck_sBReJJIYRVHZ^Z_lWp!kdi?FyZU&bjBRzUi}CtCI`|fvg@^ z8vOxIWi5%e*wl$Ja$? zz;>fAaw<#OF-*0X&$e+t<4>vz$a%}ZB`h8J?h%_}HK{<@#7@OH!xp5b!18E66hv|* z6@8Q~%+~YJ-QN6}W%n_?J*y=wF+X6c?+e3(Paw0s?B-%myIBQd3VR5tg^B1U;8pn?ruxHpDn-(<4lV>O0zt zdOWT4v##o&JGH)U#_m_kr^biFgS08W6C;b&a!L#ELy3@WmigP?N0kyKkE59@6_L}u z9&4LKdGA~5EUd{!%T%GsW5`th!S?Wj|3+#32gX!giXIW#j+8mNyzrq{7f)X(5IyVv zN=*H@;HxUJvT@m+YPEPH^7Nr8fBUgqKlI0YbXM#tP3iSHFrvv%WL9$h4=DgCcxa<6 zJiG=42>}Ha2^9qq85Ifs{{8RpMLc}emjr}#yl6!9418~hY57SQ1q5G9Grba$(b9g) ztZD5gEGwt;?!Bc|0zAy|1w1wq;RWI|;7+{!D$heHZYZcyg#1JocHyXBHn%b%iKlX6 z`3+s^1 z^k~#6nPu!{(jRQxEHC)5hyW`e`=)2mSQw%Gg^26Aa^+!|DmYIswkuY+3CYU(xCCBJ zv0(n3ZP&MFK&_xqY_w5APqotum3pDHYwtmuNeafY;=zg3-G{ouOAn&bX)|{g+h3%~ zBR!4Xht}kL9kW6Ky-(>+`5y(l634FlyDfdKv7kWn-w9>tUV%G6y@Y9D@G3aiC9Fn#pb7^g+e~Qu9Q8$MVPk+rDYgg%I z5$)&MlV|fTtU_281)W_P49jM}(DN*em%J1Q!eYl`Hm`CMDq+rnx`vCs6H3BLDYBEs z;ey5tr%s(DW_jlRrr-uwRci%@)&143rl8(G(h&+GXeJqU2F zWO{~W^6h}VjAQu@yGxi-skdKgb{-QfDEsh3eq)t+8c=8Y8E|7Zqa{?RMsHfO#^BL4 zyRxkL#W*pdm=5Y(6p(1$o$L_f+RB{IZ0)8a=&{wUuGFBPaO|Tdc~>97G|S$=#Huc5 zrfrx2&8#*F=@sU4p8YI7x})fs>gtA1!7{561eUg)eFoG~GG#e23aga1@`+E!MeA(L zlEy}k!wy|vU7;wMuv-!iQS5VwCf{cJseXRPB67)M9vsQ5m=vj5^6q?*sKBv4bTj|E zx2Mt9($iLQ8FgNbvh2Yc#o#X*UNdf>sj_j=%+H^r`kn#Pomi|1u zkeE*L|1IPLW_c)#WJ<}nScS`DPilE*AV*FgUmie+Io(}~h7NcK2WGdY6ZtZIrfEK1W-O4Sbl`hij7U_9m{|&h zooC`}Px4s?p6Q_uGt8N%Dlfw8^^K1%F8r(bfJ=edL$z&2(X~h@)=y&d0D2aI+Q82r z{p)8b4bI^QzAV$vbLSd%O|27R4C=7j~k_Wv@XaKCz{bYEu4Yt-J#$w+8&W?Vlr%4uPd zxKgOTSY~q3T~FRpIpC7K+6TSFUQAp(Zu*M)c3g;d%L+y1vm+m2C$4n(osG+hK3L@C zNQ0qx4iHQ|4r8%YjV5g8`Vc0j+dv++1M`yTT(*1JYnLHE=Ev*aBv7wLjc=u0AkU>G zv2k!aQPMCt#-Uj}d-g?vjF4__&Kx_ZY`ncTpTuqwD)uf{GN*L>dptFpw+SYxhb<`# zH%CQhn9uTti*HG3%Q8-kbZ*wJYhAksC~%C`eA(Ok_jGLUyZ$RuSD)H8Z<|jGn0m5y|CV5mBiA-qJiY)@TW;Z!~55>mj3s8nS?U(2N_=MN$xpRrE1@^h}m>5 zn?QlC58(G+uWrzEusNjV*b|n6+E#r?%9zPy=N1zM^a~rVKa~$G5|`r)RU0@dG9BD$ z={VwTVl1!XeBo1sXqOYA#in;7IJx~IF2NU2FR+cE_E1o8JWxUUcU@8whzQ$S=TfJ(a}{$+WE*cg z0rJPqLLf}sriC9=^MD4}6zf!~Km=INoBe?eWp|fnK$^i{qM7c_N>h4>(Pea%`bT(d z$-kKf-MqwhocU*9tgv!-Yv>)7TNMW{d(E3LnW~v7#n0O9PvPQEpT%XWu=*vbXhYYrs$+d*t z^v~sSB~fYZaZ%#%L#eQiIG^lVTrhQ}kw`$Mabc+((U5zLszjcxp7Hl1md_)Wv!s@a z8iows{j0E!3Z-Q0MlOBz%mZEl?pRyio4W|NDFwGFdC2>B95ZB~FM|ARZnjLn6K8P5 zO2t;2#2Q`{!Ha+&qNV$+(y2u|2C(fH@LS}f>dJT?vw~gqOkuTWhU7Cqh6;YtywvP9 zn%qu|lNz*1E!q0ur+gZboVXn788Op58uEi z9Tb8Fwh}t_(qcAcB{sLlmc@j!#|(WfI>+d1=hA_N>O%D6d2LfiF2Y&HahV>|gW*|y zRdW(0trf@=dCcjE-sEC|nX>MudqLQz<9V(41~YlK&I~f!h0cD$^3tnz~F6PN_fEJ$xf-P ziyzaUf0_gli89YVzIJkAgzrGLP79L9zR7siXeLyG7^TJBHB4pe%57nnvMo`>3vUwI zLUj?!LUR$hj0_}wkA&5^O5CJ;DEfPz-CgqCW9A`T=kJ!0n}@EjC%{6oj2zmE?uLfL z3L80UcPNJ=o&mB&1%a7IXHytiylEHioGr0BsW)m?2n8}9B|#L`LLZ}zSZoI!dP%+5 z9K9|gn5_kMN(KujRCMXTFgY<6D+@clS`63DmM<#KHNso2W>$|SLf4scnk)jk6yJ@a z=IXGZmf)BNWEh8M_8i$9=n&8sYU)^F87Gh34`3gR>M0XOA#bYTX$(2FBY+zx?M!f5 z&hh$q`+j|gTvS1XklDa3&D1*GL|XOuCA~4BT)P#ptF9%PO)-Pe-i5jX1>w91<4;T{ z!^mPm>bjm?WYYOEZrYSE0T^B>x2~tcS~)zH{^F!jhrQOC2hCUjZ1sn>5B=-KV}~dx`c8Azn1ZkQ;EbjXSmz&_4-hI-HkHmtf0^K zFNKdBC-?hc`l&i$cvR=tr|CqH*`#IF=;#&~tIod_rE8Xwc1!&UNpqMYo{kw!NI78p ztfx$A|CXI^p1TU~$3YT`<0*Tlw>E*^M(*-!NY`@8NDBCdZH9==MNl>2w##PzonnZA zQfN8D3A>4&S8*ALgDX!G+O-QY)MNqKY}5{ z(eH#I8uAqB=!KL)pn>`ejkBTL7F*p zL9QxfEGthgGo;O$?7?0n>Q0-bQPxOZ;c9ocWUnW*9d-FxIZM$+)%fk~Vrn@)aWiG+ z_O_1sch0gw|I}?kh1d~2-B3NDSRL^IfhF@|NRqKvBTI*_s%oi7+;|pc>Y$a{S@y0vFAx4E2SmcPP))w8uRC)4VR%Us@*FK{+sgd=0AJ`%84zXR= z`4}!0AlCC^^A2 zrMYcw$C^Qw6|CA3MS*70SgKSXHDT$(d?f)DkTg9L9!@&c$kd_NG_+L9=4--(zn*AV z;-U;T9f(Uj6}mLV9IKpg&~ou|v))PQ6W$M7c9qv-bwkw-gy+`z*# z%(gAz9TgZ+!%GVKCbw!wWtoPJ3e9kw`{mX@*~o_B&S=j->BFGyShu_?AReAHJ~oq2 z7ePkPfoFvGLxv)`PPT}zk*k_2mm!$FG@*G2g&b+bU(C2vp%kXAnTwwt34r3-70re-@{J*f)lUd6~`=ds&xSBC^7g;di~}NaUKpIak$~vsSItkhPa_Y zmEA3@D%UFTfaNy6+3o2wpzrz_;PS)dF?}hv<)cZ+Q1eJg-Kcs+zOc+I_S61%b)WR2 z87uXPZ(W<$n7V(s+r9c8=;4eD^j4cFW&D!+E3t{mk4RjHi&*BYcpxDrV*$KpXlU}} zc{C=F)hev%rNTXE5_N`8Xm3^SBn1ES!sH=-AxE-uj3bIoi<~oC+IF2i0j?Hnoyu8p ze_-|e2zb|I8~V_{M3dOVR`nXN2(fb*5m8K znv%(8oSuHZ3thP=48aX1sA`SM@Y*in`(%->B)RPbL#veR3J78TzU2B0;I0+NGu@v1 z%E#Om@z^^X~E6j|8bhbqwnaU6WbOgvKDcjjz!+OirpS707=EHgu_X(2GM&QYRi1 z7X0Y8Mr(8nu0tj{I3E!kiN7km&0jJWE&aMTRh`@ZIVt%9Y5WqvR)!+9kX3ENbrc(Y z#n72ta%GASeY zt*c$)qn}H-7e{0fw^X(+7bsNcZw#`xsuiol66ND9XkT(}I?sIq#`LGGw`u3tal480 z-6X15VSAIUt33(oe%=|xDW^KdGByNlrfo+<#w#kU4zka!U9EYGS<3W{l)nsX%NUt| z=;Rp+2yKUz;E?d3MHF9V!S%lW@)u!V-t%e?&sHe*Qug7Cat!LV8Om<_xH5rFR+md% zdk!C;yyJ*=@o#}@k%!ZTpBin&RATJPoEfY-cuv#9_ll~Tpqs7|W*em?{Zb$67KM<2 z_y9$Vx;$-ZuM%BLk?Y6n#^+m-KN1jDkY?3HoTEvYpZt7 zN}yyt-^UCbotUlH>iwIvGS739aJUP$j}@)@$jP93Jb+FUXTyF)6xsjg2(9V@B%NRw zeXLZS&)}6XS1hx#n1}IO9h-!gWZCl2wS|)VAk92OtNcpN2ff3bQP1!0E>-_SjEDY_ zu8O2hDMu&-V%KkX?1K{B;AF6rG?N!(rdicDbC6M2Ka(kC8dNx|IUny)F;BUW9Uw#e zNY}+wp{9NBUs)nJK%rRycxP*Ay#}L>s|Qiu|2UN8s;-$$Sulx=h1TiI(SDdnI;nHP zz3r^m4?)cSS{j^ooIMzx78{;llKLwSIMpMa$ARd+FRWl!Irmt%?4HRj@mPmmBF3&a zqREs|Sv~Qn(Q6oT%!H}k*#zeCc?bw@&U)lzLhCj0zv(QaVHN1<-Vo&Jk1T4{U@#Y!afE$WES~t=F zE|k%(x@$e(vu1%EyZsBJig#N>z`X)ln?LPb*sEvQDCo={JLF{ae1I${^JY68yh2t? zQSXcUmC1)LvKdmJY9s4ZA{Ov_Bqx5xd$8?G3fscf4*iX5UWgWzP`t-a>MGhnIRjWLn?=jtOMx? z*JW5hGP(2UG>J0kG?|4G56N=5)e)lluf+xUXvZRpcjPUw#&Yl;#Ghnol(K}&QgC=( zm_K5xXOX<%nQum>rQ`<^^~JpL=2w+3>2{fxPqS)KldI?q;>D}sdEgXeIZKx18pKJHwtV=X4IPD5?SSHUZKS-m9OQQIIne<^?<+d~F(u8!uXzwizM<=qa ztAk+^aSRP4wVBJ%8S=*NEkm7Dqs0vY9IEMJ(7Om`zkP!g%qzsXtp^ifiI1(l#T}fs zV$Hh1CKkDa%vOJ_PIfK3H5}VxD191dV)U${9sZ20jKXlw2GUB}pNCqWvz3BT#jBIm zXi~J1_vSh9_ce5|KeJio2v4l5>BgN(?fg79*%qR zJM+Fs$5R)S`&-0r21>EhO9Z~g9Xmm$W0;xKlQy}Ffiqb(b9n}lfvNS<*{Z(J&rA#W5DIG^Z~WHIA=x%c@o!io2HQk&AY`Co*N zG>*y1ZW~L}Nq=bZ&((OTb(K8c-vKs(&ud=FZAw4h`d;DvGRn?A2i0%`1z5o!ZF=J6 z5Ip9wQ&6CD-vn!+u`Ml?XZmQWJ}Mpx$VcQ%X2_k4OxdY^*ozQ-ykM1y%D1Lmu}S8U zZ;5eH$qAT$=6KT$=QB9OkqJ-o&|L zG>rLdH|)p-d;=pPWkY`vRLgyTcfC(!yi&#idy}fR7)ZLTLmtSJ9;Y6R*FMuw2t~Xl zdi$dM;hFs=Ai>s+ZzO&;gP^!UMP*UBZRJt`Fz=}&^>d@A6CMrNRQ^o!TAlQA(e}?; zXS7WDt%Lv8ba!S%RriA{&C9X+oMzZ5KG+R-Mfn$@cqd15$ycUnQ)axe-L5=MJHR=c zD1(6jh_r$|9u|Apj+1=z7Kph_cuZdU$B5S&tenAxJW20}wc@7?*5ex!Du~== z1qI;eM#X9{uM>S5*8i>QqGe);wX0H*wDSuibli1RkAC2go(*tjQ!g?m`Nk?s@Z}f( z8uFcSI_jOVALE}zjoHbC5T^g-N^ zOVd-T>W4+`oyOLaX4dY0Pfh!HFcXY;HaCYWt0{+NTHW8E&`~9kRIkS0g3mb*?4WIQFi(ynmqj?_+Qv)G?)kYy`~8DCV;E{ae9EILS{$?pk3s)z-L zEk6zG^PK3rQJNX$)!S$=EE_zu6F5i$(nt)Fs9^bY z0r{F0443{5=2w?*`)@5e+kf~C!y4On9k({#MW+X}Zo3a;v46Qtb@(l{>l_A}HEzh& zvuksWBA!;|mJb)gGcfT~HjmgTGf!j15EE`?i6fosRdJ2LC(mlI1G7(Q*F2Tw^`H-b zn=~$eam!Rbn4zyBA2T^=Rblw-+X`ZuYUduGibG6&T>bLB3Mq%cTI6(qYbZ+DXCQPx zL$zl0TPDj_8ojwGx_m-pRxW;)7FBg2(zO%G+wl!v|s%PubbW z4=FKs-Aq8~FIL55l?1tfK6khNuNMU&-I;^J>w?0zPwwY#(>t=J{gYo zj|UefI!>H(m5j_2?$9>FM6h-XsoF4$4@;@` zpV-X8QFgx7FT6kZfWjySs+fq@m>0Ax$@IB|+I?!4k7oa*5qS7q%?92LV;_K58b%Ou z0NrF^DyI`?8R{pY{ef5(c z+Zxmiqut$-))VMQ{V-x5Zng{fmnZm!4UoxqP>I*;iOJtDMTt8*K$6*U$crh{CGNB% z&v*tx!{wkCAA^1nFowl3Jf@Ozf9swi=I@=zUuMDnm}>AU)f45}idMG-Pc%7Tt!L@P zs{j>ng;GXiky0?xY(Te5YsV#hf@^zA5czH%7tf{T-Odjm zEA#nC+8Dt?XwP`K$0tRYiZNw5maCSq-GGAhHi57XaFD@0;{b=b;YZYK>o8s_z`DDg zFd;J1z!zi$cUDwn`cTjhEn$+-A^Xr#*Yyrx(7Q2O<#!Y%Q0AQkK_HH#@Hx}Kd}ny& z=jB83cl&+VcM!Yg7ln~qGm8VyeV7GwkCznSkpzL*@RE`vYIStLY`FgAKw;zwvM@4Q zS11o?IFgB@$PdL0``2!azXw+W|bWl5d-6ew*IORn`0)TlwxHawUtchSkVQpp>d!2EW7Ki+8nKq43xURh9 zSdrFrTQ+9xM63d(n^IB|?w(UH1JYGF!_pVrXzUQJHVsB4kaBHYBI2)l}}ayeTB zN@T2f1oePNqN3kf<45xXqKAzN=kJ1E-uJK{&)c;q1Xb0^`T+KJ? zT9RhI<#$cU?(e6}z_(`q1Pr4XwT4@Sf6_LnLsYAatKz8ayFPT%)U}_WCOK*E^1?)t zG3SAEA_6E++0}PNJ_)ac6KJSLQv1vvu(noyWz@FQ_wM&z6jIKSqxbr-nU^7-!n#a6 z^!S5Qk%*BQMr>{<;H34Lh0zl?q0(R+Gmy8t)JDl=D}%=0^e%0ZDfI6 zbU%x=m>>^e#ZGh{%*=)Nzz=FLI#t_o-dzcX*`hD{lwv6Yb#kP$CbzAVA*64!b*;ne zty>(7(yFfYN*^w>XW6B?r`|{TF^uNV+rD|&P*T@5BKqlZZ=(T*S2{DZe_o%mZ5pD< z$e$&lYU3;c@sW~ajmkcudEyIM^r>WP->bn0z-RDU*b5<#JL%|zL`qME;v-cx8?c6# z-%#}r4V|=Wi+z=s9RFGQtcOigZh2+tSv021sAQNB0y@xJ_$hd-`WU4e``%A$2(%Zj z5PPt%lAY3cQ7u)LrZ2q%GF%Y;y(a0BO%w=S0!T2(v)k)t%YFp0c_}Lr5G%)@c;6BJ zeBnq`DO{OPj4BE6h%_v+CB>$Wlw1~chH(n*7!1j4SvJ4}FWJPczv1yG1E@;vC zCwsVieP0czq5z(x009u6cDPt(-&$N;7*FBERI049M3i{{SA}OK0Wq6IP`}!|nQAE^%Sozg$>dx~(+7BS3F`D^-DP*>64e~H;?Rev z!TzjQ>3+9U+7t;Q{7_vV^~R*HXwG4&JDQ*Q=pkxmXh1}`>U!vBTEPh%xN^a?92=eW zfH~OK?4pxPmnED?n?0fyYPkQhw>0w<+lXxLU#$b5uk(jlL$j%{LwdJI&iCh+VN@Dn zH()dT_Z%V>5wb=|($LZORSpk?Vrs$1jV9nMwsz>E=+I!Y?zDzp;DWBRLrjK$`f9?iACmY-4p8R z!4T>#X}iprX5|Iw5cJap8cq)IP$Dd&zyw3vu-X_Mxni6iwbHW@%kt@#O@K z>EcGEhzj%W0mbK2gjTAGMeZ`F5Wj=j8g<(w+TGxQT_}R zNM!KHTMdFiz7_h8bgX(VQfl_GQg4>zFL=MrImF($Cw*ItoK61SElB_Vz1RTi_1)FN z9D4Q5Zy@gCDy4JnN=nq!W)^lybI(WA>-HPMYu9R(8@BA3tAO$=S z8I2%bSJ}=g5=~k=B08THZGsR0l~^hw?zpykVPp51`D=I#VWv z&7!7xp}cJ>66ex!*qqr2QG+)Vx4T#3Pb!keuZ{TnX4kgw_+$rIFn^`@ zY8B^+Im()P^{Qw$7j*?CAv}KsGlT01L<-{DR%MKvCpH;1!%~LtXQj$|Dht$y7d|X# zf)^I?sgdo^C*^DpCKp#7Mc#x^HvQ>%9qhW7!5r&6h6KJA0NGOAw=FD`=SZn|DI1xw z$p308WeApI(38UZu`Nz&+CW!e$V#+}J5yC9n<~sE+egMQIEGBQSIFJ>L2s2D$VnfQ6tDu2?A z%7n*Q8j;K4Mj={`c*L8Mu?2RZd7>}90Bf_y^`?WGG{F;<##Rza+ zIfzb41h`qz!Ff^OP=8jA3J;CBv^vL5JD!O7s@A&X6r~sK+^c1!t4A~fpG(`5%L@52 z#~uSvGE77fKg^1hg$6rDJA~*J={)a$FQ#>1hoHTa!;is2IdL65iG(K%JpcZ&jjT90 z+jV%_oRZhH8nm>ujFA}#Ejh_%lBSQil8<7bLvJZm~z} zT%wKCkA54~dDyMP4(j`WWK-kp=zRN z*K$1(oXOeBV3m0V(oZ!#t_Jod2~3xTEn1mr2Bx5_vg2uGT^CT;koSBSnobBF|JXt* zTR|QNM>0p~4^rvhad-@w8y!LfsHl9)RSVo!rTSCE7%lHwHoOPD>jFuj^C*}Kj)>^r zTfgTa8sBk!s}9~@Ioa|&IsNy2^Vo7;_5P%twip8gwILK|JmtIxcIQamc}%w}32XHCD3st{flB^Olnc`t&$ri?sK^!PocXs#W* z>qq^!rev{0|B=wym5kWg4%|_GGILw!4*5#wh7*G+Ccfz_mGat7_P~ijYo3xWQ&(A0 z!h(b6un4YhHuG06svH`R2Q;{uth1(q>cAVS2xa>%vt`@`NX&-r+wPVJXJIX;DqW66 zqLWBtinN0?6(3qK^98-y3lpgJvW7g;djacvIR8->8K;yYt)7YU>oQ%CUm*U#FqODR zm;Jj?E2{pis)Wbb;*Yq6hSCj%h40{Y$KBiPQWTz7u_+SHhh8I@g+d!aKPzjr&5fI8mQy%Y#RyL&Pokh=dB7FelAfA30N@qBM8GotXVSGxKj4^I*T!I6 zzWiHMA`m5wDf&tM4OL*e2|l&M{ZAtng^z^`tc6u&Pcho_6qel^teemdE%1`9Y9SnW zuphH!EOS9SA{r-ItRm=W;#o#Lrt_v~Va)}n>nv|Udxy2u)kavEr?hLMzN<{BI~E^W z`oa*I{cINc_8BJs$Qhj9RkOr~g7y&^3`Rsj!#gSL4+Ck~7$BJfDV$RI zo!#foIt_mIUJmY*cGi{ys0l7N2!3=Nbu8-x@v~`9-(||`P^G(8(Isha6pg8T<_wfY z%l&M1z%E4YW41E4r!pSK>XCsFotyVF1m2&AeA$|R` zzJu5Ifl+|Uvof~O{b6L`^T6wZdqphLqiV;ADxSd)&@ZBKc%172f{%<++;Sjytoz@6rHStaYYC;|P^aiywbMz1oT;^V6@)VT0tlP!6mp(3nE z=Ze>OwlE7>haOpnav#D{X_K((b#aC*YcWht)ZBwsj(I(s7Lbf3^b53ciJK82F;6BD zf#z#wFndR=+iTzvDOs(E1l+?$d6xv!mW=N37{W=Z!H5WcD9e|NF%oRz<+)9ZxU1{s z#71j&nah&}x@e(0H22P^wWiP8yAWqj!8>Za3+#2{WKY6`g*}`)8k;BIW8yh17fnV?{cBT)|8$A?(QxIU^5MEAUJZ1 zJ<89FXKVqkEJ-z=tz5lldG62R1F;9~MSzkWL`Ym7_7~n9r*Z&9@{He-Jb+G20(V&9e zZGi-0B%WO%uu9gz^qT)`m=%L2(d<0V*S%~K)XS z*?wy6`M-8JXC=iRhGp`sqo|9o#8GAQ`6`~|8=U<`;JnQQY96EM{h<^3!HAI^!&H_) z7Zk>p#xyamFSDy%<-C|4rt zW^m*lk)yD_r10mSqo0*cH_ZJ$I9PWbz9AFN8G&X`&<6QLCD!$$B<-+G$l6!Pjvz^0 z3IpC_`>%+~WcyiifrO{4(nXqPa@gGSoEe_AWpx}?6$!gM(hli;HCb|2f-*=~EoBRi zS9GtV3&N7wY1F@L%}N8^A0D{SEtWA^<`GC!*qRlc>sUAhaK%;@KYfA2#qdI*8D^^_%S^n^e`_!;9rfdF{V zof?N&0zQL;iIQQ;X9cTtm-pkaFnyA6Bo&s(51S!%L67({n5un%vUCSr`UaPaG;W-$ z9_6J5m5CEe8AxXnpK!J`j5JKNPMb#18()t=GOagY>m zvYk>2AW|znIq~f}y!&Xe&quVS1<<`lvj8Wv!Kc^{DeW_m@tn^ZrTnykw=nO9B#UIF zc7Tdy*F(UPZ!a{_nAeXVuU-`ZO$;MM-wn3ao~(jd8fQ*Wf|F5lo`)IDMg|_kqqg~o z1}|TgvV?*E`RZRu7Phw}lW`{p99E-5ima20X0xSPo>h-XxI^Q_A?21Om&x=^Zj$K} zdhe|}!}hbz)W9+-EOo|FL~Y6{Ja$;Oe7^v4&!c4X{fe|R@Bbp;jv+tFtyP3j;4BiS zdEz*0bNCy#Wi`v;oGyW|Kf z#goSB56DtK$B7fAoqm>j@YhCr@YfLU7o=Mi-77{|6cT^;@ZiN!Pq6XD3X+dy{fmGX zA;7(DP4@lp`BkAs#oSgL&wH2wZl-r9BrMSq^(8#aa=T;${imGzi|_!MOqfybXOu$FR^%Biimle`n38^e(=Cy56xa?G%5{)k@gf{_Q{WX6aB+}Yn zdQafYtB6#$YBnlBH?d5x1eJDfx=u)4_dDyBigfLx9P?f&`AGnITWJjFD;*jD32qJ6 zn^DPP1uFQgbu>qdFTDJKzX-2D+;iXix&{|udTCy`J{TAh5v12shPc?|9HcT8{X|9X zsyrH*&hcZ-!l#!=pIV}3YdoQy=oqQ@J2u$Q{VpdLJ(ZAZ`uoh$a-Mu4crRFbJD-aB z@y?40BaMuhi{&i(?VlM zdp&sVe={0ftibZ}gyrZqNx)CD7mNJ(fo9&w_>yp82PacYi#F*csrp%zD|lM!J`EER zK3l>w-t#278r92?#^oHqnN-NZ0aMX>D})^VJFe6XPY6aOXB{iOt0gu<-%CmT`&)nD z2=x_~-!O2q5j9|h`jE^o)m@)NDL@b-fCfaEs!BUl-m?Brxu1cC@Uf;~9fjMj5N{CQ zKh+XP;jK}h0!6`PQX%fWSYf}W{0)b2y{y9(&rdBL=`f75COH$&nH%g>n%YJvJ>f=y zZZ+#`$z)sg4LyFf(s5<}`BKpdD&<;yGxZAIrj8Uf*F)D+XFpZz&Q)T~k^u0t^5i6Uv?|#B~&j2h`+CAtP8sUeXc&lUTEy6+C`P9K#`6%#@QnE+}8m z#j{g_!^GpA2yPGo4vZ%VN51O&vc-#cWsDd5Xc`2r(N~T3hUl)0Z>F)|5V>tq8v;0< z6-kJQ(C`w!>giDYJ}s?qE(%hB3~;Cg7Z4xP=&<=1^Tw#R9g^aXRqVeN%|Sb`#3q5m zn(E*9Wp2j**uey7#>?r#X`Az3q-vV&Pz@Fu7cJInJ+av10o(hcE>;YkPW(INEwKe&sv0 z=06fJ9jpc|4+Tq>NqQV|WO8H{GlB?0NnYN_?t0z4Ij*)v2O>W_#m0Vn#?gp}3MQR( zbPr{1P9C;`KuaZsal-g!xlFQMG?;$D9!*H*R{Z_{`(Z^Wpps@q!jRs1B`KUVoIoqU z!ABcK9;+Z*GiCTIau<~kS?(fIonclzucQFLt;=jM|*G!D7 zMBF(>xNrL;$ytaSXOFlufpA|RCdpQq7;7)%z#c7`g2Qt127`nINd}1pG+}D3JEG}> z7k~`?qJE z67I9)LnRSz9Kqr6cvptQ;vpA{{4b%>+J$E~=!_9zm_vYCxO%wwx|LQ+etFuJQ!iHN z@TjzVJBJJt9n(m16Chau29M~Pk;lOu4#z-XMcc^%p;M!ZyyS4NlWmfjVC(>xaU4}i zaLQhRqz7o%XhF0QcylfchXO%H>9OhZZ*S%>Kg$E(MNY0SX)tEiea;XyKPUC1GSKJ2k|xarmazAqUq8O^CgB^6-I3f zz7D(O()wQ;@iXx=5H+s{bY)V|I3hpx4vGUx3udV~y}xuWIaV}&sf`>R_1Be1R{U|Q zh1ckKKC#9={MsW&Z=N1mktT{hUbIL#Dp;#EGGdtf89Fc*ClhqlXLne2R%j_oGRzg1 z=@)+uJ26m*CbZj2C!+IM4c8^c zBokNlj}4a-n{Nd$9jifR?UEQyVJwaBA{YZIX$T3#5qC-xW4~L9Rv}>;nil`kTc};^ zyr`PBoXn3&bx5k3e~6`kGSc8v|#UbvE0$nm!LJ@%{AN_XxkoS4+zc=l6Yo?kI-(iay@W z(*)mFfc2|7)-&`fR=0Vrss|b5l_!0@4P%VLiu>xpGJ#`5=bK-CavOzyFX#}ZFFZm$ z-%zmJu)ot674g}2_^~a6ib5;u?XgjZ%HL9;%7YS3GoM(?NZpSfbz z+lxR-S+0K6qtBkRCPr_vW*LI%=2qFBpHk$E`~;)W%IxR!)fX&T3G`YBfE-JTvP*m) z*k;Ga(&FE+!YUiSZ}YcKxj&kP@|6eRTUOMgR|6iEv(*Q)%aSm46^Xveogu@Tz)l#~ z%w*8kl;l~nm~^v%8P4IH%nDWAC8lC&4*7O*jbG8Cd}MV)V~vZG^d>}rYzOE`}(u?Mz(2E z!mrssa(WX4y~wZ8S!y%w=_D4<48=&v2u^l*bl6^bI$5+s>Y%&780U|5AE{zmnF(45 zAFWKjZf~#)hiBVaxvJdTh0xQ_-Z+CM!)?wz%jLE4&MHS{Jk%L2I}-wl9rPO+CZ)(Br%d<$wICiFHMeG`wRioxq6l?q*jayNH%ljNF z{#`lmW4`XVS^P0Lid>5-aEJPcg{^w~Ml?*%0K=yYJpArka@7ga-0o8zW89@a^B?X3 zZR*rH@me9|v&y6~Y_d@PC7lsDA=L_k;$JB0i}F$}%#-}Ju-H<+gRY_sC3Y{&lGSV- zynt^W3*zu#fD- zcYk&En-5~vwx4=37Vx1c^Q=|7$lGe>U#w0ovQ2-`tvRl`p*K;#ZtU5-xoN-INAy&}Siq=XV)C(Z z)0dvrdv@;I!RiDrjVJEAAcT9AeC8Zc1ErPkz8KJwmUZ)|5ZSs6smaFyPIpYjihHtN~Ou{Ve_f zjnwXlaN9oi$5yf}59TZ{sBD#>9rVFw84J?Y|6V?q_C0+}%e0Jm0NQ>(@b;-JOfDS3 zrr)`Myh~2tz-tCUo^j#(ph$% zI8uFsj|EAW>16I~$UWM#jz*^CQiyibDM5OFN~O$TMu4%cUccUsdAIIKMb2JbRhOyH zT7x`GpHbx<-8WgnG%&#mo-xDGD!|d+r1kEk?=Fpy3xqHS$_phxH*4MIh0|~t#_(iH z;mkAd+XiV&h~V6Wsq4%JDkH!6MG$pRY3*cG8$7;gLmt8y3Vp|HmEysB)|e;-M?2NWLn~fB?s}JkTTWD?|Y}IZzNOI zhzFVYIBCccKdEJELsdKkqF30VKQrE7#Kl zeHNV)TAQ72xP(AP?~7)&&blR1Ym*pAy!0JI4kDdl;hKio1frArWH-5_%&NC6Muh@q zxx%fvM1l3Eg@L)0Zk?FS1c9&#bBU#W;U8@BrRBq2&c7n7t|TV1I0kfWK9=YHKC6I; z$oj4Sj0(0dzCtf04)=Z=TJ5P!AL=>))FMQFGak0gQg=<+0_EI*xe>^)OK-MdA4K6T zv$EXofIQ4#R2dQps@vSK+pTHJhdauZ1HM#qH|8zet4{T35}`&nNZ6*}(ze+H>U?>R zJdPve*-Qq?%9J!r(8WKW#?UA)1nc~nd9eCMr?qT}RZt&VjK8ptrvh8y z=h*5B`yw(x>c^ z8;}FJtH)AKoST6S{JHWciJ{E+x`i4=~Thv zN2R2t(LO&u8kf0QNU?ANuI;jqt#uh(@iPWlP^Ks`8oyD~GiHK?IbvZ<#`q`Oq?Q!5 zQitPZN6$xe5u=l5y3#wC!xsH$PugAHrE9w?3?&&W3-7}MXcxzt%$&O@lg>Q=d$u-b z_4&>X$Kvws1gRVBL99}!6c_jE1S)%}?X0Z8P3$}vmn@f}L;AAXXv&N}=A$k>`vxDG zY85eabB#))NVuvpm_o_-2*4n(Duk@;kyXd$;j~`o`uPJYyWriQs+GiwIt;r)?qRY z+UQVMXCO#odEZsxFT(znOoBY6Us`D8DJ;egyR@LjccYUr!H+UOaJt20fRzpq{^m$H zf-f;0u4|6p_S+@d>hf&E}cm<0TFasr{-6x@}j-y}J1xUph07G<0A=?ao2jNYx z#NQr%5?2C3I~d6X$Y3_y4N=@s$or-PE-orViFA^NCYdtY*rC@*@+`Qb;lB+mO!CE3 zEioy-lzE~Qu9Xw~*o4A6E|~(AEK^=+#*kFLcJpl<+Gr03V%jOURP;R~!m1AD$jfcE z10s7qq;AB3w-Y`CDdoIcOlJhi=qk=M!%=u|g5ItTweweYVG5j;I47q6h7ioSw_=UH zOSfdF)nuSMh=V-K@i@Ulg;ZcTnuy004+e(8;W0M6z|1K(aIltbiLFgKYFE?&T-gPE;m59I>(5oF4y z2J&_HgD)HjbS>D-hmCK=WHNv@E;HMR$Vbu~h=Eu`6{p88Rz-lcy*;!#a4Z2AJ>~ zGX=tVte!Z4Bx^yrZDyWpQ(h}caBzkqo@GTNfJvJhDsvxEP~nk;31vrIecuo%$G=P) zt+W1={kpF@G!8QQ+bk3^Y7O*&!a*qz8>=6Ya-8W%(2r2<6Sb4 zEOSKqmShg-F2h77h35YdevD?}C>kcUhu6?H^w1gi+(vftt}_w?Mwm)pGet=3Ur8In z7Hmai)k8<1d5(hx$MRV0?_XtdW{{FDTWtYOrEMNiH8cOkh&w>^@Crk^=ALo@2e<{b zugdQ1{FwiTw~|gJx8RxEk4`Pkw5I-%lZcTMShW^ZMFd_Yj_9vH9EV4v|0B>o_-#9Z zUkOG7lfE^grF}q-3#>x2+S&Pwz>28Ei;~hY25qOc!Ge1Q4ELf3%yU%+WhHV#bC*B$on9D$MBt^I%3e9l0^x-GSZvC6^0X&&yOmM-n^ah5P(mM6*~ zk0a@x6ihoDj=O?Nz^x)hdqasFaf9>W)$`JWj#YLIkCn_r4eF(Z%fA@$$gRZ#8N}C< zg!UsB+ATXgZ%B4$m-c-de7IrM+Ft}d4d($3Am@)QyY2WpTx!2mULTIQHx7UJ{7Ann zJ#g9q$K|cLuf(17PbqS@t?|-2l4HU%S6tfAX(N!^@bWFMjS>DLq$go!V@dtu38~~; zR%&>3?%;di;%@xB|1T7N*tZ6Mhbtx$RC!srA<7k+i9E3}3PVBWyOEI>RS3KS zd4%l$MSzpZ7~;X-llKY{1sxd^9sc4zIGGIm?RSXyNCW_&jJBmm5;7hk9dBrIQ6sI6 z)xZo2JrAF>tgdHRN)wUZJFnuw+3nwQTGrt^#0>o2pDsw`^&?W7-JvD_!!Ls_1?QK! z6|>%-YRoW9?Np(#XAjG{JG>`FL7@80#$2y^qo0`0M0=^0!JEuajrl+OB4Zew*qG|L zDFTX&A~tW~T%@koHQ7hsi}yANqd#)Loi^*>!tG*6-#;^`P*klRWb9bXS+CnnuPJkP z5mdF%GR!{k-t_}<;SzXqmF;q_UdfDmA8AuyvgV}JSI<^|q3i#c%h;Q80v;H6jyv1r zGykkV+aVY}lipVt^JV75Pq`*sF2a*!ep+SjByB+b>FOC{6tGu<`8!l_Wox_{RZa92palB06Qw)YAZ@YzC| zrBC1;&ExVBXXzIXiEaNn+D!{zGX<%!HBAof@VaWJ$k%GU#iGJ&I1hP}E(jx{Eb-E@Xd&%IEV}@|_M} zcJ@k%qpxM87z$3=M(YDU3*!4%ss$Y!mqLFL>Z&#GDvSdNsrho*8*#G$zb!P*2MKcz zOq>VqA6AxBzOlM#AL0@}3_a@?Ppyz+$_-_+>+^GanHr+JO1VZ-gp*}D;P|X7*N0`H z!ilaK00(Q>Xf?!6+g+yh%Ki#2z>P?Mw&O z29iEQ;g1JazDzQA{o`n7<7oC>Ps`!vh<_1=Ue_ahXZMq${7o|F8TaIrTHnRad4bGL zxl*N1=2aS(dMNtym2vK_z=dzW2>j7A1s^T2WqAHT)BC*VaW3bhY!e~Bj+qxXmcW9H z(wEyP!5bwplO|zF!&#EI#PrHq=H5Ce<~S275dIPB7pKp9AN4fA_12Z#wrJlBCvF!K z3M0=7sPvkbC}2wnut^`Tl$^w$tR+>Ui+QL$*_-x&YV zxo3S~r4wHwS?J`e2>;;Qnb@t^(QW{yPNzI61Y$kTZQrG*UpbbHY_Ji$T2mll=3+o> z37K)q=@sdoTkEBGMt>#oZv~!&{@Qil%-uMe{!g+sdT_4cdi^hX;U)af;W@qdd!60S z$*({9RkVNb^1Dd=zlU50Mq$6GM*c-el9a(L@Fgo@AaxP}vJE-DbS*?K{PC&5u6g{W zBbkr|`H0RB_}b-&OISalYE0Qe$}Zn@sjZv4tI~5eJ!*febRJ^%WAnx#+iqo-dt_Pf z$2tm?{L{Q4Y}#{+4~!e(C@Q&M{dBr4w`z33=oo9(79Q1k)EyPf>k z0tVx)y*rnY9~4T%p%wqd$d)oq!gUeh zxI9@!Zef3Rfw~j_8Z+w9|F7)-*bC~;$S7b`x7VCLzI^l4WS&<106URTUMe8A_RY7f z2%&s9d;$E}nK_7mFX~-9iP>}KwNd!tMb1z;KzLVa??O?v-vL?>5 z)944lY=_H1`yv>-TuG{ic2|lk@Xq#-Jn@Jvu$vdTqyQEO3gX&%OKq2yY~-z%>wNfPd^WL# zICiA+p|fN}mC{`Nt8fRR;+0ZZi^3Yl45>4_HugSZbUd7cI!n&GzjVh<_$HrTLuY1O zu(RqsSh%YAwIIs%sI7QVLz$&0VpLkz*O(3eL?q9RwEl>D53SYmK|sl@7`_jBKYs-U zV(u^240?zbF0|`cp6t*OmLY1!oUpg|Il$etedJj+Y@?5R$3PM!RbpD+@>p8Yc^dh# zwyN%xJ^v2zo&%xM!tLjiBBu{uc7LuEWB(H0JytL2q_w!oi!r7Hk9FctjQ(1n>)E$Y zJXNY4B!YcYiv=ppPdEO^?^){KU|S0(cT z6>m9^IvzCySmsi|!_)z(C=OhkUJATH)m)gq_x&;dwJDs6Y&3cI{Qawjatk+h6K7&7 z#ZOo&e-R=+J#Cc+{zb3?wv4L|H(d;~zNt4u9znhdj z4QF+0N<*D`#=#CQ!bs&#+P8-wcHP+al_yKnlRph*1WJh5AmO)ujXKSUtWW;nD>Cy= z&?4|QU;oTw@YB|q4{_hOHH@wIr(oBJ$OEU(giSFWtEWDkqU2o}8T8G3~ zo}Wx9-7vn-UR)SZN^O8GoBu5TTS?$mb)FGuxlR;*OlzB>S{?`y_fBB^S90BL@Up>^ zlruA`z+fRHf(xSEdH9Z49k-XhG}TUIqQSWDgdI8OY%r#AjNcDrU)ZzdXpb9aHR}Zp z7#fS-wa>(^b7eHKivQX*8YLQ;rSiWP)oG6l6!qlDsk@74P>_Hu3x_az;1mqZS4z)v zqakvuMNU)UnjhhU4lnzsk=Q6fyvV!QS#`1N&KMkwQ#SE-IEY^(pTCU6UN z$2iy9)dO?EUgqy}*N=s=!z0vQH7eEai>cT@S8FF0ZV9bj3IRu@zuyYOhk(MGht@E@ z;X1R6OElz;%FaRl4^eLc)kgEafkM$jfg*w8P+BZNad(P4gy2>jiaQi2UMN}!65K5b zn&R&6TA;WVcWJ+y-#!0x?`$%AvL~}UGrQ;AnR(ymc|Hqp&6hJuW8)WY$Smo<=MdP_ zo8zBy%n$!b_S&Z>3jManFKuRTrU=F96zB(?P+=AW9!{_lf)SpFB?BG0OyaOf-+@<< z-ewu1&#Vk5k(jhKMKLvIcRjSa>a_M~Q>LSQ}U*;Mx5LQ%`N5?Hj8yMC>SEWp1ljXLT znUqf3&POfT8_-!MNw%+Z`V*4XkEEN_@=#&ev}khFClk|si~_fk$|<%fzl6NHsj}n? zp2@1;={Q=anr;b`#+T$tWBjBLL7z-fp)F6Rc6k9xCZpehBK_`Ln}OCLXMFrTg<|7{Hc8Id#VV_;fBeEV5aJA|s* zX3P5n6+gO;Mm}+%b!))(ihU-6{N% z?z2V-YTUldYT8U%{2mE+M|XsT#uKjuyPy61* zBUzOD$QEmPcKjGgK=3Z-tBw3PiO#kQ^N|95abQm@CrU0;EC>Ho+@8PE zw?mNok{{!%F0Oj1BL8T%Hga!qpX)VL;dxJKA!n|HjCU=TH5)f>0m0mEz#@9}$YG_r z9z3d>6O_X&QIbG);K?F!wu_JJ^s?ZMRX!IO)w9F{`)iZ&d=(f)0)w_je>9+*{3Mr} zJFQ+N0u^X6jg{M9_jXO{Uqxq_lV&V_W{Lgvj==g-VX3G!vR9=ge@m};G+1ju9L4Np zR>+UCq-4yV;d0rO)Hyya4#@&%Bud>=BKYM_`IQ3$3ng18Y)Fr>4*Qw=?17w!vZ=Hm zSU@BDh3xz9lwV>D4991H5Rcjpjc7LN4BB$iJpCcNG<+U{Q1VCkyFflZ+^vtlU$ZZ zL8HNfz5RtDH9ta(TI9W0=CE+AT`zCh&a}KD%~o_=;84lnK zMhcPDV)>g@*)Q1BV&8blr`x7=y<5D2ART3&Pj41X-KcJuuSN@;y>Yv5V2E0)xo2_h z;%N%ODM`1qw&PzOg(9ra zS|pshQPiHxyTexSR%KWOEk|V$z1_8L&5lJ@lb!cd{E{<9a`qnPr@??EA-GE$`uOYa za32Z#CLE)UA^U&;(9i15fR4TI9~+~%+-?53Erz8@4g0gNm$!PvM4j!bw=CKa065@Y z%?6;E*31k)Hxt>;qa}%2wwW96V1oVZIyyG z+?v`C^U?JcUV`&B*BMa~*AE@vg-^UM-UjcQXBxI<-$eW{+}u%~7+5H1CDeCTv}5CJ`q{g9yM)$`umzubCN(T_ML31|cbeFQ?iMFUi)K2&jr?5{qz8;x zKbW=9#&fsLWPO*oTv{XiHpK^Dssfq)W$>zPGuub^WgSlD{%GtHpD+NgvS|&SO5{l^ z&tV3j7c47H@l|Me z1Y8r+!`uC&{z4?Go}U~+&dCXfsCR#r7{;$@Q9*mKkEk?SyP7=@jXD9=gg16NRW9qw z0_e)qGhU@mf$Q3>yA|8!l_o)vzYz4rSSo(#cFj)AA~M zXDe8w^>2x__jK#EtOPhk;?9B8zsNUmye*8K80biC&xHc}?OqgTzkHJo3ch1eE~A1C zho_Wq?e!bJb+D5oOq`#}5K&EcwQEg_9R^gAnt@rUNb8!o2yMc!Ro*9gx=M@>iFB|J zEp6;Vt&`eBuc#ck;#s7~IFgZY8enW_!G@L?TbWUPo$Qn}i_Cbf>@Ws_v3Amt)=#kk zM5!m7TkvT#N9|NZrCwoQs`$&1!%W72@LZzcZOaGG^Y3P6Mpsb6@4&7e3Q6 z^o%}dEE>*hWZD9udx*s>fK_B8f$?~Enbuf_h(beym;|BrD)eRiyycXGrjdmkAz{JH ztTu|d0?{`6$kr}quWUVZExu_|Vdd@NL@w;n1G89 zB)lH!FjW1@BU16t2wCV#{lADd0_Ar53(06cMWupa`MtO@S5lWbn@Vqo0-4d8=d;{- zVg7;5kx1GrBszI zDEx6TMT)iv5r@Q>I%=Eqf6^7%yew~}o3AVeZ%6b>)DyLRTv3Z(dH#O4@R2C&5Yf*6XO ze$t=$8?7VtOQXt~%G{L}oY_is%NR78ehXA)&06EAv!m<^Ke4wWKaQ%pY%XO~bevuq zI6xa3>4Gx_sZusv$mOKbfa5u1MA`5-MTLJ{&{!j+LlQ^MuaKR1)^@+xt0fJqQhuXt zG+dVV4eZlutWKIoJ_RRkt$u3yTILF7O9=6Zho9-R#0-&8~lf+oC%sy@Dc;O@+4qlPd`*P<*+)|TTFm+!k=ryd%Nf-iz3SmC|dfgKA zu1g`UB6u_vbPWX+tYl~G(Q;}Ktw8raYktnsHK*&l9TF&CqpPV;s&97Knrd*j1@6IC z4e7%kmLl9K1)1?0IZ3lu*v=Zw*cp5n_9|ri3E##xDE)5GLuj<=W}Lvm_Bm}p$|H{` z+f&WtRwKBDGu|)q8^>>dOZbC|Z_hq5?IvZf9f4iJ-|nhFf%6rWpMpn7=t?jWjp~J9 zr3&jM0)klfDFIw!Dq@b6`9E4ox&D4?lAV}9I`RgAtN7L$re%j7E8$$fH8C$$65*z9 z8k{Sc3v>SpLmg%Sbbvi}3E`S!H9{)cq<9T&40xrEfQT&N&x&tzyJd;8Qw<#3-+9dW zVQ@o5a=CQ4mw6b?FpoL;v*JA4+!$>Y4`|mo+Q_a$Xz!RZ*)4ylbZ@4qDiM!h81eG& z2)K~Q2$ykJ{7k2_0W^665YH)u^WMfbsIIV2f3UCEIRWrJ$*Y{~3ZE%{dmvEPSD0y% z#r8%Jb5WjR0ZPp(xv<+Gdth#IMR?Q3tP)gMpOgPXv#%PFM0%CI_99zx!b?CkC2N70 zkP5F#96(zu9G+kPxKfNLV;vPhiqtvFT>KgO{vPjHu^C&1_>0O;DF1W@M?5~a5qV^R z9lo%+h~3th{x}fGZOR;wuAEyk8%+m0F2PYXCaV21Ma?|cZ|#kle9R(kwdQLB_lyrf9@&@{KlfZ<9*B6(FqqbIrVkmSFdG!-N}* zIS=Nc?{_R>9)XQ)w9OK~Qhqm6oXVPxh-m86tLVk=!wsJ1e@NC9MOGU8nuAAt1~;45 zRJ;o=)OBAdB9NxF6utlW$HT#LCQG}R1;>#!jc#YXru@8eT=A`|v2HICU@+-n;WsnS zvg~1LIYa!psGZ_tU$@>UD4wJF7pDUS7$CzqGY8z%>oJ>vF~ zPi$)$@PCAg#ChFA(|<&~_kdYUgr+zud!v+H2a^3`P`=RV=X75C%Mc?9UT}zU`u}B! z&+#V9)R~@Ud|XZg)-Fx98k{~6$B3!;MJDf|HBs$S?L+M z1k9Abqy4wE?4@!3t_F{o%urEv@!a`Ee$`a&&cG0VT%}O}mp1vMy5{F_8T~?uAwli+ z+=B@e$sUz#gExQ}k@Ss8W-Qy$<067|bp|o?vhQ`l+vWiq?rX=|7WOEh&K#0sl+{pn zgvZc0_D~2glSo%Gn@9)8FQXGvh@4Gqvo{qa*p|H?@Qugcrv6>=#VYXTL!4c3VNG&I z$lDqSDr>H*C)&{$1c!itnLsJ{XeKZOl`)~REGADF9WVW-?&a9g%+ZQb;(abpencRJ z2$Y;j3`{sNKNb>8L0ckp67iv4<3nd|cti5iiU ziQS${o=j0bMcxl9?WcNU!FG(b$G@3obLey=Uj8!B-YK4n9JKXQZ~HC$AtqXJyFPoFDKDdyic{FY5== z`#ZH@BcING7#aR6#j$(4-(sUhz1vC++S5lDGegnenjfUPWuBsKPV(FlV=xdP zw@`~yyvDkn?VylIkAlFdOze(9zG*)sK=POxV21x|_4jViA}OJzgoPsSZC0~8R@viv z5&ZG1^bUpiJ^%8xV4v#1WFe~_8d!j5nYkTQyXpBvE+vI8%=z}An@$@_ipV};^>Ceu z+$?4aY9VeqdD*C$P0=ABnH#$&ZfADC#=4o!yygQ@FNZSt{4-gJR zEAMf~15JSxhs3?N2(`yK7u%S{O!07-m--`lOwEpZv*zSk(U8L8~2cWk<$YL)Rr z^b8M}m6a}Pj^9{Q@Y=F<=PI>|9Rqcth^oqOcnpBo=xF8T-{dP!bg)=;D%i7C+A?-Y z;+O>pclGql-V$#W7QSth5zrPPJy(qT^7>_g0Ei7Q`Sn*dHCA`s5!MGRGHv<)ef$!M z6^HO*W4~Qs&aJ=A)=eBr9FfI!C&|_w3Gndn1&Ft}r|PDlQmnh;?%=gvSMx*(|CcvR zPu~(xqcO%S1{v=~pBdzKuwzI0Z?4`b{Z2OAu1~zM2CV)XjhGm+DhsTHMR}ImrQcbb zP*{0l%M1%)nGa2>XZmx7=y#Jh@o({+O4CMSTw0w^e|@ynH18%;LRC0D`vileNicvu zd($m=9#A@NHwR?A0jifyR~GU-2_p!{|T5d-X(|NK}YWFI}D8u+5l0? z*cqeNwEc#AiN^{X*+P{UL_g>`hn`<5e(1`3cR|P4Ck-|%l?;D*23C;%ePJ%w#6@xx zliLX7gX28wr~3l=xkL9F1dI$cLMJ3fhQ)5D!`lVlG`2lL5V{qm8>iY~-rHNya&mE* zklj(bMLP|_7lJ3I&OiHI~i+e=-g7rZV(c= zh!}sNz0nASRSPNka7F&JYFB*v29veHN%EWQ%9^-RU}<)9F6fFP(g*XUKlFwL6%z>M8DjE{IO%bSx>P@2ln|(i-Y| zO5|cU%1P@`66NDVl7H_B3#ijrO*v}@KplKq!rioL+g00*D9r`hwwr*Qg)*fl-A^Fx z<${%MmPo))BYzlrcra)}>oB>0zg;j7q%EMbKp-Lx8gQ-9Ph18I2^p8qYtl&_10YCt z2jER?MovDnLI5PsGsT)Z*6-Mvba`$^#h28t1%0uiddF_KccTLIwCcQt%Z}B(kcpj@ zu5hOW9x@>s;r*e)8UT`#p%{(7~DO+`tZfh#l$#?Q6G zyjrsZr}9_f#L@o9ic@gl$4=X`t-@GbWOM(%8+b5YyMf<#t~4{m02R(dHrk5y8vJd0 zMcM>5IAxVBv|~bN{J0qPkE&uL&fW<>;Svt6kX&TBXDvXvaI@Wg0|<}E)G!=$&~J=S zG+128k@?T)j4C@aE3b<}i=yFbx7d;guS&e;=0)#VB2Pq69FiGxIH|{9uZlyU-N#yT zloNNKt{PI`1$T#q!XGDYf%3o0SNy7Gg6v2#s06UYEl#vGnFrRMRd9DBrA`t`<2d6v(f`c^dV02?}*9A_z_k>v-~DDYWC@pY=D|+wJo@lZ@BJ3@&7N z!c=GSNOlp?hwyfFTc@^PcR9`FEA%&v&G&PJ|Dg$*YiY&>X;tkU0QW62Wl6QRB=rkB zvgVL}UkXJT&(U8brt%?k8@hkSf`#C``hQ%gM?&KtPj7+hzvml>sH!gMmHX~kSJuM5 zqr;6TO)*GUVLxLe$0z#=qj(O5n@;goHXln-)iz7H`9UJYDoqzoy3~C*^kP$0lClU} zwn-?`Ie*9VZApw|qL~{Z?VxlW#MQil?`9HxMRsaYVV8RkeUg2bjQ}qxh?23Bx zGAvfoKwZ5I5@{R26}-s0B8VyH17&l~d4;u(H_Enf#MkdZd=^q`w7ayz&5V<$lzv}+ zDr7Ug4!7_L?1NK701cYfuW7 zn~!i$kGJX&8d*T)XuPaNdT^6Uf^QhvU=m8YN@jlN<_f=4ZCRNw=s)nX7J%knKb&1? zI{658u=|@<-r#sd7XNAADz?IIMEkz`*Tlu6b_gejX{8GeWUBK}I9phTU8TyWKnssyc)sN?;R9tE?2S z&focBD|QF{d2D}w8XXD$y}8VRf<5Rr=f2LHZCq*ouwj007hX}W&Tx!Ax~7S1_CKmj2*i{)h8u8ifk;7*D7@SMo5Cl$Zywk@_571RMcNC=No==Piv`>mM zxz;c%1vg&F4PTiwB#3Z%#J8M4Dy=mF?LIdTa5}GiX23z+s4EWpG*Cp>;ecB9H+5y*`5Ay7^=kLwj?9DTsRnn9|;{F#coNj^uW<6 ztejak$9ffp*vB*Tw0FzLvwWoyo#s&D-$M2wr(ldA&^Ya%8b1Q0KH8js=_xPq#mvFz zO-F?L>u-v2w8IIjARQl-`q5?fQ6U?Hy+2iCt&o_bA>S&g6V}WXS&737EOEz~@sY(< zxShwNv{(oJ;jerB8KNFZ^lAw&?PX(x;yQSs5kwyF1TtX~S`1;Hx7)avGJbyvzqz&u zUyRLL6Tkj9gih)ME(pwtWx7s#a`itzkZs_TR|(`@hCdxgN=&WXpcclh{?2!E)SLSb z{3`7PKGtLPtYQHco)28xTX94JOExM0Qe&n6_=nYHBGkh&(V#i}9~#LHytbxNa zeCb>!*wE{-abf=hyy~eOL~~?{c%zeJI8A6x?$ZtY4i#C}R5m#4kd~A4=OqY`MZWQE z6%8sxMYT2LhOl_)8%%rQ&4Kjw{Mu&P2K=h?!Ag&u;}r&5tFUAry)>>Nu>BJ|?j37p zv%=bNC_m$Qr$#WoMA=+N)}11xC?;Oaq_~dH$`xY&Q@N7W<-Y3Gj8pEkreg@UOnvU| zXQb*uKf(GVP^!i7;y#o4mHlyB6Gk{J8s$C-xz{If6Zk$|x9lJMFJP12%cpuyepn#{ zZzIaEx^>$*#p8#R;S|Noz&z*at4#g+PQYoUg9J5gVv5iC6io7<>El6zR0{Qxesdr} z`pnOj4~aUP2`F8^&MbxH|IlJod(u{(AK&!0G&gbKI(v<>{GDx*9N#`N`CzI&KoqIl zBeCJ>T29y1X~;onxO z+RM8sy|F+AeoOE5s{i9v2xE)7=SCzuFu|=fWasYe+dpTo3wz+fudPlYlu;#0`G*Re z44ZWHc;0w05^iR^sRcuWE2&D)Q`)`*;ynON={F<4Ak2a!uzdSo5oGv>J z-%J7Rnma81O=(~J83ddnm>K;_Fek zq>x^RU~nng?|y%`$U5@|%6l}mAKL#os#7iipXvv13;@_&iRtkj3m5dqBK z^mXd^K^AU85J~kJBO>-S{lXqDg+i_IFj-!V6wHfl7%UpJnC}ltMpA=T^ z^oQ8zJ)y)k{% zQ56pM;LSGQ{j`xW&Jm+k2w>L{DP_*)d9E$}{;yM9UW^Q>Ape(WnR7EIzwcGKe_R=8 z3#c|jb$Z_fOW&=r7=W`jtZDM~<6ML81mOa16V({+@sEBj#m68pvrCHoDlKFNnej%+ zSVSyGtG*woJPK8hFJFd8tOGT>_S59nJB8CPI3y%QrxNyJNijQh`>S5%2pC z0&Tj(bd=w_5D5+iAH_1g@}5cuPA%H?qnb>AWg1##%Fk8U{!1XK`zEL&)4PZyB!Oj*X(A_P= zsob{#buiDNRbZ>hnwVI9OlKa;p2C-HrbK96r6{l$jo+<=&gmY?Wo(sZ>=ji^A8kFd zRI3NO{7!Yar!T0yTHD@rxF_GF_Q+>H0dkokM@-#)j7*Qrm39JnNm}0TdU<{k?8Lfe zwBNo`d6e0JlFC|WBL(ysC+hol_eFwmA0!jQp64AT!Fi$1rpzC)j;!=jYjTG3b#4VJ zSg%dC>Lex<@%JT>)4$GtFW?`%m>%3iiG=r#Txo_~5rsX{wg)MS5&kbYP_PruX*K@` zp`o$aod_ag6n+&o$?$;`N){HgSSgz{u8GKrJW0-5H3Uy04R($_^^$WufZ`a>vwvhK z)^=5G>38!S8~7>(T#`Op>9u$+qh>WIKC?_s%qLVdxX6(3i9h=!-R>*73f-#jkKI8p zreLQ8&9Z!pB9--@_zvgVcK4AE;$S2EhSp;+7$f7!@A*vU(e|EWR`tF^yJ$mvrrtox z-QLVK`D$%dcy;$(d-37Fa|GxlsXTN=FPCfxd&d&b;EpY7t5gEQ^u#u~3P3TEo@uuR ze7h_E0Oq7J=sPQss~@9$&VGq+%FrdC4%_$XGga$ zs!ig06NrSYpqk^|pG;5_*Oiwa~(Z=(+^lg&;WVCe=O#V7DOOo^AQr^$= zB{|wvRxQwZ*R0#1*k2;Yc>a?s8hK|lD55RD8`6XsmAXb4kWAt$Y?`Q!^o?j30m$Hw z-quvd_o1nFdZ5aq-Zjh+PV{f%Dr>8g_wPC8Zc^<$r2NYx{%>J{uYI}Le6}x;BWPrt;!io_ zUkI60T_*W?v&80`C*_OVl;w7jtl5=pV%&=+_XADBB3#jU58%c=1)gUsmhi2L|DRM| zZK$9I}RY3EKADk6g9C-c~54x&} z&1ziFq0$UggZ(YA!mc5)_kWW^U1fq?UY{4mZHL*Th0vo|R+zpb6LwUQ?5tJ`$u#20 ztmiBIj{juzyezJ$&o7p>FqZX#E_u*mq_Q$R$-`-uF5`xJ&Q)9D;|=L_v)a(Qdv}o$ zvSCzpCQp4?uNbJ(5b1z71xGiMZHRQln*&r-&H##ms(KZbbMualNC6`#Tpe5r)b*>Z z+CAK6>jyXD(mGLyq2-a^2xOMBtnJeZN6H#3nH;w$5NZ%QMH*=;3;po@{653tU_}AF2mdQ@D|*rXOv~*32N4qnF4@bX(XJ;%;T^uS((9 z_pNl5U)?l`8LZ2DV*3xRE?bDDE;^vpWEk-$6%WUw5=d1g));B$QQz5YSPb?jBDrd~DEIn_~-0YO_i zT4A_kGa0&gSp21_s5{UTYKGtY&7XmRRM8$7eu8;_7x^x5E^a+{{OIslUkIVb7S8IC z1RqP$mDf(G(M~@d;R{-p)zIF~1ShczA7{84Vi--=7Jlb3p&S{a`XCvet&edh;HDV1 zv44gi{(A+lCs3vPNu^IrWoY^ql9@H9W*-cw9P_J(9qeoOIF#I%bNofx)%(l|x~xQv z|1zPs@QkT=R{>kFQ?PR4fIZxd$fk*L87_9D_dH->{ ztr{?Dg-}+Q0CFx?DBsJQ8XT%+RMA4JMNDXA3%;L`5!3&KO>YrR=)DNL6aaLUMx#@* zA%p%M0mXeyjv$sLFDGEJ1HM(%PmuV(BfTFyYL!=E9#tH%V>fngT549 z_x#IS1Qo3|7iCuE>n5WGAKBlZHYHy_{Y+c~pAt*ij0<0bkip2cEHuY=^l4t)_Y?_}Iqu>TI35OsIDQD7OcJtk#EI?b10=;e4Be^rOMy}o-4t231R1LRCU?Ws2u zLpS7D`wCky>(WLYWc%d2w6v}cD^(-SikAlLqu8!9m<;lr2XaI;NvSsRP5!x+4{I9L zE~Cn0p{!_HlVtCmrJHl~X;1A6n@^o?HjhYUc(|iOV9BEV9&sN9hQV$!e82rqRgCbi z35F%AuD24St0$?bI=jr=N#QOtnqZ2SdTcmgkID_g-PBR4+z=L|n++`F)cgbtM2+rO zTUTJuOymEd(S|hq`e&tA9hu=Xc#I$E_o)+1ziGnR16d?9?`Z-rFJc6Jk9>DrH}3|s zaH>gp8jbwi`Hb@)8r3Ep5tC`m_8p`(Z0(4srxOT*hx%5A` zibjU1WKUdl)j|!VC*#X>zyHseD1tJX+?niuJ0{sTfdTC+Y={%Go`8|)cG-Cv<5}4D z2@piw?3%ZxjD>o2`rLDj0P#dG`BzdD7y z(PAb}0`e{h;((g`F8N|Pr!*Uvo`RR3RA!|dG^LzXSw5GME+7im`I041`|VkDYqk4M zD}iK+CjiUU8|&1d{K5<_P!NQ=G~vm}NTlq&f@v&H@5m_A8pR=%URdm_-AciBGt#QY&(j0jIS(v2En$>c(>EBqP<0yMc8Cqf~deaLzeT%2+Y~{?k#WPU9sy=NEkiN`&9t6V_ zBnjm}%!|9od)th9kL?C}V7;gemEq3!WzcYNb8F- zwS_Cp)ho`}U3OJ;WjQ5ml=jg0LIlpbd#N_%v8Iuj0QYOhoTr!Db)fMI5mvp5cqSF3 zY`{E%YX%v*0M`($EDxAp+vI7TBL>*m?qa-fcv*ZT(^a@OFUyV4g}<3!DXU>Y0zmfJ z+!~Z#g)cp041s3s>~Be%Le)G%2P>pE3RxM#+%z2nLISebgS0`bZFq1&vc`O8g6FL~n<{8jbQuUIHumjYd{ZhrL~{^b{`UR=35OI*nVMt~IP zb?DO0j;x@qX~x&}j~1k`)BR90^=8p@Ms=Dj-B0wpNDp(LxlezvJZt8RmtX$+sw+`u zN`_c3oy-|oH1RO|NO#>+C{tj%nvp>&>l#q`UgAi%St|nDjCroA=Np-DY(Gh5W!1pk z3Pbd34Gq@mn{u6>5!Qun5=w=&E#Z~9FNEVqZrH0a&DAUQTOE6=WAUbwTcH(-foDzE1XmBqfDUC1VdX6F{4>X2Pu=7J(A$WY?2i_By* zP*Bie&i}iGV!oD(DQD{YHFp`^g(T#LhOs^nYFwIB^v%r)hgqm;7s!7csPsqYXMS!# zjsKo0FYzRmw`deMh=%IEd@VXJ+p&8}kpSmSY4?|HwrxKW?bAm(&Z2g$n+lNq;PAgp z9TduDz6XrkkBVQoAZ6F|nmva`A@YPFj}#~{H5bZB{Q?~W0|OHS{r?gg@&AC-uPxm} zlM8CQr_UKSFSsqFwcNfY{U1geT?$25`7fciBr4zH)4y-K@@PO_0r?xxa&VcY+7eTBdRHSJ^ch*2H(> znPxjv>YT0%iz%|l7**FM;lwju9%uXxHSwO*qKF*`l2a$t08@xNNorRjGb zc@#`#F~yE@h`Gg@a~pyV=F@wAzm>oYPEVDp?>j}Y85^aZ#gN*cq5p(LmpV;qWG{Y^ zY2gz4_};=kWJ8H0pQ`TuCw-t~19NZuiNjyP!{;L0S`6~^_X)TfRQbwJr=M~|b-KyC znu3Z}em1b_9&D|W%kY?l6mKljnBk_M#*RmcbB!cTpN@eHwzel?4^w;5Mau+8X`L0 zaY+x{Y#Cn_$|Y>#KckoKgtQG{lIBB0U7M269ZfuM?z!tzbdGw&F^IgVC}5it*3N?l zi$9$LYd_mmObvAsKLr{aq&)GbEObC4yw6bF&kN zQ}dkk854ExMFk>G&Ht}}42+)OKQv4#`SbLJ{fD!EWG~>DNNilw)H=#C)W6L_7SmH1 zUF_HznlgYoH*;1z0vpsuvpo4N6K}c-4!m*kUJgHe!HvlZY~F^K9vsp_#hho0~+Slt_d!9<_C5(`k#C^3OPfMCagJU9g$1Xfx(Iu57eYXNO>Lpce`tur|6QGU7W+D5*voSF zA38P1YYwMT$T4B7I@VcL`5ac$D~Q7%+!uX~p~G2nzNi5^ieC)DM;Bkv(^qbPbjNZe z<^M>u{$iwORP`o(7;e8$VBGHY1u2>>06!*fVhlJ8;tdKo>e5W^L~u*}Da_+aSWr2| zSW#mg0DomKxl0%5mLSp$1|^)~8DDV>Z{IrGr57?WAtx7uukL=gdBurn9%LR~rKTx1 z1YWZTk2Pkx@_ysMI{AAK0ZMFc;!FPBtOS^j7*0wXO7^xovyLYwJhF#Yzh{PtTfaFZl2jP1=O+ zHGSJ(oHGuy)vyPr_=^mYXfy4ZKTeH`@=jP^6K&qmfWoqYnU81dRKe3MOExIj;A`$S zIV+Ecf;}`V5*Oq-#_y75%B7qqV-Z`YkE%=@M=Kup5m(-3l}D|e&&=*^E%>T`4o1E$ zkOYnXrga1eNY7@MiR-8EXs!a^B3kRIuuii<#VqT|E%)M)w&;3yj`ZEz=$z(G*% zY?W}*d}r!tuTt++0U5vWdk(W_vvASA*`|#$1VgTOab2tRu!_zcJKX9&wC_y|E)j>Y zkvHX6(fxCO>CdF}pL!<&H&@d#)&8H=cuxz?KUupu&ANm3adF@J7Y8Ta#eZpkUNnwebQVEoi^6{(j%0fVpNXwi^GZ^aex+TE3KqCZdjtwHkg|CXIf*?$isGaDDe4`x7*1Xm)v zH8R?Lg1;-Za({|a`?I{@zqZP8MMRaE>VIcgKSUIq5d3I^ZzLXKASY)oxjiK)KDin^ zdqdw)loQ8_7j4s?Y>ls|r}jL6M)Jr-Vmk%oLJSnK96wD?|2r4Xl(qPya8>jrPZM{&x_}|?gMBQIj+!uqRzPYmJS=T)t@V>tfCHB9hW3xwoi_h zD_wt8{f9Q_p%p`gHT@P=3(?cQF>C#D0&gMl`MtH1P{QSCD)T)sw#)~}1XHLp)i zZd)6Mt6blcF7F#J)I763aiuM5~cZVH%(pLfqnEWeRXTN;#M0= z>E8!v;na%}vn(I05FM@?A9f@5ttMJZu|(C5UpZ)*bfV)yS?kG9iaI6a$)`~=SsApL zWHU#eGlej1r4K~dq#(M0B@0vNc05z<5m1A0a>pIJd~|f;rxfvn219b{&Q!=>6d&qE zPbEIXt{q;djcwqLp^%>jKE`Jbk}_gFP7NLr2HVl9O>Zl+F}4y7oZj?b`R;B|Eu+H` zfZ)2%(8zmI`$clbjL8Nw2hC7{>f$9ws-G57B>_A__KjBDX!hY}R0+aou!W zCyLal2THAYj(40|!Lfx61DGTUy*0#f*=bL1AapeJ02Sd7nmQ8yoUEE0%YJ+=CbT`P1Vy zG6crwos|N(OH@xxRdF9@Qw{J7BB#Ck_`I{!x--GQ5s=WL-o&X@jr$z`Sh)JdAM1Pn3w*r*9NNnf^w^@k~HaaC4c(0 z=?nR2YRp`YFTcA&T_RAtp&$qol})Cu82uCwcj^`cCfkZ%sKHPquqU5h6_slsjH_03 zyH=02IiD7)H5$l7YomU}`71ZBHhO6n*6&^N@qn^&f{MI#Bdz4b22-be3ar4<>V&Tr zU-NpA8C#$b%s$ulKJ`_HdKCG|m~wQzj2?zbLpr4czhzOVKm4su$vB2(8UC92MTPmK zw*!TH?Tm#UnapbbSVJfaL#AcegT)^Ke($dzY`VB(b2(r2c6>j{Li=Jktz0f6a)M#X zkj0@>dbQHX=4=zWsTox*9bs5wlZ)kT8utDhJ~!YeWuqVFi!DqCB$sLOhDFJDfPu$` zp`{Inp0msOzvHhAW*X%v2FB~|tvTYkw|lTQBlfVUQ_W@(7a<@~fiV|ojwJVv{GgWN zef)Ur`!cYWUqYRec@4EIK9?iYg?xLZz6X3ZQp6J+@ouAb4l-~yjKRI9qe(PCm-Re7zhAwr6mwk4nh6`_fN1Z$4MOw6 z_;F})dtg-l>gpp63Eb`bb8XsN_u&rsD_2}p_C3vrkJHw;$&8WJm z#AOfybGgu6d;LROF2`FaSGQsmF6E>;gPI8dEp?IUi0^e{8oMf!*LxSJT?Uo~PD+{A zgpF2AN5mgkPq&AY@(RuxR}ETQAG+v$lIADUQh_)4zj|U4jq$hdvM<}!KEFbm8oDipOl*zBEOdsV zf-|7ewJs5J%DgV^;7w@DYuW*dVs%iDQ7*q zsT?EwHAGBxeW&-;R|kR*#Q24ZyZZ8AGZB3 znXD~|2b^p^8@-v$Hws1Pte0z9CAnsLO;Ya`^A+tH1-!$K|LB9`wGE>qoTbJ%n*6lu zbMx_MA7Y!-{IJ+Co&B=RK?`6}RNjWIXDp3|h9URO;2WBjefB%N7Uq6Of^tVn*($Mx z-DW}&g`-$xJ)w8PzRJQMaZ&|e79Z*vyhV9S=&Y3OTteOdWYxOyEE7*MhOe7|zyCi(eFab)U9dI5-QC^Y3GVLh?iSqL9fCuG zySqCJ1a@%=u7TjLi{$5f?^XR3u?mmZ|pm#po`>V26Z60ElH1lrA zJ`FY~x@T&Aw>ljBH+4aOojH1TMg%rZt2ihb|V`X8C|#yJ0TrdPG;NBu-S7H0Vuod`Vzmiadun;2c$NdzcAkslMq zpX!dQKZoi{|Buj2rf03s6L>??+3FQC@zdtbPRH^F;I_5mmsgB*&CR560F@u3Z&MU} zd_rlN%NjlZYcQkk_5W&9$b75OYWy(x2NA*cB0Ao!0&b}nIJKVqtu_roSftRBvUoeC zTZW4o@L&Y?UhWDzXw&Y9-l*dUP^8bnJK#m*-Pt>T{o*<2f!L+-y?^eS@Cm}#5&j|&Z*Ku&)ye0pFxhUkI?bmSboFUI_5P>s z)64Du>;C`I&InztQSzS=Ue;a>35Rg3G{yVDZj95UCO2TG?wqFN@axlSMU`KTivY=* z$JxFot87paNw2FXUuYNX(y<4|={X;W@_>i@F^ZuF9K)W1wu|L!g*RgCG}StVH~|u? z!m7#dkZemZG)1m}ef>;%>-Bek+M{q>IR2kC)G}HPpW6Sk>p%1UK_qz^=-yVFj+bMW z6vZ%o7Ud-lyDzsCoW@}EJR^9*36!;tojl6RH4d`vQ#O4h6%wUz_8Aubx;I)DpQbMKG|?z3 zWK11b`@%e4sP&}{L=GUT)gPDo5l(CL?V=xXY5ApaprWTEMZcOhS)+fy;cU9JL?rLKFQ@rbx>tRj>#x z3@Oxu#CvRJmk6B&b>p7;F*W@6o~6b;xrl=UeDIFZE zbCtr*3ez2nf_m;D4E6+66>wPhRL|s0-HhgJoPbFB#EmQ~@81jJ9im(Bshc0{wR_hY zryXzTw+ILIAooAgEl*CdxURepA=|9b7x_&cR@lu9t4&&xxqi?l{K}H5XA4v+BB}nt z9bLV?*HJGxToLM=qMs*|Eiu1r-%rU01(@bKhAEeL;<^hM??4G0MV4CO zQrN=yxaB=~eqztb6m;B)1;Kp=?Lvca>5CtxiuslI0glyqCKO1NhADFq^L(`_IaVwlCN^r?-iD;SY*XNqkRL)LNy&g=ub=WOHXl zes=R(eU5Nv(#WYmzt8`{z>e3yXS46i`lQRw=#s{_~J zM(FJNr%j~}vOReq6bGZMUk;g08>}e9VXm;!rnr_{A`xkqb>2Hhoqscmov)Nh<ze`@z!4%2k3sAd48%}roO=alA#`ZTjKX)V40*= zxSE&>dAR>;E|cPs)3D5r)opCS!P!zq@>uCWn@t(g2RMZ_)->^jwuaD@O}3lRc|~wK z)*|Zcf;LC)p!s~b7400(CZxv-_1HjEjm!)7wmBOOjgd6Y;|h|lVD?ck6Y9BM)6;UEh}AOv5yNtU*$QoEtb>%KKD2HVCcf%Yb)YbP8+M_FeK()j zgAZ{Z6K#Ob&Q;xt0NM}H>;SfE0zaYntD;~HAKc(H_$6$jkA#!DbH;(Z znQgX?rf-95b*RgO46iktKNGL2655`E=3lM2(2O!;y3yJ=E*VB_|F~WFsK7SRezuCZ z?4yWlog(m}*L^L1#VoxeDr}cZ-j~}WDO@P&9GTfF&}v9o|Ili=8r;$n`ifRPNyv)q zx^tZ&GP?ifb3tDrcrf;Xe`k6&h^25HY?>3^+qP2poxW~RdBMO>)Hb%|DtRY1&Bt$N zfv_{hb&46=p9CL_WB){hy_Z~hM1AmUDR-X0_Q+o}w{-OZ9b=W}-J0uEiALVOfr1tH zB|E|6eTe=^RG006;+OK1v?)TBQr1%h*>Qc8b4MFZ(+)Di9mcan_HM%$RfP~P|4x_q zuSuGJL>9$QgDILZUTvtY8p!Zavkdwrfa`g9+h23E8u+}s$HR|hj8kD=DjY6)Iba)y zncktreh$U|wRh(=Bg1HQu!6{=95Ie=G5*12h|)H+>1O}gm6;cvjlu=%9>o`p(Gu?) zOL`kgl5hZ}0KKy0 z1WX}`&hSWbxL#uZUKhRNb?qB4#9nU!n{b>KQ!_ka`(4lKnPf(eE@bo!SM9PuDES5m z8x%51gbNBz$w@F-G!VR%8U~&|dq*HGyWOD5I2S%4W2gRpP5oBK`}Yn$iV&YbQ@Qym zlX4nX{3*UcRe#^sb5Mpig^^@kG)H}a<4Ta#f4kXG(z(TD?qh%=@0)iBXGZIWDmX*S z=_G_5kdnr5{Q;1Of#G?Mc$>0ag;w9qOVRTWuFz_d^{_Cm>f{M3ZTzLVU|D&g(HBWL zuqc1(xUN3wM@={^WXdr{1^beReKv2762#6bUk)Hg8HSa3i(Ki$gaGwbRnB8pl(&zw z-q~Pb{4t+;Bg}C_gP7W~{574E(b7-1i)_TUm^|s1Wc|CYM@+ws`HQv^^^ySj#{sHk zLWQiIBOKKY!7(1|>u7k^EHx0tG@J^D%)D>BhiB>D$-V0F0jT>IX%= zcCP0>vD1?n+7CLaxQjLJ-^{%3KAHEj5u@ARzMcyVJ($M1ppKq;hc2X?lN^G0&7Zao z2K#8Yisym;1H$E&?(7_8$pa~Sah(LO=_=b1;3E+tv!M@sSn*0S4nNl#lI{%5yunUn zp5&F+?`;gn`OlWzq!GX4GDd%q`NhRG{7xpf^qCfxBQakUY02|O5^05fxl~2A8{oNs z-01KOGE+EsD8(hUX<1gDD6`{7njki3GhJb)1*eE>#C^DQd+?zr`aFX`>+f+k6s@lYCZP;3ZxbbgMfJs!7^BRMU z=EU3B+f1l|XY$z%XD?ONt&EL&%tPI_Ao9Q*pnQy1^T!0V>tQ`c@dK@MOfl{7k$0GQ9{m#LMB+Tp*Nx z$m&$ppHA|_|t9KD|#x1=U{w`&D=pIUG(1Qc`D~y#tFBt}w0&zo+JY{e*c#qtN zwy`%3<>hIov+4=vWj4|FJV%8d3Xxl@XAmQR>Ij^@Q;Wm3JD}M$!1;KTa;QAyz`(zed|r0Mh9mNKI>EEwB+Mkse31nxl%;%(i`iT{udLZ|Szh@QXeXPx-xj3_(4atDzX~67*Wz~z~HmRivO@JFZ3kPvU zg<}g8&d-a|Hwao6Mk2Tz-mFw`_})AxD>~tFhHF@fY17mNV!{DW+}BxmCLkHvkc~f& zbpK&#NW^#MtxEjMBxjNE& zRxjL@f%gRj4R!-6=_f^>GzE~W5-VLO3S)^BjAN6#QTi=jc=Pz=*kpjA!)qw z4$!1eDh_s-7UgT0mw>G0jac2xfUB@09sO*4D%PJt+)3XC(%>~5P;LFVX9cFlKc8A; z3vTZC^>s@0c+y#z+S~PwgE4EX;S@6$F*6#hJqXvqG1^6j&5YYD;{^VQ*-`f^^i!?$ zu)AitZ8k(x9^95}Y;E6`C}s&Q0moQ~JdP|2@yYKD>!uQ`&76mw!nE+H7g+WgL46EY z%*?0Xe*nleZbV(%N;cU|RY%OQYV|G>6=(x{j@kI$wTh1G8iF-Rg&?twWBP76^A*j? zPYt=4C8HFl3}<8vnueK4Tl$gHWEO{h95jbl8ycx#rdG?^MMu;6H`lD_#%V&2<~wJv zu|-necSp)BO4W7Bcj{?53-56sJ)leX9U1&ZR@c#5a^|=oZq^ir%$a$r05%6HMpCX4 ztOzeUTMzk)hJv~-RDTYID$dTe<;w5}Pj16)%r-=h$D2Xjsc-!ZOit~+mB(|c%!y|e zFp$(6CIu;h9dJ=~9&rCmra65jWayq`!_zj^DLqvbjy`ym^qkr8!V+uB8vQclyF#Qu zH1U1hm*7bug5G2(8#&E~tA)ik!f7I$wIl0@GO?8yq|?fWTvPG0Bsz^%CtIziF3hGC zudW;B0xR~ez`dW5KlB3k(8$$K<|X@YafY(SJf4=WWwLdIoJ^i4ZgQEVe`YSI^}K)! zS<1LQT74!G<%pu6!X@WYQc%I-{FaVIe0E(!gj*VWBPU=Xe9^-w=vQ-XhxD^LW8}^@ zW{^t6UZp-!tY4k4QO3sF03F$=N^-?GJF_c_mDKOal6AgYs8+2ErcgAZ4EX2VXJ(_k zEOpxe+NhupvRIr)c>KNj*lR%D9CAm^K4{X0llcd5!HPLifW z;66i)7qgSuXPbJEKo;~!g0`+Ra`zHu{zmZGs%7Qs6Hqw>TvC~hR>-?8)t*Mahx;kK@Aq?m@hjkKwrjaoH;=hf@?lD6P7-aw5vS=Kt-krFH zr$oHuJC*8$l)fL1P%?Yhca22Lq$=AQeq_lF>Kk|z#V|aAQ?<$=gLd5lt=6tRBo%n6 z)^L{T+UwSOF~5xlul66+^7#{FPpLuQzbHb~7^mN8ijXn60=meS)e>1=JDy5nJMq@~ zdCY$V)xRh?@TPFFX+S$d+^O49Zy<(Vx~bn{=ja|Psj?<{I#h6M5=pUr6V8_1 zf~m&kH>zq!*y282L$K?YVrN=Ac3pPVN)<%SFe4TArOaQ61`zbi{Mb;Ld9B{(j?@a~ zsWvXNhS1 zFnq2LVPw@{0|t1rXgUHz1GpOJ5h*bQ4?EIBwf)%+hmiScsiSDwCev$C zt>rk1$->Yl%b8TPAzS9g$OXrrEo1#o6@>aTPK7SeqE)vn5#MC4fG*PIv)aLEMDxoU zPnlq^Vh-z_KCTaCUXB2zOS{Yy!d5YpOB3qHZFB9Y>7RM-vb+3skp#S{g~QDY(sd;h zVmQz_`uE26X~6-!e)yBp)DSX|^f~&=G#-;ndx#aHbn_6lWe$9y1IuG~kYF4sqY`1z zO`$Y+0{WsFt@>VS_+r^Fr)0Sv=^^7zW%Sr`z#`C)i!62V^e=HlkLi4#MVH_!Kv_2j z%oFPs^W;OTUPG}b?_sW-IuO~bqYBAZc8)3RH9O~l0%rxD`(T$jQtAUSlQ*D07hqoW z;9d#&dtNcx<=YFBTWA96PFSLOZJ~0e z*1el}-6n&8p_q>S;7Fdu_L4`04lzK+4g{tMG5Wsk7=Tw@y*6U`OnHx6ZChT~L)m(rDON4gGV9%>{CYdEOfCTPJ&ExH z6Y(kR`fH&{T|`Z<(^GI<@8h7!Ynou+QNdJkmnh;#JGaXZ#|nEs)!*KQ2=`$MhrG@r z!N^M~_v_}7EG@Nw>hyWl0fm^~a7G~ndDstP0#XAWD5?Q@2yTHxsN@$YE+v>{KWzl3 zYxalf>uIT?zduXVN|4fc$4KO46kyb1#G^0zqHL#;RL#&DYK8I$ZF;256^v81?`iNi|AVk`;PW#RL0@R38@Bmmw&>4O>J>^EW;=qrPu${$@ea6; zF}3Qw@KfXP`8}E&;1WlF`Bi9iwxj7T=2#~6n^}MngXh6tUXeqwEN=rtiJ_o_6rYfq z?8ru-FUt;l-Iq2nf*u`r)V(aghwbAdH0bbk=iJsnL_yds)37i6%}BxeF%K-L%nmlS zAWEvvFAptOo@@8KLX4r!r%o4#BB3UJE zT!BP$f_??Ly%hKJGwEEl>s8s52jz8TRxf6lc+ZF@0)#`MY8DrMc+j#P=^B4Zbug82o!hoh9z5tFC z+$^C}ON@6*s^DfA-8SJeb`zNKJ2L^_K2^C}Hk5aCM2?MZ3eu^AJJ1j1mRJ4?;jnkr zI+>qivo+4G<>QM|{5^C#d=gD#$`j4sQ6t4waaTP8CP=mv*`a1xZ-mvM&CX|Z1I0<9 zJAN!H`flV(xyUuI&W#0GzU&%|Tr*W<^Nhboaadm6H~C-p&n2TqA#7w0UGPbRzFNcSe3EA-axZLCSy2K;3yq&Vb)qcBs!i-&IMYGWi7fC5~ z5+=8v+Y7ob@8seIGA*8VpWrt~Y)B8piG^qeo;;-e&Ac8Brt*bYH%a15{i(3iH}af- z8@wuv-9_>acUGabEf!Q*R&*=(^g1_mPIOAaf3tiIuWbi@2vBC1e&K9CG3k*oq#1H= z;Z%f4-h*w4sQoIYcvBKhRjj;_`n8HNFH~w;$;sv`?jU5HlFK~Pf;3xk*B=L0f_1W8 zPqH+g39PYAFi5a4*l0@T6MOJ=Zg=VsCE@YM;4<|5AKoMiFL&?W-`oh?$8A^9be6yJ z18-@6Nwf>-Zc=%QBn~F+dlwcL+Di@IoFi9P024H)vdc-uFYBi6~7OkgJ zQZ>9f-cOUY7FE=ZFRmNih72oU435$Q~VYf7VTCBuB0BKT{^>^?F+T!$58mkEnOMj zu~Y9bmMRkL{b84KXq^I-{xtVIhb&F9Z^9O=h$b^@vT}fK^EfWg^VFn#)`+q=ht0ru zQFb$jONQGQ)!~JytYY^M&@T^=FT&=gxEJ$eQ-V^phgg6ZME(Z>>Ak(sg|%SRVaQhU z4}uJzbQr~K9^PkS>37-hfN5w^HeW*X6MwTrsm zSvZw#50B^jC(qI)A0O@E!#d$j^2&V%%e;d6+F%=z?#7Yg!N}Lyk)68iG#~81QL@!( z$=vkiR~!2bZ#;-w7qkWYx#yG$d!D_*b-?qEQov(gs^X-H89lIvG9^Gzbjw%S&M+jz za4;@17h11g!L}h6(m_XWcPxrtnb1oR1i41+o797M>4}9!QcyEn;iupv7 zI!m2M8=S|r>j`JPcIVD#+8O^K)-8nFp(kBuZnn;#um?b$QtA~~9)AuY^V=uj%y?Oy z<_g87cwS?{f)8_i}{KS zLyaO-U^-_uu7Um1R`g4Ie5ARIB_)WtqCP>h#ngU-?=rU56K}#(&o2kOqaOdVBfs>S z;r~ExC~VH3%_Q2VwDooG$9c|6wnpgt*rH@x{V{C0?J(YC?x(D)LcZ|b!Z&*ywGi{g z!h0cTfwx2S0KMh*=v56laG!uD+mLAHmp|5V+9V7S66w3+XSg*wnZj~74FIsOE&U75 z!kRtsc*(x#yALL4A1^2<5OJq;M$^O>6__>hm0oJAkL~I}^TWZrtQrR2rVTg*sTJZ* z3Biq!$u(4;Vt=z2DO4D=1?Zc9jI0{?Wm!4VUh6xCNi5rCgb9jg4K$*+Yp_|op8YI z=J1gdiFi>LShMO`ax!6MS;af~vvc~EGgju*>{{>`bdabn{$~gTn~DSp+-~x3NGvL5 zi7hQ4uep(PU4mgU<}&hhwW$6r=@*fI3#Y}hr%~*c2wPe8=6QBvhH?Nvi7k!M7OA8t|hd;AiTHA(X&g_g0 z&_!z9vVTDkM1rMbOMW~O>jhw7L=!v}lLXmlj}GDEDGM%C6#PQug_hwtDAG4HnE1cwtaJdmYDCKpOwwC?vy$k?4WdBVClvQP!^{^kt=#`0=0EFX z77vPgJ2F=gXLGBOgjjjDCS*t!7iITyN#*aD$BG%UxvcDoSxv?tZldwKMkD9(4Q$o; z7cA(C)*3n5(S_lO z${WQCXoEBkFR~uB5agsa5zn>*`{c^cxIHN=NNC-Q47)WIZgZkAIoKVNCP?$0QHvdL zi{@Bke09-_095nvg1c=Ie*a5A!w|@=h&`xdHS(3*C^vY&C}LVu`f6@rUZOojR@Nod zFR`c<^pn&WkL~@q?W>NM;uW4d0_w5PaA>Eb>29nu55BOR5?)CFAyG8v%4dPb4GBxN zz`Q3?Pc#lv58+BnmJDK^eb&r9VNMeL5xw@3S~t17bjlG}`jV^eorU>=*!~~HUPvfK znEKAWG5dUaYR*KFNKQ;K`wn**ZJ8{UBV^N3^-{Hz2vQP|8`xrvD5|=c`N0 z=#$9-%tSd^ne9U)GG5%^-zZU?PHWc2d~vUnCT@f^O&!6TphZG&sndx#wf-Jd@DD}# zZ#`|7f~QS*i1fb+5~#PyI;@vaO#aNMbw(;)Ix^RW+Y@DcV6~b2DV-O;5h*b-!vAD} zP5KA1lt?B|2TOvwP-V_&V$)sB2gV$mCH)mdS zp3S?rjk8e96?6X6ByCGGPc19>E7g*^D9AXq1ASi8@jIT zw(r1BZfwiDK;--AihWi$yFpBOhVWj9UEpl@V-}4nTaANi$P;bGE1I|^e0-C$i5ctr zO4D7H%jwu$$=C(m`Lj)FN(oR9^W?)xbRYNuz2b?xlq^`X!2-GolN4au_QUu}N?W7y zY**Wm>T9PP2>^`EGX|iD+{AEzU7_D&u2@9McIFBIn@{BDCXMT+7+Dkb1g*!vHt!>@ zn3n=otKr%6z--47DL)J4teIZVfrJGi+{?n9OGTkn%Ta~Y!jh%KWsRsMSs^Ldc zWHidI7+1!p_qM=^i+g;NeW9NpU7sC%&94HoX5!f?^`vO`HlHyQ`VV4j(fj1mgr-j2 zlUdn*GT=KK2D*}Ez2g@Y!>wXp0c$rVankonR7m?@mkNv;>horQPo)M<*)C=mdd$&! zQAZC$xN_bH*@Xvp{Pat)SICgHtH4vN$c$XzK$WMxVDcTY53cLTSMiTHk;NYWK|Apd zXX584+vP$B%`1$Qh^Nrs6+y+bfX{2KXG2zNL?~AIKt(x8+A@#oA2~M1VmS!K0$nrntwufK0iMBV9Yf72PTF}Ik zXtc9!58(L)sOaTF0w6+!pk9j&V`mckt5L~A6Hq!B(U!RocP@83{XP@)xH$NZtm`Xb z%JHm(d!WPej}p-<6|A)sytNpGIe`=&TDSfSrpvHeTtXaB<+ryi!jNmua)l3kIhA*| zpdM_uY}BwEEtQ~o+Vjy-CQv)0$n;Tk!Rkg{RODYJB9=rH{US5ClQt1p)*MYDWNjR^ z4rm#;Bb&o3CLoh0^)%PX0$qYjWX{Iua+Hjjpcwtw6{;Mn`IKaV`!BpYL9S2ImYkuk z;syYu!w|1!^h3h?C#usc+CJYa-M)Thdsf%u!VC8NE08bXa~tE6e4A{;uaj_J|NiBt zRzLjcN9R8X(i?6h{q_oO;lK1hj*UhuI8XoBNrwM_t z;Wsg);Fdm(m{b4s+LN|0`s#pDCcbE+0?t(H^8vl2^fE zyFWJm@Z3w`CYS|kYx2>l#2#!$bR+SUZy@P5!SWBxc6;&%>N&cHQO6tA+w`}$e-KP) zcY7bqqJwncKSfsTMUSHaAJF}y=*Gh*qT{yq=d(AtA5em#HX)I-x49pNqGPtt%OdZJ{~+2w>DBxJnWQK0;kr307F5Koe4L>!W>fd@G-}Fgtn)PQ7t;JjROc|; zdTCXL3OZ*cRTX{97Hnf^`XhVz2rC@X)qYNyz>BHu&FgI#GRBqyO%XF6#u4yDj6f%zm>f*w7l^3PAo9p90f6`I2u z;>0V@?Q<%{W0|he{0zUGgL`2r2*0Ok!UqWY5EmHf%8g2%yj z-Ul^&eMNQzH9>WVLnMl6&#;eHqc5V)h$kbsp)}m2@ZSA2`11PIK^fyM4xFV z$yL+0;~w-qYdD}=;T7qA`LX?U$h4B83fg*30lhFcf`nY-e$D!1TK-0tTZrNd&&FS_ zC6&Z68g`gCR)t2fxF*mIM^Np8`voG05in3C; z&KIZ$n`UG@B^Z?r7lE?W?<$LuY`^Vw{$2qnbl00qnikS08CJ=kXx#6Oo5pt__Gx)G ztA?F^{{ZsJrkrQ6zXrPxO71_!Ab>qsKIgm-PLy@rkn~c8uP(HNxRzS;&;tnfm_aqD z#%(fk>gfsDg2Nn`ouamq2>Z{t;eEJi|qC)XXIVcKs&oJ+ddLj@`{Bs7d>K%l;bMmexS-Z`=3XN*%RZdQy2yan`KFA9Cy zFAt7Bghk9~EfQ*&ZvY_>-4~Kb5oEt8s8go(Y*~Ta$?So75)>&OVq`k~{B}JH>g9~{MUI@ScHuc#m zl~&NFv>sg!xm)99edNRv`e*H{SR-uGNj3d(;E4%XeKmYV;3phm(npO6q6Z7nFnX&H z!=sO~hJsuM)Fy1|q6E*-1k7-~!UR(p)~~Sqg3S@FC8an=Q1F~+ET*QB<^|%@c(=%0 zby5Huz#V#5q)9Bh%Pi`*?TK0_B}LOY-JSd@i|h|StoU~SI)2qZ;7v2wQ>NfLWvB*c z`HI#g)^})i*R9H-41-FCfykWQ*@p;}=_8qkJ3T__*L!R1)(*#En7(MA?gf71f~R$T z%2w|}yZNRuapt|Uy)&54_JOAa6N{tPO-eNjM$$jgR7UUJp|3mA#PTmxUm3P=$iMb^oZ3JA@fQ zpk1#iktFM~n!TxbAm+t4EdCS;VWX|*uru8_$I8{rbgy5WR`M?hYC`lF+|AjOFtiR+ zNcNbN(3lZ?BMQ--BY+#JKIzy#Joe2i0f!*t)!pcy!jOEjW6A(Z^I=Xb{IRJfjRzH; z$PT+;IamcIn|k3RZswJl-*8Opg4=f}9Kso|#iLT+78weDiKPoa5x$!55AmDC zW&~f=$xA0|)I&n~k%D4M?Avg4{K=2~6<()KfkVOHS26~^0fTn##hQg>*G;s25CS5> zmDQ1sh@_ZbZ^3n%vKtC8BeEMK)SB2>;$A1s!oE_#dWrHr`=0{{E0_OsAzbbw?oBN67&? zty5{RSp6!Wia|4H;865&bMM{7%u-#OMLR8 z(?#rkA|{a(Q93N;>xcfGq4}@vQ`WXaBo#8H@Nr*uIg5Sk;0E0^p>rwp8L!+%uRdEZ zhr3Uv3M#58{OHnyL}Rz{5;mS+Wv`_~2otGYG04aR)z{mmp_ZAAOy24@K-pp|dOzUT zg>EgDA)39CiqVYQ4ML+tFmY_|vy@VA997dBU^`8NH|LSIsu3OQ$asPGWS(Y3T8tTF zQz_eqgbHyV|6vsv+(ZX(LAMj^ra)d{Z7y#tE4F{%GS&0d!+0`&L!a*~Rd<3r0oejH zUuO{aQ`Rk51SfUH)01(ZS8^_$rp(NHt!@Z(c-1!see2Mq;C!^VqC5L!CSQH?$(?Q4 zLtn7Y7(D{0dr~ZBe`sqY>R*DU=gX%a!}0O`!WfvgvdgChgRLXBq$J_#1ZFMhsvD#R z`6|BV%>;;~CN8MlPXFL@G#ODU@6(#QA@mGX*r@Eows=Y$dUS1p=_%gHna1m2H{zXf z+4tx!U*}~~6qvl>WPg)SCA@PFQw>CRDsIOH6`zy?)!3jh^3NA=xh_FN1(7Rw{>A)M z8R!kQw~=#yR|G;$EFsWzj|3AdZ@4+-G&(+zLOVWr@ZcvbRB`QUz z@MPsv>x#`&F!oNxM|r#)1DjSikTSjxXla9f$`$?{h5*&o8|rM;7lb@K^w|TnRMWEo z-Ba8sXmMZtHQu+2zq6tHDFyn~iycYtwVgQW%5hk^&{lyD76R9Tozb}u_0nJ|SO}Y9 zfYE#UdaHl{1}n3NSI^bvTedQo0PY)>FE-9E=bGW0%)YR7E0=cUUGLBYX_cSO)V) zB^SdF6g@^${a#Wy(mx0%;&;a_M^7d*C?!V#+lcOPxjo3$-L`M{7;rbV}Df1Ak}ee4cV5izou z+PS{3QM?yz8LJY3D>=)%f6pq&xj)u*8PAy5sn&96y%feJ*~b;VmQU6SfQ-C(-p$7I zeflb^O|c*{=j9q5GZ&`GY=ez55~CR3+ba`ZkUBC~%EU&AVUJ>v=1S$~_7X=TFrq~o zS094T0^^2Ucz}7{p@mq4PuO#TNuy#Zi`A}di&`5~o(*z_FF{ceuj?lg>`}n(da@2x zqg;}9z-X&CWF{XY%Es!sA&PTkiJ@+Hc<$2KgjX06BfhpcqT1O~TmtPU*SSv~sk zRF=4I`Ao!`EK12Au00e*PuqquCKSe+R-~Y98}^8RymoFW&?eqMWbKzb86asTvBc@5 zHxPROhiO|6n+52Ayd}N6xMCU8mGz3@=EfY+u2jc8WA@v%w@f*7I>e&6GrEBvD}-LfP@TA9B@<|Sk&j`d}61UJHJK>5_{$jygaDn+%*H(y6e zjCHZb5RfDKLxalAkCZCIlKShrG7C;%@=gDEp&xBtxE8Rl+Ycw<0B0*A(j{3d=f zwn-1=nVTWNE-S1V5r7bz&1`WIxm#2R2N)^%)m)8%Z<(Zld%%UO9IAK=jreF0yTR-h z=JKm*3`+*y1AAT5+m!xroq3isNiJal_lUz!!Aa>HL)LDZGppO0p(wF=T8iHy>B{cO zV(J%TavdO|#K1bno!vS1Jbb~hW6#)nPD+46A=l+j!m{^k*&;dXVOq%-m-u-Mmq}TD zn-%?pM3#I&2^esuk*8I2m(AhGycW*kkg>*8@}-P&c-|P~VJK^0glo2cxUcBSfWb}h z^H*dg2P;9m&M4uLU#pY>iJj$dB(_*LSkoZlbljFlY&w66=UB<$9IPG~Dd~7OlXMs? zG`SP5La{PK1j``&dh<2B7E~*SA9d4pN3xuEi>U44eBm{r9wh0$;S1$q8_%>bgw~l? z*jyU%5q*CqdUOT0b6)arA}#oB+bn(}Yk>8RsB&U;sJ($YO`2(pEDP1KLxsV*&jqLP z$NU&DJhA#j4-l?;g0l>g3+Km%eX<-_`g#P7m=&pQUDm9fiALrHE#1<8VYVsQg7Dlp zjT9?5fn$meLRz#$tiE$9ZS2u$>os(^}$**F9V`aFIGciD+9n%_v1iu~!1BWl)7jLK-* zx!lKZzRD6EHZN9S*zkJzBbtg$e5K49OIWfVvX&sqUZnS&q=-O@pE*$kup}&)DOL?| zz-zlIZ{e4Zv9cLtAk<-QV*QFVVD-nz%uGxI9mxHIfHAv|!%K zqLGyhVrj8B9^Y3;gy&+LH~zv%Va!x?p3TAP%ESa|;Qy_YF#SZ&e|PY)9yV6a8*}_T z^`xFg42$Et%wq!sR1$h9F2e+9%jJDmkNxC3yXF+NefCXwcLf(j$V)Ai?73+$8_QCg z4OqT!@G#zHp`1Jp9`mP0Vo02g*#}0{xYmj?B|OP~|2*l5)N)pexJxt`7B&qvs|yeP z_`-4|_SP)XpPi{fG`fU?>o1jLT~c1dZSxkX9OIvm`}G_i=k@ zSuTJNo{a_%f>;f?7Qj#iQB(H@)H+53Mbnt&vK4+GP-wfj_x_k*8OJ4-n zv4RxY`f)U6j};P{&bbj_Hr`wa8iD&E@B?r06QzyiKa{r5*B5B0&;2J-8^o9YMQQs# zkT&%B>%ALtb}==xZ~q^p4gDX)JBgEq7L0Vp*3BCV{lM->(Y%k2?6*uYt;}?XI^FAb zJRN&{3@Lpj@i>vOR9=!SSB*kk0qA0oFj;CD_``> zz)gw!P=ZP|<+nxB7n>|RSoZbP-RU}Zil#{1TC}))Xjq8O9Fxm8#iON>dSrW@=w$nQ zh>$)gMD&L+IYMcxUUJy-E;Z?%&g=HLQe?tF+AH>d5Lc__WKKB-+$owi*WQ>VFv4}H zfbmGvHi$z94i7OUT03StTtwEclu5P~IV_5V)G9{K=3#navJ14Tp{1H( z%?>GN8V(%{ry*Q89*Ab;k{6SN4>LR2v1jV`v7@1Js#xK~IcWt$p1nraN3DvTQV?QE*Q(Gx= zP4d{q3@{Mr7MnL1feCtVVqCKfXr>_)i^!#x=s7I;aX91P_oc$dCmjB8KRg%t!UgtsT?3E4H%i2smaRG z){3RD4J8Y4XCHeM59NH6tvCj3mN=$(lmxUNL`W4_^c>ZGuH60&OdVbH<6O{2`Hh-j zZ6!Wyer@C-@r!gGip76D`~WAF8}pSe14-I4f@P|D=pO_sp3q)3aruDXCND%eHGNLU z;2RR|u*DbYC>(SQI%ig9iHV6s#K-ZE;{O1ge--?3btsg7_)PZX>brc5)OYpd zt5U0+S=2)-Z>qRAwM3rL3vkOmi-#NIP68=)fQ^p0KLYB(d?HcU02OMeyu8X!oh4fW z?6pj?pn;r_FjHRj0Fo9H7Pmun30WnxO>}S*d6jtlh{Ov3yIu%q0It236a>h{s>rsB z6vO02&;%=XxKIg#xj>}?K&Fy`V6@^5G;p)k#*x$i0O3jmH&k#I4#3n zyL@n!tHtLUfREB=bOc`u7UCVSbkCDz^Ph@lBK}t*@lYDAuP50-C)9 z^r->GV)tfXT~R$kgl6u{^8i4=6aj!g{6$0m03`7$AO8Sa0!RYYz#dtb{eM~h{{Z(t z+y3L>LrMVoFZj5CNFu>$PQ(8I1Og7muh)OT!UE8keORC3e{=j#?th8>&n2NBL1q5{ z4TQD_&7y% zN98}+{^$EY-2VV)`+!@tljuMASs0ORG3;0%2#I23NB;l;#LW`7tE->w{{VCSzwUp( z{lO4M#IZR$KY~QHp#Z-#{h#iCv;EKZf4Tn8_ZR~?0rvj@!SIH}6WFi_A|t2yKq}A{ zuTVq>ZL6WU&5B$sW=MOoEH9(Gk-Oa=-;yJuUMuTIZy(@abvd&*g&xC{xfZOaTrd2CPm005+L8 zfwxR$IVf&cfeB|ocEFo$2H(PxxVLN!B}!RWcmpw0jDr*>E!vD^t$Y6f;5L89%`#r- zQ^aRU51h2i*^lHRM`M?Y31?#LmQ6Fwxan@#EpfKiH2{S$F^4Ful)xNNpnRmS^1EOH zx+C!b6pwLKEF5k<%CtLc>n&JuWKc3tp)rYChkzOi)VFV}w{O-XN}@ShJrJ|N5a1*A zFh^E>;;Oks2Qs|sg#wF~(6y);U&9tv8vp~kR?`)2U*juXpg%iJI^tPEg6)?56%Oat zd7oIQ7ZySbT!@B!6cMCYItXd|f)LybAh(gE zP-4vLsLN=(DV1&i0N{tf%#HH(b^@kiS(Ny7Q_3G7%Jt?)e=?wi0d-7j2s9=YTM{jn zj7LmpzGmxWynv%@O?5xcy#D~hX6Qr=Q$Pm_H5cfOlRtBj298_A%WJi`HX4msh46%VFdOutkQB9F!Fnt^ z&0q087lRbLRv>z`1<&!x4SB9KnuC$$I+=boF1PRaB~%=DX)J&m8x^Ise*^%50ZNcI zm+0t$5e{o7?#K^{hbSFMNmtMFAASrQSuY320bU4GRvWE)v3MG~gL&>ed?tdmJOEo8 zoQ`D5Jp*)j%b2N7ZD|TXDXv(4_it9#Xasm+rhPCx{eTZFq{Fj+z`y%U&dbzL5xpa& zEui|p&3gRM<`r82IBL{DcpeHAnZ{jl8RNl0ZUxb85|{+U;*txMw%_tx`9w8zRp^Q| z-G*3y@~&i)4kx^xCEauuM*1N=#&^v87c9K!GRC6Rx}|*}ii3uWi03*6^aVDd78ZcN z{t{&z2`>Xs0uEvs2%sC2KN7#0n;!12c95)$BSi;r3(lb$dyTGJ#6GDvV%O%Tgh2`< zHHq_6rmx~OdO;i^G^${Tz<@GaU>A;>f-FLCR6YVOVVVUR9If!>ns}GpI?_X5%Ef~H z-~uL*6g)+DYU=%FUaf@4s{X*Y1Cd{lIm8h|#Q2*plcAZjoC& z5L!o|NLvQZnRZ*B;~ulTWAsrAvg8nsdV~=GEhf29mmA<}(E7wEOHYNYi$EU6f4=?C z_usfY5*mArvQc$z2x6df7Kf97(FanNFw82at2j}J5vQUBsh}{$?WF`PT`ie-HJ}(S zBC({diK>8&9|kvq_f(lw*~mJ$ae*yvH!$VL@g^}~1wgiuSHURUIc2ulI0m|a{6kO$ z0CY+wf(jz4muOq{LNp|pCRIhbF^T@`_dnf!=lQSPF2n;dVPjXv{y%1t%6`lzbgkH_ z#|v}Bs{^MT0;|*()(c?zYj*&J5L78N1)xg*0O3=?Wtmq{7Br4?cu0!2t*PxXJPa6;A~Uv@RQjl z__nk{yP!BBagj{YpUFSL{-^uD)FUFd-UDplyLLjl^Z=k714RZf7=gfms~k9itAWi& z4nZPlLhL&mO*pXtC;$or03CldrA+vPVUTOQ5s1H4a<`%quZI1^FPf+rs&cD}Sh+g> zOAM@t;+1*9a@X)G;Rp~k&;tR_@L=tY7Qvv~J9Qry%_*;`Kh^%H`@htnQ*71M;>c(~ zYOtfEfLvV*&;CXk<(W!wOz{*lolt=asdyP%Qn~*C=qexl8vg*?e;oe+DgOYvzx`E` z&i?@Nr*h&WPCxZ$__MiWL~iN)`h_;y+}tS`E18P}BzrL2%#%wQ6YM=tZUtGU{<2%Mkb$ zM}bwp7C0j)7&8n9h4cjr0bmpumfwzRflDS285QDwGzaHBsaO zno$8dgF|Lu`4U}h%Tm)`hHlPWf?@5tq6mFv@41U#B7wDSCZU77xh}%VHih>+++@cnN%<|P#CwpEodHgp5&p-*$DDDu%{9ybLQV%W&G!Ru+26xy0&cEYsuOjzQfrnL)=xl#t& z6da)%%weQwThJ)5N{T6t;BCZe@Yc6-;snYim84x0Bwql_EsfZ2#!LP!jplAH231gC zUgQ2YFC*h36-5fUjXg?-Z3b7M%M{zB2Tkike}r86cv=7hqP2|+-R#9m2Qi#rXVfQl zo5v->YehUTRS`!lUGzfW2wVnLAnqlI6ns==6fI!2M7;k1I-3&0*N$6E`UWDU;?cpB`O@lAc6XJKzT{Y?kh1wys7}% zp{luycFHcr+Gm6Tu>@Ejp9)_P!M<{Y7US4f162noY{4$zo+D_W132NQN?7AXCyFEBv|_gEL34(snUw{q73i3-po3v|VXp$jxtB3%(Q8Hpy3|t; z2-`YzLYi58D>=N=6ClXnO+3haQv!?9(HYfP`{lg2hNPO4&-gOAvEqmz>+vj$)@T>SmqHUDCPI=m zKyp>hh%;BgI@LD16GKY1V8ak&;8t8bfudv0)d(nrO{oJ+1v0T~z1lH(6LPaRL)cc< zYfI9g!))7_5P{A`OK;J?L5QHp<(KJv&y=v14?a&IzHg zg@L7k7efOekuVCXYjNf1=t2rL+VTph8PEaXQ3Fg3?h&vzvokpfgez-Athy=@g_^q| zP{)ESw4|7Y-=qwvrp&sfrFPYZU@8#;y0L(23CyM&99gR6TIGU>n;VuY0nJ(P*z8z` z>S4FKprC06R&AXy&oS!~=(?ysP60p|0O*FNBrd4FQDh3L;ur$Pgj@2mzz#Z^f9piu z<{$Gm)CW=sfvtJ8hwKUDfP7fB2=I+CfY7k2E`$PQ3_$2x6;RU{iHMpe%%P-#LhWv6 z-$dvZxJ*LcCw6#k%T$Br&Y>HsM$vYaloQSxBNRJN|9p6%lKKc zEXI+RTg1j+<6_d8L}K6l^^sVlVG&rOcNk+VvfPX}kN#gVOi4sX{{XnMDg3ap{sqc2 zEQ*+>QD8F|V)=|WjK9FjV=TYJXrIEFPyYa9vHliDFA+t50^&HtOhmnN8B7b*FEMKS zCl83IgnZ^d!AQ#D>m;OS2+QLcVg6MziBI8A{{UNm%H#N0v4l)qYH~9T7d<5*0aDN& zS-uJ_{{X$rGOl5tbEk5*X9!=H!evItu*AK^5{$jYO(P64(moM}cg$s%D8(Pb(x2jw zTC^olOzqs@J1p`h`5A8e+BayWpRhXGMMB1T9N)jzwnln%72O_ zANUG?_#n!aDJlf2{s@p8fxHl1N?46*BQqS_1w(T&TA7HeoLk@yU<8&6r`6QI8B}Gy z-lB|5RnbQC`C~h%^7{3@gkFVe(qE^{7IiRQ?g3@h!dlKE)#F(Rm%7L8Gna==5hWH@KmGuEiL@LXQZN3 zNRy1jAb%9fl>Pyg0gb}qN|aF;lOiaEuyL52Mg+XTNL-7H9-l=N}lF|5Crb{nV24|)YBe%ZgrJ5YTS_Xq3Wp(W0=^aBEH7#5Ch!&3* zFIBX?23CegMvQoAQTT;Kbx`m% zkBEoeh9816@dw=1R(#}tm_&Vo?ljm?A6SHgPu+`2KW3;b6=&u``K}ccI?+05GZhimn^rrus5_DvTjnNE zj6aQGwj?-5FXEE?${LEO8Hp+|LPRbBxm6IJC2Bo0DV6+J0%-#(;Ho4EQjDQ2m+l5p ze~m_*W^(|7QpYPN(2A+WHq0=UaWP|#Vrmy4uY%`~DzC1>vjs#4xZMm{QlA=u?Lmi+ zq(D3jP=9cUJXjO!W*3=Y89yl$uw+J_5teKeIv2Zc{lGHdjK0?cEkg9GFQ zt}0m-DjKLN3*-0zB4RG!L4r_|Bop+ChFhFU%xVL19YZO^#YA2rrE&ZSPvB<)$~>H( zbtIU9VHTsU?UrKNui@NaaQ^_ z&(1`13|udpnZ%R0ep{$-TooYsY=j4aJMl&R5kHiM8q4!(;?4MP&~*LZKX^^e^U8)xl`KTE<20 zL+Zf=C$&~r?*arIWe?&dwtPgC)4rj_EZvl5zMB|I?i$37ub z5wX#OJV0$GRn>I@wwV(YcNUx*p?Xvnhg}r6;lzBk!+wCH?>UoW5$df%F|QzA`66K> zYsc{bC!R;jw=vpUWZ%mf_<%l%g)>P{ONLw_ZNGFy1nqD{C3lf;-4_`e@!;z)wRF<2 z+hl9Xgg;DMeWoTROZLvO1!mN0(Yo>u-S+77%33(U+&229=fgdiUSx* z{{S-#xm2h3DQ&BKXLs#VM9UhqKCSSx1pl`5n^cfex$CG(GS%nz^ljnD*0xJ2s(veYWDgU%nsP_4ds#{iA&83M}z_#9ro$VA>OO1gZ@ z)k7hZti*y4;y&nuh`g^>#*s^fKQN7uzc~Xqmaudu?%4nX6DUuRke^!)02}IzYrw@P zt6<61TX=mSg*92(>oqBUlS7cha7RN7ZPt;TR@2c1^i};OQgVHg)pVc4*cpF$w`%>$ z=?~R19vVEmg32uRMD7?#9RxHAcZ7#s5{0M*)=$B5%mUAc)8fz?z#M;dR4v!=HwV*JaV8)GuCq-pKMcm(NA4^rC9 z>ueEcMp0%M=D1WJtZgZ((JlGnabpGMcd45P;T>Y)Sxd7#3>AtI9Y*U3HOumcfMQXL zVzPIDSm^=F@9L>fDBy+eDY^JpA5c>sXaqQvqkh1+Nn|#beIxKrzURzgQPG>zF-uQG z*PKDn!y{gi#bI`3e^R`CRiYBw;^tYSuEn?A*m z2rGf8+Jn<2ACeuwQc|CMz^iTs)8mpJuPxFY^O!MQ2e&Xe^CyMx~ac zJ=_dh$5WGc)?L+Obq##1)X_DEDy#Et^hLV7?N>E&u(0u`sgpC@Oxly(CKduLB zxxh%w>CVTv=T%Oz^Wq69X;~iNTUnx&G9VifH2irj2u5yZls;4dE#a1eRGg=2-K zIvsh=h*T0XyXWmJ6jOk#`$C0vZ2pN+3K&EBqJIv*(@=aNXh&a&eW;6p+8*dXF--$y zOXHbZdNN?IbpePBD!++Xs|qgJewmlm{Gs%(HaMJ?N}6|>dz z3Raj_>*tAWb=>`-LZZ$Gd_WQ2?4|I}lTEL0iLM4<_i80Md{js+A&l$w8(b5%d=OM? zyl4JqTX_wy1;tY2-G5MmN<26h+@mXlXZ02lnm|7htQU~$g7X+I&G~z3St=T+9%Y0t zEA_Gk0m#AcQ2Bk4vg0T;#ku!JV^Wx*pH0&U%k7lD`9M@oBMz5wC!3W|F?cv=1$-&5 zn2n;Zc`E`U`!6kARGU)8&D2DEnTAMnEIEIsS@IG&@`F$iNUUa1a@JV!EJ zAOdvh1hWI2W7PF9H1Okvo?t_=et>@Ga0<1Txq#5Xr78Qg=2cpFa(~^FJ{lbxe^NTB z34fR7Q^N9$w!1lF4rYz75wTP2 z&xDVT%ZG`S818Di9K10&HrOV6Ie24(HzQ(pcEd6*ZHIQ+k2yTLN^;$vCp_3x(dYP{ z=)hmtx_m^|+ek0@(<^|O6L%NX01_}tIHz7nb<_;ePTcPwfOz-~c}ivjH6^tH~7ngr|-ofKiKU=D3(8)>I$uhHsM+eR4x2 z#@xT1L9-8Sc8BVA%9e+V?hrQdT6p8>8EJvWU#MnY&UFCl<@86%c)ULotoTfabY?gY z-ZSF&EJp5AE&NI(){qC9jb4El;M!O_ms1?InC&ItCsuPWLDtEivd^q-wOr7DOPMA3 zy6;8ey+%i4cq!dKs4$nBP;lO1kjY1fB4oH2T4oktzG^GbkXrpm&D+!%3mVD9N{k&Q zV~cngrWX{dT|UOfR?Jv0ur&}i0J@s&M4;R?m63R5$M~(HRy%~)O2bu5ZBesZ>5CSW zdD;!_f%S$rIw9U4WaUs%-VshiDc%BhK`U#c=5{%T@ua?6NKMfu%u2&=FV^J}yaB#@ z*5kY4pl_D-!5KG|e7}>3)Mbw#eCpyPS$(ccSF?zg$9(7NiNsypbJ+b!#IS6Wu42*++02w0$Fit+~aG^B|x&{_Io9)jNj~D2i_$0Rx^9!(+O-ACcM*L%tbq) zVG`}H!!Zi)X=TvAhG&9~jeI#iCac?{@$et4Az%$VC%!!}WVh)&gYrO^@zd1*0C1CW z0ZJtbG(TUmEpc77pC8&aa54ZV;ssQc)L(+~M1_{qf4wkF4gu`Re-XSA z-dg%xH92gq91)(Sbq%B?@Jkg5OOfOwr=3%SNfC;pGRXNj`^%m_gaD;WS^EJ=0pK=({}?wt-OGnE=Pu06?G=x++j(rVr_lLsG5B-zds|%5)3>c8eTgR@Cx;) zd|Sf;p!+7eJi3YxOe(bF@*pH9z+gPSd?Dq_S@Q9GM-?s#-_%G=2pJ1hQ#ec)(2G@l$j zGJsnn!=xXQQ1))vbUgZHP|qL()j9ZLRnT(7{s-O_CA*n+)?pBbHNx)@b5T%gzInM? z=|)g}xb-QDZ(;c~$|a`8sQg1?OfZ(+QO$W(MLPnnPl zV*-2H4!i_@XZlN+jvTLm?D>cmH+?6wFPKM#AQQLxLVyNTs<_TbB&iG0PKFcQG1k}% z_hy+`%oHz?jy@m_E=?PDtkIKs*O=(kybx%Ek;DirnKJqW!+3h-8-ad-697((zg9Ww zSrqkx47cpB%r!J$KQMbBH*|OuRQgKe1DITM_b&=?!|GYE0i*%Rf0+7t){ojWYPWK~ zK`0wn%&O8J5%opv4Mbb2R?>8YP#Gez9CO4rw?L;39GpW5*fde&)KUfuT3(q@qJ1Le zUod942V58CDMC=$xb(u;QfCSJ*rKcloiCR$?-J>g5X_f?$&u6Kgc#RI+NZK8SB_x& zzhrug*E}zFN;{8cZrk#ists8<4=BLynR4BKd0@e`zm9V&vCpI(hXxJ|CjzF!@WnDT ziSh@x1#2L+Bj3vA2AGyj71QuJCCW*)gP^!D9Jt|WexcI_U^SG`dF>Y9#ZA!j(eV!b zF$u_@awq(JWllMdFib(|i>_Y>s56Vs29f&`x3G-2rBBQpIQXX9w+|5(db0;-C?Fk2 zhsPo0j@Lg?U#NIy5mBL4xM`I!ps)kTbe-e@enN7*FsCe@m)L!g&7~rn$LP;XAO~RQ z$r%yM-Y>c7mjQMvUM=|{AWigd1MtCQ0)>IwUzkt2d=7{Ehjc)4eSc9*^8}!8WLddarPG$c9D|XOu9FW6OVVXLv{K^_CQKvYDk&xTQ zv3ie9*u|E4m%z6<07QX!q%6c>pyuuT#?+I_53DdcB_X5`U#U5COpAkjB*gmk#8JsV~*^lO$ExcGF zPdXv_ovGqb$QPz0D9*WpP#fVcjb@({{WT>4$V-9A-f`4 zYHV?zn4o={F}N&1bAxipDIJHztQpKAojt{kWDXQK;K9(_Uc;xdKGDvuSHlsagtT;j zajd4`gNW)!6 zwGi6-Tmh$rYvq&^Nbw6VkR7%D^B5|;EZft}bb%bB?7kqyf7IUm!zdnG9NElmkg`g0 z_u@YzV6RS(n6~yQWDgh27v0--%bt&j?U1zP+54eD?OXzM@_3C!tAwF`nQYGju=Cj( z=2buROD4Y-p97g)P3%*CAJhti%BMf)a*FXr*!JpQzQV!a!a~i$SHeSEJ3%e36z*88 zR@>?*T}BKqB(cl1TT@x$a@EI2S2TO$3cq@ShNzW(&`Sj2w&pkmZI_shv=9*L8lrB< zHj2y%)tZl_qiE%~AqIMdDxY45>6$A&rJFamyDDBi~vrUx}fwLIq4i(Mnrwu)= zf;f)^xmfy2w>fW?*+AL2t8s8!M6D5M+kD5md2uUL#B=od5KI2=Q3Cz*j$;*huE6`piSwrp^fWVe7Dc=QA7+OJUD5>GYt#^9moLi$A!iGjas~0EqSTd@I#Pg;P|SmiriN1NM%WDya)F;Ia-s z?pS79xXT+s%8Px*ou5zl0M;c2o0UKwEQ9by^EH>Qw($d|6Lw%FRq9Q`c*0bsr`52q zr6yXHabw=0Q$eg|Ce|kb5OP|=wFd;dq~2wC0G8|9D+3h8Qx#M|>Rp!EFfa<-c|6MT zFAJ6`XM(CVf1pP@Zes|CuAuePEEQbtJe1C&H+Q2DD~@@MF@9i~7l_cZpyJ7Ww_9O) z@ePIB<(UsjeOvc|a!)-U5O_XbJwSeOxH^1Q?ev=uE z7|ayDke85fIfG*Gg9RhMGR<*uQF{f_nSethnj)wX!AR}TYOr4Fn({-G1K#Dy zN0QfwTHU?JH~x&ZYF!1}DHdKahcNFv)zoY)XQ`8bc+?HbORCH;e(a`GjMden6O~1s zwWP4UJtxw^3~-p;I@RyE4tSh$>qzF>fz0tHLwk1zkqWDwZg?4cIJZa&}Z` zTRtE~w}i|CL*RbV%}wY~6abwlQig9V1W=-!{fTmw-f985hZaDe=>jn~jX*6U>MN>zN&<1j9IYC~M_rfh zIStplj3Qvw`iv2G!P_+0XUypjP%_0b*8~rlW0#nNdH9W1Ux)%>uAt>~h{Jy3@+_@Q zGke@Y^Du&S+)FN_PC1_GQ9_E`7h_y81hEr;@f_?)QtuCOOU7mZQ7wYpE+`7wGc0)s z+ek_*rn+XryTl=A7xg&~ATH^cw_eF>p*5wFaSVR_#h{mc zLgsj27cl`$Q>$4Jt!X}GVSi|=z)K}2E>KdDYgvf9by024))=|HZ;55Y6T=aOFQ;#~6t4t~|vhUCgp@&H(igWgS{;`r=!8f;y{;2Z?Pc-M@DVp05nYmH}oJzNnp8MZFTVG%Dkaj-rS zoJ#L;G$xh=JNJkqC&Zh$>h@-6aI6#gEcpLeO7y_IRBsf#X*kp23P@^KRR}$>9hb`6)W`)wTm@WW- z6&KHsgQQI3UZxsaPx%ruy4-(p-5ZK`N0@l~&A;3$}65Oz(T?W1soZ%Ha#rO6Ia6@8KJcr^l zNsp>moEoWnOa!mWBVn~)(Qd73%495xa+2qB+BM;(Q5HE0d?k=@1a00R4Tb<(aO0U~ z(DidT4{&1_Rd5mJWG@gC1Uk&3+9QoaGi5j83Xg-B04dDQjIkekVVT6 z2?WhO#)`npQ=ZC|#%}IxhJNt@w%gGJWWFO!i?{=p8M1ncux+9_sIJ)U69^VBSYp}H=346K71suiBEyQj6YGz#ptNm;oyEs(#s;@*x zR@G7PH|2vDD7XuB3?DLT_yXhkkC|P@1Hr%{^od8Dh&|N%r377E`WI6@0D+U@WZT#! zrw|AjqIC<|Pg{xKH4xU;$0IrOO9&gCUEu1+z`|~Bs)qi`&Y_1S6-{6-(0)+zjn!}U zbsxG7IuH~TqstLa77{xbDe)UZ4K3UJS%}pfqCT$YZMqq1)6s#Y9^g2x4u_pUi<|CS zEiY9!&<z z3|cA^BG}%FZns=VEO-cs)@Y#eYv@6hDdDw-%^p!G(vOxIJ0q~o@FiKfcW~syQ%=p(}kZX{0JwnBWQ|4?k zbil<1@zy$SopBI0DmVEOgsoddJt_ErPP2uDPO2QPOCt=bh2?<~)S+d7oAW5B-Wvdq zh^pL>nDzmEF*^fjo-eE7paFt%*Fu*0N4g0HS0QRXNLr==8p;DiV$rUkgHIYwFJkx1 z75$OPvZ1^%Fgl6kuMlq1+QmSvWbwqXbIvXdQ4LKJuc5&P@nXtc{jeG^Z;5Gv zCTKh6QCYHDHF?CfRpRCp<1o>ubrGO-fQ(dS8T~vZYA3DjJAef9hCaa~$&H zn6@qSUZ*3d8xgw>OiCQqajxMFS&CSV)C9fr9S)8OP(9UM#Iy&Pmw-3D%R-}EgqYwy z>QhMggIX^KQi6*4xVpu>%Zn-uU}#dkRrV!M;1Rv11V5e&XgQ{{?kNTZxp^@W?pLS} zzbO~u6&P!tsC@zk-`yzRe^|JRk+h@9w8gLjkR%ACHwpfy;T64Nk@N&mN7^U{Yf-Re zEGMB8?ogrr5|F_@ehhYizV2JA51=6l?mz6Ep>gWQ$1hxN2%a*O;4crnUW z%rtF5A>A5$Ox8%C{X$pd?V;5uFyPDPsO+}-M7E}ad|oIj z`988(=#7Hxb3Y}%Wh+1%RQx66rvv?S=^e@fN3aK?5<0~L$rbXO{%HRIpfWEgY+9Wt zeWi|<6^~#r5a)DHU}ZUGK@Td&(mW^t67*L27^1YMl0LfW7orRWoNJTC2eFr9w`MW$p!gy1><$kIDBBjjvd?w>%kBCf_f{57zYu5w z{Ie$;;M4wu)E>Gi_Pki5nm32hR}TvZk_~3A-K=VD@6cgd^M&kKTA2R;*i15(xDUD& z7reVR#!iBbd>9~0zq}J2bUi}RNloG*#6yXlxoK(#ZTL^jg#J*f^~?CFMvE??eS4%% z;tznO)R98~%I+R)MAuiMQ6D!escwl{Dgr^$neH5>^zj=kZQQZiQ&v}))zZwg$qP2o zxa&xU_=!q;X4SI59Y!)2DwS}ujvq*)qVaL)1IFRaf(>nto9ET#7-y81Y+9qvBSo&!ns!%R@5yLAL=YM<=c#d;F=47Gt*ZvQQA}LQ|UMif{&US%g|}Bx+c97C;^v?q+8Px z;il8!%RG@#k)l4#e^?5lyED?&GbJT%--cxXxE0>+A7*09cvuZwFVpTt68`{LgY}Jl zVW4Y~c043iO7;H$6SbS1Wq|NXipzqR`4%C*A${;X&-IfYzWs(CF|sRb_b#AU5i3*v z;w$1TMs2P06Eu644qp*bVy{p|+5wjY9aM!Pp9w>fqofV9HfesaC~uv`U11f-Zf16^ zPT+Zrw5Q;Rw4-(AR?)p`SNTNL@?s=4EF!MrfaK#_g4!ORNW!ojL6nV~ft9@qto1Ey zU40`&YX1POE%}Pu3(b zdh~|#E?#Z+5l^;Vz~f(t%6=>Z+X&nboc;j2GU)i9cX0GV*w*vmCf z=11aZvYfuE2pPV>&ov)NzR(58(pJI~(;{TiP5hTfETN^-!O(%|4wf}UXtlmTCH`r$ z9iL)K|F?4kgS-6?g-0tWSa`){wrE)R%TIzFE!*u*2pcodK`6D1GGun}>X*KN6iC zAP?S3Qa~n3d@vw-nKvuodHR(l9u(un7@bMMx1e+JaIh*kF_-m+YNwG>TCa7!C0^(Q zCLGJf!$+DkP8GR&aby6ScGrA1Ire}qdERBg=nx%U6nm*j7_D6f)jM`ibC+bG zc-#8RzFherpdoz)Yma+U6S8D#odIvsGM8+6Eurxgfq|6IXY!b2wXGt`%u9W6AU5^H zu%Gxab~NAV2yvBKm%3J>b{)}i4MkA`zsewhn!y6>NVQp>eP~i-*f5xb3d=RF%(=^cwqB)4{StP>v0UPQpzI|^@5>#BZ-T30L$hll^}Q} zZ5NwkLWOdEe8jgsDki^DI?^!RB|u>9b?d1`HN3z|$*v=Frp7*DDqRteXKR8M(-x(>HEaqO8b$S0_Ll?g(BA|5%9>gH=05Vj%^*Iv?2YXmegyl{ z#BqvS%^W7a02AO8eGp^-Yo0BnS$1DgvB9CcS4Cla!IhBZaOBgP!x376zK|XvSj<|% zp9FEqox)Kqvy{pSIDV+(906SNg}GK3t6}DNR>#zpme{Ky%YskCK!<3uR|e7Bj9DI3 zo9;MKsa_oA$4KzxL9;yw54erIWC!lCePg^+avmt}(H;%)kHmtNyS0`0PsF6XEy4c) z0Wf!&W%IaA?2GZgQo{$|(Z4X~aesh=GSU`~Ed=5VuoRixa_xH5?%TQ+pd@-?D*;+# zD%^2X3N1qvxMO$@2QZ7(Z5G{7&=tz);sVPGP!it;1Y3v2Yeh$OEZdh;L>1PRPau!p zKT_|pD<1E>C+ayM8E!JALM9b7qI!m~HbtAtT&N-p)?q*-Mr$N)DHOW{8GyydZhXTR zjNrpolC4nR5PSN{Vz$%}R8dxJguO)$OQjypX_O21Q7X+dH@BZ~tB#^5-~7Qs@1Kco zcZQf6e6^Uu;+Z`2T}##!5b}%ojTWd8_8wv?BWQ_3Xkk?1WPJUl;!_)nFHxMS9KAZqAKgjD4a?9$$qMk*2=G@oE6=@t)l7ox%o*L7#TMkvlWXXc(@ zd^M{njxJxsv-Z~fK1VTgP66@{)12ONfS`v|HJfr6o*rcl9pPvR$DgMOiTFAe&J zx$eKBKak?Ts!-*>&ZFhuHa{|f&fy2;nwmT*{IMU6PxmW6jD99D_6O*cen!*yB|S6c z&S-r90Jz!-WZ>~sCvBA0tPfpz9SbGDHn#EpO}{vgKxp2_--3;o(t$+sJ9Uh z=%xaIaBTYE^%EKoOI_;PgapGVn;3_NOlodgF<9|MuW-OtF3fa`d`(eW7`l#xBhF>6 z@E^^0F3TX*uEeHn8V47+9L0w$RTHJgFaSs^zV^D5VxdtJ7ALk9=f@l!1OC$aS^Xd_ ze9VF!rSo5b0Gx(ZtL%Syvm%wxs<0bbCFo(riU_Lu!xJfshH={{YWYfd2qt z)a^6;;&m~>{-%X`{;92h38Fgjm6!+zUrin#r5YU%f)qIVMjY2K+_jAJGZMEhd7d6K z=|he7S>|Nr#YK%JrOLKZ+^$Yfyw$rY`a_Ob-?%Wyc30*Ky;yzxdX#Y}d;~ub9|98I zEQ|?_G0n?JPDqzW9KH26#%QIEx=i!)h~w=Z(}q|2L{KSrg!-zBA@l4pius#bj4RoJ z@h?Mde_ETr5UNN6w}Msh#kWZ~@2UKji>I?dJe0G-DiB~xM-e)4D%j2Kz@YP_5fy!= zl=v;1%Qr<(C^TSpMOqqCCLI3&z#ir>dCKruYR!U?N{4QhtyRCPh?1nGb7&7qmzlPS zjo!67m8eDF(ELenti>@{usFI`;tVPkV*WnlkD*gSm8^h*Of-Y9V#@^=ZazTFinT83 z{{S&9!4>Xr_&X5Ns^j>@n}NRAD2BvW$r#}TW+`{83{h7SuyH$RXc4GywEU*G>@<7`GfxA1Hj~gdgC{0$imn(>-f%|E7p!H@)Q8x8au&y3T-Wr>pobg*DtiP!La`TCs3KYDkuc&;ux%; z!W3TGikijJC>TL~ZJ69cJMs6IZpD-82!)lQ8|5H}L<{?+#D;*;URwTgweDZ#UA~gM z5`|*i4Lz?B-1-V<57+8tOu|s&y@KB)0Tvi78WlP?nA42QX@MwqtQ^d&)s`ouK29QE zFpYc~xpr7$q6c&u^^|8D?J}1C0L&TU^FDy}09M7?wa1mnD=N_uW#y%C9AFj?6TFCD^9)dsJ_v9FN+iCeq!PF$@@|JMuoDCMA&4bwyV#|KvC)(G#v|HDv1V*s|)_6 zTrOSbXZ?Qxwdz}6{)XljbNKSx0i<$qexs+RFYz|FJfj8$7P%ai5q4`(kRTpb%{7?A zdd7h)3M@4gO-d&^7e?wELNxd`8wB#jLB*cF9SesuM8eBxZR12q8&Q(En~^RUPk~h` zvA6Uxwd&V({nFZUi98sDMaHE>@hcG}Vs|Kp<4F+p9%=?NiA)y^B1OWgPoXo(y21iD zDU4;04!08nEVFs2MnfDozU3&;zo)p!((4)A7e$~jTP!a$$>resSM@J#QsH`l2Dpjj z+4TdQlXfu~>}FD>D*V8v@T{)C>OA>7N7f}79sTHEnaNcL^Qyj)!(ZAKS^0sB!oXL+ zq`C(Y7hVx?_cDoTsJF*XAG~SJfj|vnzbjyPjCD;}sBq#2C9vBoNJovu4XUL%Rmwq| z!3sX>*=7hE&CxN%ETrQ$LF%D)s0^#kF?_;-8Yet}9*7eO3yRW`@?5Xr2?IbtKp&R_ z-USb4W{)~bdcg4n{ux`5Lx5mDbibQXQr-?y2! z{_7g?1F92lUH5djHeEvq^oTNZw#di71u)ns3w<{Y8zXN-k7k0MmbPkXs3Q!Md^)dzJwv{K`>~jlYHvzi_jz9VeuMQc4mE)^Q&jlGD+Xx7$^kS+pwm?KF7rTrBH3DN zX<_jdBD`zrkW}~EeM1`;?2UV{f|PGUSJEZ@B48kHze0oN2@IkFI>#SVvrazZ=Z!)+ z0K->){AFgK!%Sd7E@E(_e46}3a-d{7?7qw(ETEIoQo6%@PtgM`{I~gq7=C3kFECYv z&Z=pPZ#6w^_b_&E5p|Z^m8@Ofx0$x%vbZ>RGgsT=xbNbF988<~AjH2e{rtoYT;FVI z3JSUm%VAKW5Spl^_F!vl8>k52IqX2O)I4?WZ^@r$P0SB%S7V*z#I>A1`W|o00iQX9%V;+`vzqDADbnan-DPb6ZoPb z5+vdwG>Xl{h|0Jdse=(e;#SP&btotF8Wxy3@cLY|(gKL>l&PZ^0fJ|n{lIWj-`*XZ zD~?igw?U)r0j@{JVndrQ{y3?Co@>g=pHKI3?NHx{Y6Xhqj$l`aSX<}0hbXn?7ct&$ z^AfR7H7@ZIgqOvW5Kmq50t5!t1I^jE2zr1K>WB`A@q_IbWwm=^L@4TLmlbqgc#E!a z<^XEVZ`|l_KWK?VSo=>ShkoU3y3Y`OlO2l37|XaeLHfZuE4CGO9eIMRQyq0OZC|&! zfo+Ejpv7O*iSlt3)OOiZ$2P-eD_4I0V{hm2VX~!z;>wn3td9YZn5&=%Qn=3S+l|d2 zFO_V!fCs@bY;jGBDj?W!2KO~-H8AK+&(Cm#_BLr3|wXea*PJAJ?%FIoEgwv7$Nj5U-+DWmr-jc%q|VLrpoaVxE*qTzGort{qqe4 zr88+!YZl#V)tf)_h8f*HBG&F0LveX#UNTmt=S7j!VEjuLCZ?5n_r$Tcb9%e+6Pi~v zMN;X4w0wKvfQuS-@h)=`z!h*B)*uU@lO~mVE}~ONg9&ka)Dl2e zfnjx7?x9XEwyHErvOaSri>%V`Fhj$RB9Ax6xocxQt16g$pY9IJr<**)P@|>=ocn`q zNB#+*qP3U`efO+xF*M#_=^aqzA)pVJd+*G;k}6FN2evRYSm7R^-HIwt2sdJ7HOTT6 zhFBcH&{Tm?^Ta5b{IFJ-g3*p)#<3|}(wGpuxi<4(*Mw_eKzCu-vz;=LXc7zA$uThu zis;)%HvBxmP!JBmQy6Z`>`!8lS33Te1flhZDPDhvGNwO*7bv(HULr2$)%-b$L`ay0 zWv)AZLGLVlwk;Z!MvozIzu5ckoKimQVGQ9F_j`2_3 zjAb0$`xedx%EbyJZXzw=5^;W!fe;Cg%(Co#E%5~l7`lp&toIgfHnqphzB9OoL*p=M zLYH?@a^~wfmhy|-*oCzamo+Sb%0>Wqu(Pb<7GMaw?R<`AaJAeMEs;`-nmIM2tvO#2D^kqUHs}ZYPK=Z}>@@h{}K= zs0`nNu`n@BQ-Ajn3uV`F+*rs?*-gQ2bQb=1@0|!m+l~F z0lU6sX`+qsb0X`HP!ql->4=iTVC0!s&VKTlr+E2k-+_L~!0HfX zgED!Dt9CHUbpEm))jwbOONU=Trjx|Pcl=Su^NCTy7?*J&RT*lP9sd9eQQQerBL()4 zU3AgvCBt-44v=irO(3gvn2Mt|`s#HBFZqZ7_E7LTrJ!ZLE?x7Fv9yw-f2_4?lo2`^$>T*QLTqQqI(JZ?prs1nL(28 z?F0*WZfIM^iDwWUnOj0A8Rh26yuM*Z7eP7)yYmvaZ~$4lXd09hx&nNL8PFIk9|s>2 z>%6Ozeq$g2I_3i3T=gyh@c5i6G}Z}qjjX&9sb@D&h^|Bf2IE8L=6>d zTbBT&yI5+)nhxVys@9tP{-ZXW<30F_mN8uG*$p#ed?p}xP;@OoCXruuW&zokTsW2n z%K;TF4p_FXZ+;-5qTEzX{{W(jk1L-s6BZY#NY%s|xVDRUy!A2LUw6!*=cOgwbjwr` zPIISy>vJ-~=Sjb$9p zAc!*5y3ta_tEZ@K<;uxQ2W|_LqeZdiHD}l6GUpHBIhLSZ+09EBQ_ntbRF=ixUS%5w zZ_aKe1MHVIRTesos4Fl9z*2KE)+_H8S+(qxeq}WSXH_ihiIEPq98!0p*>0^p_Zn#m ztgH7D@yhgr^8&%H&c5+b$>@K$+EwARs684yei(@fLtnHYjtj+Z`HV7P6u+7VbNH-& zA{@2)qG}+G8aQ42u~QJulk^S4TMX$((kW;hpz8NnnjNcg+|FrOKtE0dGSyW70AAed zFsyqT5h{4dY2K(q0HNRe;ea;F&5J(PGT0-FtLF6qs~Q3J2v&-BzUL#$weF}b@P9GI zg4X);P}7mv)DB=kIoZr;QWYqjB3vAfaRCAVXf^}EsI4u2N|g^$TuKORFOvBL5<-ZsvU$9%x1mFlf*@57(kJ<#MJDWK9gn)Xd3QAtbHC`iKu3LG*h-=6`*Zd9KpD=Ac z^5y_ot1|&9(*&u%6Dnr4a^E=LXysphOua?*ol|zdiKtCkKEyxha6lE^53Qr42>$>T z(+jHp6BK4)xX;{cgZO`g7=bLPnq1=jPQk|I0WU9biE82k`Mbnz(xiZ(w!ZMPn0aFc zsr81nYu9T1%YlmL(o6%2A8EWyZOkwc7s(DmW(BFNt&0Mxo;g1;aiW4#%iLOU-Fk~n z&OrUdcnWZZe_2*6-q2UqGy#r3;^Ipg%_H+&^ElYd!N;1&ix zs8(9n++Q%(p*@dx2`S0|s=uk>AfPqQA>LB#;Nt{&6dI%o{7UmE!h9%*Br8n5@Hl&I zgyvDpPgKLt`JdxHT|>P6CFj`vr=@-YIQgPx@dJI#Q@S{gKek=3Mfp-tzx$*29q70W zWyUeMF>@c_8K2>p32}?Lea*`}#;eSt8?HA#Gu(R#WlEah!_+0sR=g7H)*N2uVK^Pc zD&(^@tA-1#aRg8M{{YxRJ^4D=B@d3{64lKVLCm*{^&6kl_o2VjQ3 z2j=AFSI1FRzqA^s8@ijXQ4T8u>FZNs*ISkLgT}mP{um!TcUv%-UeE3(hT0YKKNEFfUH!8X zh0sC4KBnUD8A8XdlU~csnEq;Qth@4gV^D5fx}Sq_TV8J4RquGxrZ4_!$G|Y#_p`q; zn~>wJWd;3>M9+n6_*vzS)gB!9bxWZ?UWV!y~oKEEAh z>o56r7887L_;FL1+++MXB~(a%9K>#DZpl{fL|ZQo{lZe)RN_+0S^14p%;oruug(F% z1*3b7_2Z+d;12R34KMr!5wcbOK>S2v5i7wC~ z?(SHa7ADjH@})O17997)zE&Zw?}%&yo!nq$yZksz8kVr1Xu05-3-LTs^ZVw@0b>5Q zGG^JHZ@lw0N`36F#$lnd#h3fW4h8f5^JYhMYrc0f!CepRj*U{_Kg7j^>w63_Qw#nX zSFqq-J|GyOS;tSJ21c_x{-7IqZ#;R_L2lKkr+%Q7&BdcAqpUeAQHrwLto69DS6-^j zY>)QaqW$h1mV;8fF3iAE)B&$VPY2>Q5|o@pfLj)vmK6IVZKL4*PweOVmZcgeJ-F3N zWV{zcXmW;Vmb_o<5j^$&@hY$2{-TV3uf)HG{{S6DRlv2N`id|IGm^7-R`XFg9n$)Z zq}tOs+}K#3=I#^|oc{nUSVrzwFf$3`_)GpCe~^bMRS;l?-gD+KJQ>`yUboz2%rEO2 zc&w^goA}QXs}iq>wpJ;+f7*rzJ2M)l#XfF@QT<6pZoXKoQe&PyL}Q#TrPCuwX+$Cz7C0crGwEc;}hI3!LU25Gyo@yH?S) zP~%Kza{Zj|($~C}zPN%DPCJ*z%N30mOL3&sDN$WuX>$xObE{s;@r{%U!bGl(t4CCnqA;=h{Iqj4eSHMwP^!zuKEPlse*+ekGkJHDm+1$&6RF~Q6` zY+876^@e2>cZroWUt))VxOZ3rmwFTv<|$AuyN+W>8~eTXJ1_ST|)GxFmjnp_1w^2bq<_+*1Mc0}(d|VTIi}$M=u$@Ly{J--^6>q+v27cV^~bL<_9*49R58sz^&tUP61tt z{CbM52>9YKv|582iqTw}y4f=zTfXzxiD1xCub(mD z47hI@#rltMw?WQ7bCa3{->-3{rz{g>axM`7!iwrI_$05qeFygx1^n0co+)+xplaV8 ze`(&Xxc<{3w||?5<}bhP19`j8_k!vF06fZWzHjY3* zHInp3khA^uANT(Ni2neC{6#dM>!@&lyTtGR07r;*KjWxl#r`^#IsX7Bh(G&2(eIC6 z(l+t>{*yOv$;!zFIb6}vA)xo z2P1i>D=`S819oS)Dg*DN^C|Lqx*)YcK@QL;;H7Q*z^G7d&KUlnAEeLf15F-#;G6|n zi~P*y-PQ8I=(RYva|xq(8{qvwE)+c7749tom~tjch0acM0c?|5{{Ut&8*c8Zr;%Pg zMFSvj&T+5QzNzrL^B&YKV_EO*EUMjXH{xB@YM^-^sPa`N;nC-V%mM8dT_1$sm^waPi+A`n`IGg|+}T;#y1##94|NT;N$5e1#pvgXOA(9T2DhN=~cBTKR#S-KH{m z+&!V&8L$@Z&L9`*7N0~7L%1QnP74d}#q$(jWUUg-uM8}wc}*fEgw1}*N2>~eHdE$d z8q>4;hz>83`QGCw02Hs>%oSSp5AG}J3W{)@o+V~sEq$0`v@0qmJpNI2z1too6&85p zi$w)4dg3baO1w{xQlVieLOCToYIg5>4_RycYY@msH{3Y!trpi10#5e4dE(vH+hM@$4*J1Q*4XD7HExd&mI z46liZ9yS$rVc$}p>goH55r|kBS~uB%Q$_t;MT42?WcON$r5d0)v=I;9GHj&BNhr*j z68alI5vAIyRs9I7M}g9Yhim{%u(90;_-0X6R2X#>f@~Jw)KUl(287Rt@mY;_m!b=| zIu$WrsbfL%GRmOVtr3-@W4RoFn7ZS%#bzDe)N|umogj zM5&qsM!AX6C5UM-jG&?adKzd-`@tqP_M34U=yfj> z)B*-DTh^Ga4MiZs!=X6Ju4_J!ygAAGEO>y9m;o_R*|6p+QVgzWv>S@2uXaRl0gGNm z8n{p8K5bX?09p;_Y_H)l@HH~LKMy9~q_jE`8@9w=O0D!^qUl~HF;{Qshlt=^?Zf~? za<+aU0AaGyAk(Ni*4tRVTgyl?GltrzQk9!!fulgS+YS$y(&aQ=tHY>DMX&W$sdir3 ze{C?*Ea>Fn%y0=s)pkMJ!AyFOYnHnOw(qzD3ahPsN}+k!s_We4g<94ek8uR&;A%%l zP{PwjrxbgJyXAHTHR54*RlA~>ReV4Kghqg3jcOSj1>D*%FO`=Nt;4Ye%+eO;^$H6I z89%rhHRTKOxZF|}G?(H8y=?9tx4CF8Ggh_TT%c_ucr-U^$_s1XJQsAOUrExgMKUlyP-W!`E!LZ_Jc+&m9z-zrK9!uBuYGKvx1 zeqn8BEF7LC6^zB&9$*7V7TLakqzX}tjc=Sppv&4}>_=4NLwOs;aT-~~5H80ZJwPa3 zjXkpe08^4sjlKtPc8?0T>}9YJrAHY{xvruJ1*&3IshM!20%z89nPietG4jM&Wl%8t zs8vZ;j~MPG25Br4?;M|(dK;~}@8#)d}d_Z(+HU8ZCj27-c6q$=IU_lnXk-GP?7!bK@u z3JZOZQVJ9f-kOXEYoI;=XUtrRUP1CBh=k+N*wt~mfyf!}FdP-o@Nha=eGzbQP%6#5 zwfTtF2y33i4J9Rb`2#CGPU17D!G%nQx?hbGZUU9K$(hwkW0o-Eh1iH}VwcwaFT@G7 z-ClQwuq9v-p;z0NFe;=Kh2ojJ-M>m&G@j#V>M1<8bsB=vWVM^KM^W`qp%C=eULu{! zQXJNEh!-FTTY^whqcW^t!Bo&n+GBuyB4-fbSJsV89FY}QcIr7Ry;CP@+`n19DJO8`+d-i|JxMWn=#U5}+v%E^S-&Du<0OLVON=K%muzoCYyW zi=+>D30fWUl>{e5a-mr|81_p!I0+Td>Gxj|s$v3eMOIC_cQ6H4U=49_p@iIet}X-6 z4rOF@W&z_+rDd(TpF(6Uw$o?YQ&ebm_?W`!Rel+sTPeZ&jSGQGbn&JvDyq`W;W^^Qsf^poUffZZ58yXc9PN> za<1`40|NvW`b0JMfeCVbDAEKsNdBR7OR|`aLocM`=B8~c9I7TfyAMHXxB#vMFK05LpvjLG+aMPP6eV z26Bu;>lhc2=ktj!t6dh7-cp*Yw~DtBt8oHCiOPw2b;KfCu?Bm2qOkI0An2gN2IeSI zENf|2+6%v&M|k>!k2e@g3Bdm5fC|RHnN>l}mT3Aw&0=js;>dUc7zO#Y1`ZTzk&dwt zjdUu%>Kz5J06vnf4~_14#*ulg8awxxYa2sPi_GR-b@^gHM?&w|Kx?Sl{w!t=!Mpr~ z6qR~^B-EzRx9BS1*PGhUm@o;O79Q>_CbAz!-C{OUl;978h@22Nu+KJrBg^kTLEFSS zkgYX5n#@@(sdQ6D;3z6CE=R(y(YN$)D^8zk0b_44MuZHanCG^e; zzNN^b5yB~HWZe*+4=KP~jK$#DI}3kyZRQkjO`+R0N1GL6O`0fY=qq+m-)EIyp9OKl@C~Yu*5{S_5iEgOnU{dOW zwTFm>Vywy+^&=8TREpG;MSTs%hy{5We?>Y(`&7y@^GEEAp(bxHi>R9U zz_0jA!kM8Tr6R~l##dAsuprjQ=B)$JuBkYzsrZ{&T#LbQjg#GdFhLrC8QBprn6`h+ zv%nUgxd-9G(mHZf9KkjWZ?{PKG$aDf3sP8B&)B6b5bG>{fe!PMmC|xYsJ4nD@HYjw zLx9iI3`fjjnt>r|z=XPw3bp}j6lxq)XH{f=>UVK_D2mG`1s``Ts&&Oz@hf4}V<+tx zB<`7)>TtnE_*dpU286Q61t3k9xBX66O{FUS;Z{{nKkb-+jn=>v#tBkxfT-+KTIKbY z&^#lRefpY(9m1=`ZoF~SYIF@+umP%`Gx>?T6vGJ-pCJAjR70+s7xje}Lt1_zP6MsK zGT8}A_)_1hN{reR+V&WGRC_4#cG}m<?qoh9!z9V}B&@iPt#Rz;&V^P^( zI)YKH)0gk6i6)F?7rB&sF>7zZDKPD$7wQz-!2#HKq)UL)c7xX9f(y@o2XU-WVC??@ zh;f;40P>{52$t=s^%yD#MvC!K#8x^&eR#+6M3!1~EBfSwskT7xvbnRhQ1ZT=(IL1t% zKZvS8Ocp;`*8ye~$c~^(GB$_Ls0T1?Ohq=7tOY)@v@(%$eMswFtn_t4D;8}0(k)0E za4W2}ErHU|SosIiP>ZL3(Pj!J*O1rVRS@<+ONqd5if5+fTFZwu>u^J8?#TThB(Zck zTJZ)0rKdIfj5)^?t*5AoDYh?u;l-HkaE^=>#=qtYBSDZ~t-%(s=84aW!h*QPN=plU zOmC#xTH1TCSE*jbF;-tWmJk)HalX@Y#zuGH=2Mta3pg*6+%id?N*}~?jfx7=P)MNi&N7dzWdNfCn4kqqukeW2rq$h7US*eX-Q3YI0{hL8Y@!s)O|7+m)FlDQoe?#j552&eC1f0V zYUMJ9@|65yGKEt+H};PxEs1BvO3g^^D*Jg@(Q(39e)5%hbciT6xm~YP!7;*?ozop) z4%6zyL?lt6^k5B>1xowFWM0jseo@GSEYs`Ec|o#h{5p)9RPG9wU_DSSs4%LR2np zK%m)6M6ZwbJ3HXYtfa$WHUcr~B?UHpu?JF#P7NPCOUw(ARDE2djVcO!j5tFoot`LE zhBjP7Zgmcbm!a@uY;hYj0BmgBcVl$Du44FE;EUj=5Re7P4Zl_{Ylc4ctC)<=AC0sU zK?Jc!z~?hvL4}3o2r_GQSkHEDW$QEvk97-!GODzD$u29+2ba+1An>IOyTemjwq$X- zM5s(Yg2Z^ym{OXuwZ}?E4XlnPxTc{@bcVXCQwLaCI5Acc+VkXxyFuUl^#QW8f%`0ikW`T_ZhUJ@VjM~lA9_$9k3b~gk>e-o4{i>GrD8hrP$JS+1 zw*^J13&A0&d+Y5o(R?Fn^@voT1rB}OJ2z^zKRzHqs0GpUa>KI<6nq>;ZleMR?@+Sf zSTcp(M_3B&l~B;Nue_?Rt|=JafVu#FWwCz>2iD+METa;<%EMrm!#yx|sO?tPU0Stf zH$Bm>GLn<9$=#tb6aw~sa!XeK013rgIFBXP(!kfu5mi@FN4i}{q0FrcaZ>3t(DSju zESxN+d{Hcvg)Sv}nA@X8i}z|(>RQTm*>`cQm@1fi!y5vu(W|@$VhFmFWIpU`xKSR< za{kMVL_m_lrPo)xg=h^pm1gkK>LAqJB@B-Y*toJtyE=;5D{2!jF%Ir2rYf+{Gk+sQ&OWuGFNdno;kwLP=G3bNrwLUro@Kdh zFNmtAKzX{irZMu;4ndlnpRJl{70d)VLdpkW%&H=kCbU5V)}w%YhuT)B(4?+y!~;SR zD;ukrt{jX!7sN|)fw7#YxCM%fwCGpu7O41PrCFGq2%R+O96Z1h#S8M@%tB#=;&V+E zz-kIsqc>#Vd_sajs$L8$%tmEOsvA_o_>^ZtIACKh7NAft=Ga#Yb8E#z z84z);>cV$c#=jbtF(_GCp2$2dFeE(GHVg`}JZ-HI>B87nOd0rwDGbmC?9$cu4hW!I zctirT1Y3?lp0D*1VjCC_5g^Oiqs<2%K7s$M$ zl!yhVR?Br%S{vdk43(%DU6(09qg*%S_ZKliC@+jl_X-tuNxyJy4OSZPbqvotoxA5z z@fHAq0$}3p4BOMxvJKLnt8lboC04y-vNzy%?b?K5s719)*w!MLhsHh_R!yl(^Gu>* zvu97w5#dRq{*vNF+rrw6b@=H;v*VkAfd&>S{X`ZE$;&*j@e#=J)x;uka(I7nx*A)% zI5RG&Vucj)L@263Rvi+>XS&#KuZSN(7KCf6An8UHTyzqZKvhd#`Gz&9Y4e`OI$aW# z;G^bWp7xma6u_d^#>r_>ZsA%@+P*5Hssn8=!^B$n3`NV1rM2iqfUA7Vg=)(wTfX7e zg;~j*oW=`f1xLI$iEfHADDDhsmch3*++gzBl9%V2gIG>EePX4d3!z{|D+ycCpgW>9R z3m%P)bTHn`M~4}3F;wMFJYG#CUV&k7*?7dIx-$L&%T zH!~Mbg>~}=wQ~i!ahJF+jLqadLAoHpo_zR*7J*F5;!t7T9qfl)Q?duBN-TJ&y}iU) z3e>53Araw8GqpB!lpS2Y0;Z{2`G(cBYEH4p=YCKi_% zbbl2d1bRvf38a+?;EsL?bQ(-nWrC2LDRX|H>|%hXB5J%qg2T*Gp-y8FSel3m$fi5y zp%kIf6f9|uB{GcGf4iCJS^2%nr`5eg@JJL4yQ_|kFEspOF!FhIGZbE9p|P#?8v;h# z%`$~x+TD`v)Rj6dlGqp@1}cs_8{hrHPiWTM$MeQ+rJ+F0Tm8i>z2!{SL6k{-z`)or zS{}tt3vb@xQfy+&ffD;mn24@yXHblpGnLPn$UvCRW-JOil)|c{v+)O5j_wcFPHs@^ z8g6U{rQ$HOu*HM}eI*RnVoK;bNW$)T%Ay7i5L{h##H9^eRQp1V+0>)HOx;FU09Drz z4jJQ_cnlcz5fLbV#3Tkfgj{|#8C*J+78#0$R3lagm?R8XqP@zNu$SPzdyU$H3xch8 zFiW&>pvE9^wXPPrm5<#sUK@g-jNAo)mqRa6rdByV(-0VR#G%37U{}u46)MA0f)`G` z!otsi>J6Y@n4o9Ie=v)Q!OF}TLyOOum^4HTSneW$!-I2e6=}p);gI- z$Ej4>;!?5;qYwflXr|lvmE@yi`-$zRd6a^HQ8{&XN7l<(V62offEm1%`HwIta}zoq z{{T@U4erc8J|^#Z$B0m6oAk=CH$^_VA*dm*AM-6K9(tDLPAc~ncR__>0XMb%%W*g# zFg0|=Xwl5+kI91}TV@5NIEj|1V-tCuR3o9yW?%z8qD}X?MT4>`4smCRR7^FQk!B3| zfo{{!Fk6JTHGZHeTSg#a#!+d-`eMzijx_lQ;|UvNlLbxYPcbJT4a6N2KP5*f#0x22 zWs2PdQwRnNKoo3&wO!8^<6@tz9k$^?!lIQEK4XnPFpzG#mJJR2jZj_v<_>r;Opq<^ zUkkrmkG?y3tT;tXBoUGVm6nk&48xsm{nIAR1d z^&&$H`&_dZ&(a_;{^7U1O0s45{l%q}zofmT`<#WBlXVzSW7P5?3kH&+U(6|(2=ge? z@%%tsnTcFZU>`6huO8=-%(eW-3zjZ(#voe`30v_Me7x}pa_{d3nJd(NH00_zfjVkj zv5Sl)U45cyXu(#34WrUNnTo0clvT?wGV-u1?bOg5K?Ujx-OcsJ;XvA;s@Ll-_TJ|7 zS-v;sS(c!1DGhi|WxrNtD!fW>93q*)sdJvWmvG}TOpR#$v1?IYVh_oPpq*S=h5=d) zx|(1y2Hz~fbYnfrOH2Gl750`p_?>kAp(igfG@VPfmaY4W<0+xKh6gBa<~o!Iq|FpE zngjksNt+sp@_e$krdpTvmRRCq(nak!8)a>dYFT-W7r5u84&gcG3r02-5wtcShNf?r zte#O^(l%aenu~hT0PTX_aS>aEqluRHHE}E)6I6Luaj7qS1}0XrD-fX$G$mXsi*&VNPWY`k0HHOW?dqt#RHn#>k5}%t8)a%Qsm^fbj)&c9XT! z69osvF=iJ$#J(k*Ra-h>#Jmdrp{8ho{1UEV$sZyP%DB>i2Dzw&%>@Em#`~O+e7K`z z71@__b@`UllbEcV_ZBkU#I((sjrRWl)J$fEAUM`JxmOdf&CA4w_o-LbEE?ugtislq zM)l?abMq26l4#sxx~LOyW*m_#WN}r?!ucigc0sb*#u|>I5w;KBaUzAVwb2>wSY|gA zxS8h+LZ;o!P|Q*<6|Qp-1#D((r_2_y#$koiQBq~Dstk#`Kk8`Ym_u>n7q~Zw zkjpxX0O8CClCqv517fasmQ?4hOb1_>)>1Ta0=SaDEOiq5!vKCISGmGsEUHV1F;3tP zpo?khH7<407f_}3G~HrZ;&KNQI^ge!6w4{AF$_Wf01zq({{6(DhAgRQycmgg^~6dC z^(}owv}PhBQwJ|`tNzrx-lm%$5`p{1c;oFFu@5&awqfP~Wcon~k5D1kP<+?K^g#7< zbp&rR)x1grj8tu_5w#HxM1kSF!#i)7qm5ReEsgOim2O1(#TCt#+$NxAwK8ZpaSKI@ zeiKuHoXUEG#3EKOl_}2ISy&|0bd4JP?pU|H%HIL>Q5|AYs|V$sy-KjFrOzboLcNm4 z;P-%Ct_|XFgHrqvcXG~QR=bT!ha?ROfR_~i0B&?5iBw7)K^%M#Tg1h!kJ8)Q+#m%sn(i<|aJH%{=4Lm&j7F`c8}|q!IO~`&!2HJ=i(uv>?iEjn*AdL~2wJ55 zV)8Pt+Y5?(rTu#NhQ2x*W04i~wmKrjIc8=3(wUZe8_I_Q1@;QJwBP-_{Sz9SFH%EdKzQ znPMM!8iB#{5O$z4k_s>*U%0EB?p-WQ$MA(c#Msj}xSnh4R#3^}} zzlo;h)fmq*TM%K~a{mB{NWA9|zvmnUUviZ0;As)}?m2+fN-eMOJV`U<7#DD&qi68~ zH5lWGz<^*^-Xdy=N_mb21x*XIypHbRit&e+O1V&7-AaKM)b=h2MJuQSM?Cn3E(Pz@ zq1-#O4%ls%8I4Hf7SA%QI`xQ3g7@lJMoSehyv3NAvOv$~30dR#R;Sf0&Mpy_Trp8b z$iDKxvbF)@IT23Di0AlQyvxT)q#(|STT;oGJH90)bt}UipoGk_3v&B8n_Gg*nTnDk zFt~#4P?u)mMI2vxhi2m3vebVckV_yh3LN>Z5&g6??d~*USV(Cf@||lA<@}rP}<&4Pp*0 z%ob+i{{TqUvW7UX!aoINm}|#=3`wZLB{7*!7>3bS%ZW<=0BTaH`$LKi zeW3+B`-P&yf;b?|^A&veHqA`qG(h92M-z>Dl}y38d`dUh61n15j&TuaC3BTmnNf^F zoZk|t7nyBU1aQg=%n^qy#v%?SfbJE2$_lxGG-G2C7c$>}q`hLI#`h2`Ru8h+HnO{c zN7iIR7|Y*qW)66b@x*uB1$7swmm0lyFLqC4u~M*v<mC~0>E zMMLM@X@{m}KQJx0k9f)RDV83R+7f1>W>r}A0L^Anx9(nun|`rkxV*u-`$dADVmG+A zpKxLBDw6jUZ8_NYA<>KyI zLz8j%_<$C>WsUAVxQKeOx7sT4OWb>0<%`t5NVD+`WVssZ6m#^0NUqs#2qc6W$E3R! zXFes8j^jW7!~i4_00II60|5a50|5a6000000RjUN01^Zc6BHl?Fi=2XaR1r>2mt~C z0RjO30OyT3pXn0&tgA23vi%7E0N`>L&N+#RS~&3H=cgUNz@H1pCxT)JjiHSc!r$PQ z_4V}J%jzZv{35<0EevfCh^PJrX@0-4+9?>rBl5nuc@s_bj#IbS^~UeX`r@A@OE9;7Unp9~X89$?wpHy>lnl0UGV&bqkn-9-RJ^EFCi=L7X_ihaa#bfh zk&#Or{Y<=B2lW>Af<8)nI?s?LV&}9^GEhmfH)$bAqNr1nJyKR-u9ER3@wpY!nm<6GEj*lqy%v)BzhVYo@w| zSlDV+mq0U6p#ugDwcq#v02NnI;e&?`958GD0H_Uc0HHvpK>KVMFmU0+UElnGS3m)P zOUQmgJ4Vs$7%*VU!S@auYYn#BUH<@JAmG7(ys~oSl*_uvj#Tl=hTmY@1`ZrP+XmZh zgI?Envo_Wm>>aG~8<6tv9}suC%(AN#FnACcIBkJe2J-K1uVCA32s>;t%-+u-H0nW{r&y^kEiN9qsu(6 zsPfMw&R+*t&^c_yw%9e@?RR%~cb9i%uI!wpNNkgavu1}HYG9w8_gvZ4a1{eha zT7VZ?)=0eQ6wX9KGLVCs>g35ANryPt1{_S}WJi&Ylg4=bh&a-|FxOpm)UKgwfR_k3 zLadIWlneto0Eh(HuNwvoq|Qi>IUOKad4I)mu;V70ftC*2hx8LkgdUe1rceqhr&6$q z7%v!B98Bcm8N-XKoye4AV`c}A!@Zz%E+syMmKG3O}m`CF;t=Og+rpkm2zn~xJB>7@k?S5=qVo@PaythVTt z&Kcx(2Vj07$%*MQBMx#>CDJynLhDt7yX35EBi&YkMSTTS8&C9Z2myja(c-Q}ixY}l zOOQgKxVyU+2^0y%X^Rw>K%lr6C={oqxH|+X4h0I7(wE=={oi?WcFvxiGiP>ocV_RM z@0)us+s^Y<=3%+PsZooY5i#37RZ=F9g#br3tXqr&nusT1xeTX0>r2uay zOGmYxb7xLeJC*qZ-)s7)ZmYH|V}dXZtVnVvCk$?XWYjgWE=;llTi?df!6R`y{b%3Z z)Tx>GT8N_N^WgMebME4K<~R)RY}*1kaep1B3B>zaNo&c>_rc zwV3}97#K%Fq%>4U8^WkZU)}tofppJT{;8O*e^8 zoY4)}$(eOuWPYsB#?Cb<>_r^6w2`gUS}u4#2|30^xx1a6tGV?EfSR z07%Y?EuyGL_Q={hjfL%HR8jrp8Hj>iR7t;A*v2P)lT)|&9Eanng0e5XVT#hgHp9v* z`hUd^wme4c9Dd_!gC8WlF{Vx@#<}DhDqDbM2UPgGLPx(D`d5ks@Qn>(qpC;zm;~a49 zKx+36%{KOn)t(zxwpU8T&faY}HDgW*3St>vkGgDM6oYycfdZ-eJw=&*2~(@-sFluB0V&Wtf|@Qbrwj=Qky4{=lesI;aCYvasS)z z0xzh40Chr$1bw487bCUgN@?sfbaWiH+4Dh` zPC?)PG375CWtD8kgT-oMYL2M78-69$IWbv{Q~V@*0Dxq`XIvMPNL4LRdy2!S+ypQiK)k$eXmGmJPFo!s?@a`Z8`Q#jpJpC zFJcwtx<9Zm>VK_VtB!?h7Pr_ct7coI?!Lck)FYf-=%woX8k+AefV-hP%-yiMC5>d- zajzcJj0)qAc>l?r0Xr8!xox*G$uVgv5>-52kLlCagc-|#TCTZG4;Zu_LzrPQF&TLJ z5=v*|S?tays8!~vM~0udI{#x>!9w5M8wWoDnw7@e0AR`1qvXgGeLEpZ770S5aGgsZ zG4Q_Dw>irdVKX2T*USV|#^9j25-N(F`&mHiaHoXQ%vGl}X|7!g6-_EAxt?jJ0^FXI za%m2|WO%ul0H#k_h;)3+_b$Z`bZ4%dlg|IV$g2#zl~CFHNK-6Tg8LD_f|@j+`da?X zW(6oY7B>! zj2#FNHxQxtB*`u)Voa|3eYU7v3aKH=vti@x$8D}Lm%pe@44|)7txsZ^$W5CC#!yG9 zd@buaRa4k*mtg<_6#Lf_xDF5r7FV-ga^F5`pC~4_vy!g(qutTO?0*(_Vm1wDNO%;K zaaz;GQci}Bo*ebleSFuLC)4kS3v{g!_JR6eN+VlZqvEH;7`Zi+)5-q4M5b~Y*S$zF zUJ*tlxa36j`S0GrTX?;lMn<#b_yL@q=?ZXUb!>5c zUE?2OuYrA%)~k~0g+rz_M{2D@#<5O?!sWnTsNN>uvkB~Zz_9ZK*O3{ncM5p5fe@c^lBtRV=p>n1@;?AJN$hwq01)<8v z8u~;;Ckrd5T-DxjJcnrC@{I%b{FN}~4z2+ie3NTeMQ`6wWyMn|DEV76@7z7J%*gzjHgK~l)7e?cf@)T5w3qXrlR@F@2mX2R|M0dnL; z{YYKpMQgA7esK+7mmnH{UQ^j;Z@^M}R}->?uL?k3PK++oBE2RQM)@ab;tTB=+-OM{ zB`fi_@n1^$p|g5f~33$NeYbP+_Ltu!*nretpH};`seiP0`~ZCHA?Od%(hO zVb)%?CM)IGt-`FE;688F)-cFsTSbX0iu1FHCxKu!KD~*TxnKEQO@}uVk0+9RD{9bA z-}9j3;S1{c_^;mf9zr_vXjHl+TV1?$d|Gqk%>+VH{pAvzDQt95_t!2p-uSH1_%DO} z^%<^ceZ9CGu1)U7dK216JeOuK3Qk!^su-_leBalXAXM4?-skE-SY0aP(>*FzV=GZM z^s2Q08;Hx7-=Aa$K&B`l_eQ#r89(hahho%C?iGQpVTR$6v|u4rLfY~9y!DyU51OMT zY8!2Kxg!5@Oc(cB!)Nyfn5DuIC*zYIcj0d=_YgJfk`6J}mw%~3@3+3_>~`M7_#WR? z8ZkqR3M7kYZtu9>hMhut=#Z(b`2-8+hla_6n%ezL=*3FLGNKfp2AcOtyGA7`iP1{5 zF)JMGH0LT-vKhYuAFJIkKqzcUc;hxt_=a;oQ{`KELwi>%(jt6<^I9jLx!_FXL38ye zho@S(4P5>K#2ylso1fi0{R}$7TKE`FVFsb7oqfhT?Y)qqf?P-Gm#iM^40{{4VbSu3 zeI{sTXTrb9y8`>gF@wfMv(q-J2N|AUdIx)kTzUy@OjK{}G43$XPJF5pX*Z!?(asPl zbe6&8XUG4`RzP#jZG&a$$3{GaxHr@NGm;yGW4}{m>~{ZOMh%JF!eYlqt0lr=wwO|P zOzGbfEJ@;U-ga4pr*bpHlci6>#Ej3^%jn@P@{e^S+s^;6vw1UQGelMv?o*7=DS@2` zI&Ku*io+a}P#Dshq#j;b!5tSBl}7(uxqMORatUrsr@@Su{qSGtEgGb2v%o zT*zAJBY|@9_`$f5MGXyMrIYGSf##NM1$MQm3;9-=+iW^EiEafUmI5e-Q%830z z=$oc-MI&1?Ok5Z4rsuAb1BBHG%glLldp&4osAYV))TR-Wth+(deb907SmS41Nak); zd~njJFdGbK`RKl{QF&^(wU^)QArw86(m(jlagyCzaThyp?$gqsiHyG`3k=4Hr!gfq z@*C;0gj5`pH!wt0xy<>|XJ}%gu!|A@1E4q*13{}*T-QM*3CBtz8#$tfPgkOZi5H(} z-EPF_1|O@!eCHb*?-gB5vb@Qj2i*+4(iw|6H7p(W#BmaG-iU9eNYnqzY<<%S3&wu$ zr9ICwK*X)&1ye|aIV}r2DC*>9z*&dRsz(>}MkR}Tr#Uk%6$}(hu+(QjZ`h&o%bXRm1khxuUA&f0 z89D}D*Q}Sa#G$Bdf{V%{$lgII1CGU0Dl>=HJo5>!sUJY(43fJ_M9Z*y7oDBSOn+FbqVr{f6}4l$3MXQU9B?nwh1!^3-|}%+_w~+z9797Qu=99 zaG652Z*0m`M^oe{@I^LatBZu!9s{4$MGS;+j|7_D11~NAI9zqDv4+V1Z7!hs2N-#^ zxqq$vi|HaqzNh{kAz&fueTx3GTph89%n4*`oUqbwyfi6pDqP%1`IJ5QP%6IbArkgl zw~QNG^N!MPY(r5!ZQP>w^VeK;Pd$znXaDeoMq`uB^xwanI5OzVh?x18B!es)7jK6C ze1M$FDA5t{d@U|dXpY#D+y7dVvqY4Xx-nJCc(6k(>;GKTkv4-g$X)h&z83^Y$`RqxZPZG;9$ ze0W^RxdU>X2$zJcB$Ka>e;iZFnb4;~bK!rpop0iTl;=JN?-;2DGhCw>N0F*D7-R9h z8Y`HZn2{nhH}xA-EQx6{!sw9k@UC~|tridH$RMq_B&1+}*>Yf`cy@VwVP2<+Fvkz$ za93_|>C1k56wFsQ_mVNuNBWw*z*^nqX^M>qLJHo(S}$qC1;C}b@~G=-UrAPm3m*?h zQd9-v=pyfAmTTLDT#hkb@$^cI4uP?3h&{=WUFKhmm&&s-RN2-uUVe6ZnHuV%$&U4m z6~|khqpJgwC+E;Vm7mELp}3irvo}KSGh(_Yu*n~U*Ab;^>g^Oxext~RP=)pmP4*DZ znBA?eEX6Um4tjAzi(jT>o(h^TZ*U}8a#J^AmEja|IB%qcgp-|iTRv4FrP!W;N2E{Y zIIwBhvo;dQ3efyopQ%b$7d}0y7I16kHdEPQqiK?j^ZG+{OLqH4%1Jcwlkuwx-WDy7 z(u3^o%Z*-zk6Uwtvo0fZbR{kzPpI>|ABrF`5Sb!qWg2Qgtot#qUfw3W|L;eN0koI4 z7t6UJg{gF{MiptMyoez)_YI;>elvpHkeUAmaT)RMUiDR2?G|6(P6W9{%0{f5J#8vQu> z*QyU3^qZXw*iRoBzJAs}?Hh;l`@9QBGduY^)O+hL3R^j4^unq-%3N>nDg_^JSDI;e5$u=zNJE@X{mFB4vVs0#L{! zR}Z4Z`p~J+WAX8i&a2Hat$qGyh{pYxMc)M$RW*C*e&ZAbr*wYms_UB|E?XzM44J~W$pxmNYxy#9X{dC~GgPy(qDp8gU`qBC_!H)8Hoz9?4BEzj*#jzt@ zJ9Wny7O=eW9p899x-X{c$!A!B%DF+;<7qbZ)SfMlga_CP==(PR@|yV7A^x&{tkbUE z_v-HzWaI>V81eR0#s_TNVm!=JA%MP1R$sKs8pyF7nOrIbWF3#)am5%95Mz30iEI5X5f>txQDe4`A^)koCk+ zI9#p_QA)5DxR3`ybEiWz6SB)=dft{Gcq(7}D43{e>_->cweX_e0>RK>TD}iO`1L*> z8s=a$l`DP;AbB9{E8AA%WX%PRQ=_6q3d=s&C$b4w_o`f4l}U4qQCyjluu*pd6JOoW zNCSHHBOigW=aW(6c|xWnmI?FA;X~ycqw_T+3z-0B*Aeg6(7`yN>K+!8%eS1AdMY{W z#Z8l{1~5O67->D21-|#aCY1k7vRykB!PGt-fMQ!*zE$!gW>+wn;#TOTRfp=vh}l)N zlps0mAE|AY=lHv8?;M*2lw4~otKuT~_W5$OGYWm)vh#lB=0(35x0u*x=wOxMLsdwd z%|fY?DCzi%cgz__Q9A~99t8E}e;Ia;@r|5i_=}IJCNbC-7Y6$RVS)amQvM&C0>IEI zk3cwN6u6Wuc>kYI!BqLbe9H9QLw(%52<>Y}6|r&08#3tz8DU73?^3fU3xas2^&YHm zavkVNuU4Qv)L_)v;()PeZaYoCebHIt$@|OzQf~Q#$-KPaUSP=a!`JO|^`N7Cipq29 zo2qNedm`Pt{1Q`sxkC&lCI=5A2a37yvJc6bu~Q*NgrbRfVm*jar6Gh zd^Vk8eC}+@-t;MJj1*ZJke6RIn5kKwsKcK}Q-u=lH%576b>sdVP3P|ICz+}5FW8uz z7RzzG5}$ZnknVl(F17o6DpI^U`$E%KUOOZcS8?Wi$anp|_QCbf7t|i`M@!QnmWPyo zbJ?4sLTdl5Ib7T=lQ~@LNC#qPCo2a~81fT@Tv{~Q4#R&uz@TFoxZ?<|Aig<{U%7)D&OJOiR%CFgg%*e{d zT0{>k_K65f$q%V*Gu#dKpLE_x^4P2RKF$7SGDTu9+693NsqN2h8p}WFrj{9pwsan)_AT+slo}q zy2HbRpI3jwlaurROUWsg^K{n8{i}YU@ESh?VyXZ$00JXXFtb?_zHS#(B#POHppcg) z%FIaIY&#+CuBPYA2XFTj?M0|+M2Uj~Q+T5C3T^Kj&srUNxs+=7#LDyPO_Q_$5Ebo3 z$hPIfkx!5i?0w&Sb9qVItTPdOsbh3+>j_F<6F4OumXhbMV-V#5+E~1j7kJkYhcT%5 z`@ku&w&iZV6BtmE`fS(-u66OQ*Fp;`#VrhaX23rhx8vb5JyN{p7t-}0#4PJto%{J4 z|7Tob;^jPw=dEnjJgI&NabF*N-CB0$jBJ`T7xbK4w{mw<)3I;Bb%2AV-757a9heOf z&xFr+!tO&&REB0NG~K_?)~9cEOQK(JS<(aX8C1N9CiCGb=gw^iO8Q%yR(mA)xuMW> z;y(3Q*2Hz0>y+cri4Rptu0mG9;#Ltoz$AnKNW5Fn))m+ZS6adyT~*s}d3tW3#1eDj zF8nzz?2XlDbe_!WJQ~CT#PfNk)WWKcMybbLVCjjk$mSS@B?I}jTm5e)wXks7QUvMA zZy=NEaplFlBJyyT3XnSWC-QQ7)V+6`2D*;(jdFHPE3l z+!(Y`If*rD)E=RT@^ZAGwT`8=PG(W2u{6?)ADG(57Ct;U?5o10>VbttP+ms-k^#VZ z)BXeAD*@Kzcs{K9c)fy7wo>!5Tl)e}hu2+Q#ae&pS+k%k+@XD2nZsL*fgVI!ey7zg zy!c_WZz-gwM~MrMzPd&?irR5d1U9WM`qhw-xSa;Er)FWLwarNhkFE&E19pr8t#(oa zjO=mDD6!#%h*ILX1htZdlSg)Diws8%u5ZUvhy57~UsrQy$F5jh%%A$8HxxHwd;+ZKXIa z@3UZ1FmKqHAqRw_{y-OtZ0Aqff*ocK)bLf}!1&(6$Sr@AYCoerKimGp-{}k>+ihnc z;nkp(3LJP1jF z4jCTEXbfvae7gy8+Q`J>R zU<8T&eK@Y{9h6Un^i;)MD|G08V5t7c&8Oni0VgSm=s+0|45YHO*{@I z-QosHTVFqTBbbUyp=63vS;fH0&MTvD>->M{6l|>jp;M+u%L*e|&IzicfI4JVcCue9 z=rFq{w@}AwV_V(?g^yIv05xcBl_5u$8~(Zjh9nkSwrLn!@$mkf42ooc5mVgp=B<#6w=SuU8z zw^&@eH;O+5#f5r%#hWTGV}DX$T#IV&$hc2lw#tu0H~;cC*BaiMdfMyM!4*5kl$c;k zOE+O=;l`pVs`Kfk?<-9}i{v0dHY!9(LLtNbBIgcQV~OcX^BB-cG6Wjzrn58og^BFx zloK9TER(VJmm@EokPZOC4tzh-4SbGP)3w)!?bO;bt>$=o3xt|&SOLA9AvCObT_qa6 zE!cJ~xho`-PLT?t_FokYvPNf3i+++6J+I>Js0K)^T-P;8oTN3s-x-cd3a-)>nL!zl zh~e?pV3V3p#+iMpl1X_e z_{VN_HT-piV1==cLiKI>xBfbn4AbY#k*2Ddmr1Niw#&`a9Php$^{?XSg)M9qrxjNe9=HG*`TTvRtt zq@eqF{R4}-t?7iPy@%-ej}qO(RDD$=p+(4@D88;0hp7KdY?Jt{k;+;W$te1=ZGb}SyT#` z)vsP>_Q9&QdP=xUl(m$5!}ko+@&pOXW9*RIk>T*?CHZ^q5_>7_(zPUl&WXi$gOXVU zxskYqZUNz(djCC8QMJ{IJcq^MhKSDlqf|OcbLHOeT!_L9>SqI*r-B!SI^?GYy*SOD zpRsR{(!V*<^%>@xIwc*61cf&$#ba(YrA^ms9jbI_pEZTmMeSjoKuff7R>Eb|xWZ!- zE1PI=he9U*vYu&OK+C6vv*y|;Km&70KS|*w8dA;u8E__8X&Ux30++UE_mRas1E@q@ zCx9KNDVhUGmE8HsmzrA z6+YAzn>T+d**T?nnoYgeplDf7w#;cQ^M+5XSHLd|N@ZeZMTjB|n5@M8rhXaMD<&12 z{rC{sz@(AY7xq!lxAftPTvo}J5DATvj5%Be5sd)Ju^|vWDbQv-s|*)`pBAn5VmeqM znv0bdvlt@ah{~zw-H0^tD46A)6t)K9bAYzoIHfiS{Hr}air_p_*ht9gwp`hbV+X1?$U9vM2BIQtKkRnE z6h{I(h)oFLHr9))S_V{KjFDk;$Mxv&^~S8Mz~5B{&NEj$WkqhdjvpzJY;dhLNhI9$ zCmoP*u!4phUF=)4=`&PRma)Npfyx@nc0|p|&b!Pjj(L3suJWhXM#hE7MVE@+GvOZ( zwyO_h3iKn#UfNm-Gp*<``475+P0L9s?Y-ut2N=}_z18!29ol~3e%6FBxe4TyFMlo# zqgdTdbZpn7mXxmOxl6@kPk*bL1{~^gV2|&>1CqatZLIc1Kqe5I-^a5wBRL`4So$84 z$2x&I%Z`x-*?V~<@6p@V0JcDi^Mx+}BomM7C#$wVZV!0eF(^>#njYz|c%&S}K9l3c zQt}<_(wvqs``S@gU2jG_WICBxWlO;zN66pFHWVIsEF~Gs`4X>qwImzH*u6roN*Zs( z>`Wg(<#`sveXl$~h@A~qdr9FPb);gY0mJH{oZb_@`-*H!JJen|IYYhHUz0mP8itZ~ zQ?%CidIfqbhq&30ZC3m!jBzS zT=33*bDc0IvV~4Jp6P59#E@Jbb?O}yfF$dFbB$+(X2>za-5=ck&i*w%QLoUy>+XN3 zI3+;N>Ku~nyaCP~skiDXKAv}103CIGftMZ*Rdag;93K=)QaCjLIn-4~ z@f_n>wa3Ynvhub_UFx=NmngTphnlrzk3yB?(mi`h7Q?r?ETeu4!TzMQGmZCMSTGUx zZMSt(PF*OV#_Qo` z-0s#Ne{~Ipg>>yuuglT0MT9nT&Wrizht?*(=%7=W46;`?RL6(D-$SeUY%80Z zw{^Q$^4S^>STr{#89z%yS!4jepKDk440=ey5A=I&weIFh z-0X>Y!Xn8|I ziVq@^^k|O)fE5g(PO(Vj*G0`w2jSF`?WU^0!Tprsm8S$ACZWAriNjZ1;{^wt#G8uI z2XoT*;(fslXYL->ssKR+gWsBJPu4DvPhwWlnYhHNj5~Ips>0YG3U_G#0X`c%7?2K! ztK~kFl>7s{r(*xZ`cg{cs`?{LyH2hsn9lx(t94kx^fTR`D+wh(=}kOh2A?&{#erRm zH~SS6D3+pgNQ%D8AY^*5OBj079VYAZLIpC_lo4C6Ez_|9AC2bDf3v1TWT)GTL8*wY zQG##9$kcY_KV3RIdKWZlTG%qUDG#rp2TYeMc`KDsdt3|*rt-*cGe!>`p^uDloxA zcanWN_^;4lxQ@-2q1_I`;wNoYpy2oVBPLcq68|E?6@7$$^T`iWSvhwlV}0@#BIg{7 zwjPi`jvULqEi3bD3XH>2s^g4&(IYGM9*#$E)2;3F@$<-?c7mx|>CzpJ((jjxl&gw0 zPUYK;PB;_a(O=Q}CC)-mkmXOG7dq=!>g+-C%X`JPSiBXZ`!{$H0J7JNW&8`J>AmJH?(6nvY&;0)*+o za(Bv20@!MktEI9om1WRsp#YCXppMI<5Eh}CgVz~Hm{-2ET{}{8Uvy$w^|bCaU^i@8 zeU`5J6Y5wRLlTJgQh6`e91!nq&&8_Td%t6ej|os{9dZfZW_+)*72HK7LlseHa376M zrh6)vxWkk(+F|bg^j++`VgqqvKCTRtS7v|9FXLccOi~s2tF~(e&%9wIh}{e)#V04d4?Fg!|8OsLC^y2s@*MD#q-m?*tLIKyq70c0DsS;d zEEmKf{b_6Y0@(1^cT&Y#X@t9sz$YycQ`qS`rWxz^@8m}PWb96z_Pq99UGuOSGaA}i z8O!bXrM-z0>&fm7?x+^t^D{b_4Ik0JAWXl}yZ5Jekw(&ywD-D&=eGl{n&_f$T!dzR zzReN0%ykc#wJA+rH8j#44dZS0YqlN}K}i21ZqLKHYqo4KxQ{~j{ndN0iTT<#YyS(c z-YxuNI8;`SYWu$D3(Wo>z|L1-tfQqS!H8ff2Hqj?Fjj#0$@ud0rWUu|6LZ-Y<9QiXPHpB)1Z6Zhc`M$ zN!~vQIgC`Qs$BNddKHwXKap@V*Nd#kghQ0jKg ze~10yjHst$UaH!JE!7>*i|N?-M!fjKP82-5w0={NlSCCACkc`+^LyUiY4lvw$y_v1 zGm7g8%F6s{yB3cN=JTAYBaUa6;9yta&u05BYeF@&wkEPrH}pU>JJ>akUfp?MK6$q1 zccG-`m}E+bXRnqoxPYq2XJ|BEX$Sce#%q8^4VE}J7a~5805W38!@gelu<}Y7=CiV))ED+Lz11lupJrhpMTWVNx?F^| zb6MK>MWt_yDyX!J!>=j7E@o}yHh~J~7E6&QR#&L^`#9?hwKUpJsnf~UhP2`aQqA(H zyjk^7Bb=TZ9HNY%@}e|lgwq&=kV;>);3@C?{j4Sc%eM;#YFdwn;r?3Z-JH^8w{PVn z@Uya|hWWxe1`H3WOlv}?|6o3-H!Lt z&&Dk;C%|c#1Oi-a>+o#}&~iXsy))l2*j%B~i+W=ucGMLg6$gLHrPsofcI)C5bAM0q zi*fYE7rd57yviyo=726w!9?>kbI^azKsMWJu@9Oj;qjVdKT}1U66ptQu;qb|*&l67 zsI+Az7AF@YWRi=MYru{K>;^7NUQX@2(+%F#Ga8wWIR0Vc-s)m%mzQX3NsgHrwgJH8 zRQKid>%!bD=-5-S)t+*#a&!(^Km!6J#2z@GKZRp_cRG9~tmdX_`kno^IDRE|)B~&} z*D=aBZ1;D#?vHvLiYd7ml2MgJ=jeN3AQ7LNqloO#6E zRjEa@k4P?7*FerbeQ&5!&aySWd(`bV>NI()MrZmD@Z34*AHYd(*F-;W*biIq^e6EN zJPJ)ruzm$CDDN&AYbmKHetSTN43W9x)OU4_1#opK*^1g*SC@bd(E(5Kf(?5WI}?jr z1bJIR+uzUlo4&fE{}l&OD{8RUt=jnpa+?d)ae_?6U6PqSVWPY+2g;PZnhS>?d?Rt- zTlxeMf5m?{k!3U=TXlf>p@^4gMp2Z?FV)n|`cGz(!09{);mPVny(NpNKHd4_-G6|8 Gi~k1{1qpHh literal 0 HcmV?d00001 diff --git a/images/project2.png b/images/project2.png new file mode 100644 index 0000000000000000000000000000000000000000..631e2a546b991286c9894b5bb124717846bed49e GIT binary patch literal 146334 zcmbrF1ymeCx1f7waQEQB-DPlhcbDJ}!3hKs+}+*X-AQnFcL}Z`SOP?ry#Kua|98)M zZ}+^tGt=kmy0^NkZ{4<;f3_(sI%O2m}ITUp~N}FDSZl5)yAz)m5bB6s2Ai z0DvN^XzTPAi~#_SPVTPiGU8;qdirGW(*PJi1mFO605COob5_!j)&yQePD+Bz?ZxOX z|4Sa0ftM`-zyhtEmTu-R9Q?u#Uhd9+%dcM;$ISjO zgJJ%%>q`S)82>L@|AU$S!{#3>`j;&noh)8#{))YI0| z>xCCzn99M!(e{OZyfBWVrKuYLz@YpscegaRd11B}Msd|tmv~`806;*o{x>%JH+Hvt z_tH)Pka+9t?P_an<4#6rPEW?p$Hz-1Yw6`+>F&;~YHDt8>S{qI@z&AV)X5tF{&CEI zYXMk)eM|P@WGFiy6w1uO^5Xt~%73f;r`3NCfBW_y7Po5u(PtpM$$ypotM0$b-WCD? z@BNE!;{R1)z$zwu(@?(WRb%If9i#bRq|&hpox z|CIl$!9OkkYxuYQvHacNKYd3gX=!EZ;owg8*Qw@j9o~AllDRpXnp=`F|DQqpKd$(1 z&HA@?FsWNwS-M&}z3fW+CCY4_tY5m@$->s%_N^0{tZ`L0qo-6 z0L~j00AmIRfLu-jFxbcd#4z_o1NvvbDI#hEf6qLf*T?^e`xk!E|HtxwTY%$UR>5wz z)?|N+CDb*^%spH^|MJT@@pl0WAOYwA4nP2q0+aw9zzlEzJb(Zo3P=I+fC``q=mExn zIbZ`g0n4!MtEGumV^UYy`FjyMTSb!QfbMI=B#A z4Q>VZfhWLA;9c-J_#Og4kRf;watJeo7a{>sf#^f5Ag+)PkVr@>q!3aI>4c0x79hKj z3&|5##ITI8{IGJc zy0F%;Ua+CCsj#K6EwDqdOR$Hq4{&gBcyP3EJaDpbdT@4d@8P21a^ULVdg12a_Tlc~ z;o%A38R3QCRp3qG-Qh#wGvKS?Kf}+%AHx4YKt_0tz=0r*ppW2$5Qvb9P>JvfVIJWa z;TaJFks6U7Q3cTg(Hk)iu^6!vaR%`a@fisdi55u+NfXHqDF7)QsTOGnX%p!d85x-Z znGabF*%sL!IUTtkc@%jM`4I&Rg#kqZ#Sp~X@8Vi~nng!ZNv@En%w0X2EbVPJ&bTM>ebRYCo^d|Hf^a~6`3>pjx3{#8` z7+Dw{7%Ld}nAn)?m@1f#n9-P(m}8hHSnyahSW;LPSix9DSOZx5*br<=Yzb_0>>%u7 z>>=z!95@_W96202oG6?coN1hETr6BJTy5NUxLLS8xVv}|JQ_SXJO{iuyhglbyr)+r zuf$$izKVEN`)dBxcYGpzQG84MNc=kdCHyA>G6E?Adx8XlHi9ie7(xa@H9{}KT*4v3 z3nCmM0U~pvNTNofbz(3v1F<^sd*UMEN#c7FQW6;wXOaw(0g?++JW^3oJJMv*Po$@> zv0n?nwtb!a`t$2EGF&n-G6%ABvO%(Ia$<5>au4zX@@evC3R(&+ia?4wiY-bcN?uAU z%4EuZ%4@3ER7zC7R8>^#)QHr))Hc*<)Fag2X=rJ5Xu@dPXijMHY2|2rXsc*9=}_rJ z=v?Ru=@#kX=y~bw>2v638NdwO3^oi|3^R;iMku2#V-DjS6D$)SlM_=R(+V>Rvlz1{ za~1O*3m%IiOCU=d%M~jXt3GQ2>j>*_Hf}Ztwqmvob}V*z_CWSd_8Sfc4s(tyjzvyX zPHE1Mob8<7xEQ%CxpKKyxv{yGxWl;nxqm@;d($_NFGVf)2WnpC%WD{gpc zm6DV;m8q4Tl-pDQ6*-k8l`U0TRTtGRH8?d@wJfzGb#`@M^$`thjW-&V8V{P{nsJ&N zT69_-TK(GS+J@Q{+TV2~brN-Uby;=&bSLx(^=$Rp_2Kok^-J~d4WtZG3=R#s4MPo= zjcASD8I2he8ao*Gyg`3s`liVQ)KqXqO&mL% zu$=6j2H%ptefM_GnbA4adDn&CCB^01Rl&8?4diCz*6xn;@-Q{&LFW-Vxr%KGHrV?_u7Xzwh@Y_YLsf^Aqzc_yGD~_M!hH<;UQUhyF7D zC7xB6O`IK({XNGbXFgXnw>FO?FDmaT z-!^}>K&GIzkft!T2(HMp=%`q`c%+24q@t9tG^+GhnN!(rxqA6v1y4mqC2?h36}ZZy z>a^OhdbUQgroEQAwxABLE~*}=_ozQ>FlktBRA}sP;%%yJrf$w|!ET9c1+{v&Uboq_ z?Y8T+&vnRm^mht$wsf&{m35PMXZ7Ir#C<~g6#VJWXP?jaz0SQCeb#;Z{crj=26P7& z2h|3rhZKfJhoy%HM#M%wj|z=;kMWOnjPs7SO+Y7FC%GqErnskCrlHfVGdwfxvwX9i zbAof9=0)cF79-Rr||uHXLLMBftJmfdmP_1~-BZ$CIbJb#b;LGYvek@s=r zN$2VK+3P3#&-7pPzdC;_{NDWI_~*}`4Imf*zX${jc@dbu0tW{R3kQeza-)KWM?^zJ zLVWq6p`fE6zx?np(a|yS2yk(52}p^ENNK2OI5;Fg|Gyjf(+^-GK-R(K5D*0b#sony zL4O7T-j|0HILP03oqq}l41s}#gGWF_0s-I`)xRtMQ}<^bK!LodF(4Q(^{y|dY>wyv zicUA?ww!1+EbYeS7 zl#`~FFCL_YsEa4Nx>#HgS(IdRgi)4Y<%hhIE5>$)+9}W)lH-)fP>G8n2E~{9b9!(K z6CnB8Ts2dSB8}2z&Ns9tPVr(JJ2+F<+KAfOA~D9M&l5YsVIkB{mJl-JrN*cCtDdU^ z+Tz)=ga?xEqAH_HRm>=Dl?)|0eC@_$ePi4}(T9{t6h2t^r-l(0&CJS5~M@Ch( z4#Z{-UbAH$5zn<0ciyrbYU#$<7^5XBP-YsyAUr)Mb?3hSsaZoU>(xVIW4z~td*b-ey%kt0rN3@x?aeWz6jlY4Ek5ft|ZPv;WNpbDhP@P{6 zDxMW|AJCdpvsthqEc$bRIoN|8mXWrOw`bQLq6EaA-cC;6v74rK!Cw` z6MPOax3gH2<{&!*mtJ8-P`BEC@y~_u-CG1b?mz@?s401CFS8Pzg2kkj9XWO*#(4}A zR=8UGJXsIdPc`9D6&H-@l{X1la9}4P@BieFh=>}2bV#T2N7{@HY1p!2!NZEL1tCYl| zIyReSaRL_<%=>jbQmVdQi3}fu49=DvBG)j8A=?YM%30b`aIgxIoND15Q0taeC2t%} z22u@{f3f``S&itIVoHd|1_DJe1%i9Yve|`iX-=RtjRTHpX4{T(*yZxNeZ*4clb;Y7 zsEXMYA-{-sosFH3Ge{*z+2yRainfS;4W0VWtHB^EZj( z4aIWNP@)`MeN!=>HHYAQp!cN$!e}r3a5NS%2#%|SKA7H-=mZ95ebS}0K2e=g>CXHk zC&gEvnyRZ$W{bWpF7GJ$*7UTytu1je(Vg|}v^ij3Isj%%t0s~GUf4PcfQC=b_ z9mQmA4}*MWK&Z3_5`KMc=2=F)N6_u@;l;fET8Qq0<@(cO^N09lca^4_*^B$s{1X?q z>=lDM$BYA#I&QbFEPL#Q=cuxwsT(1+;DepnoA#B`2rJscf?*@@y9d-ftMymucz#|Z zcHw%OQK{=?(#GV1>;#>L9$qP=Vcrp+BaXv8>N5S>N2BG_n_T?2sv!PlodicC%)g^s zzp5PW(6sBU3ZeSFPO$z|;*mIa>+bXO)z5Q5ZIK#0LT$fO0cONqkP8_vABK0u{LZWiR11V zboKWA&36uO4OfSL4;5+BZo%6S_w1aX)wFUCG_1-w1RmYgWn%^pq0iDrtRK7Y?h14? z8lWhaI>nx;pK+HPPh+SZiGqx+ykCjbR4^ZNR-vtYUNJBTI@_~#*h%jcWcEJ(Xmb7C zYsj_w9j7qolMlux4z9q1Mf%7uxE_a}WxH=rti8TqeN7@?o^W44vMf~95tj;(=dM{# zFk)*{sI9D{Q7oU=AF0JAdiUDM$8(eG$3~6NsuR(NcP(iPd;?zN(%nx_VW^+U?VlQ! zJuV)TSqtM(?7!Msa%BH5bl1do3e}Vo9njXA9`Y#ejXAJ@P4jHSbq{NQ{McZy5!L$H ze&TL%`rYTD1hMsN;t6YM@mRp+BtEAIB$&WEl&7QHe|^~G#lC4G0T4)5vm zrxiQ;${wB0)GyO~ZZo$N(YM1Nr?*`S5yXia!Wmgk)O z0l0o4dwkHyv#ehA@b$!;NES%@I9Pd0>U&}1?%H~v$76l}{AohfU1<|*>AgZy3el~r zy^~w)bb0p?KW$R844XC1Q_isAsgs0vDrTI{()vJdC$4_79Gw>>aV5A1^>*rPC6S*` ze=H;R@#6vx>r9+g`tT3W5ky%3@Loct1}J6}Jw;=g)W)uyVH*X^~ZsX$eM>L2bM=XlQ0rd!n09zE<0>Hhfuyn%m9b!aiR8o3Cxfi(+K$}4 z;m6p$A=>_<59@K}I>mdN%eVQC*V#d-y{m92+WR(cOGamFT{9Zlzbl>7;=Yay5uFEi ziqQ4`9K6e#j#X(|y4)PQ{aEIbe6ZLF9kh~AUmtarAEmW6)R$8wRO26v-dd{goN0ZG zGqBRH`~#f7$!LWwZOJ@tJg`qgyy)N`CU)G=ezNm@yK&2P5P9b~=9B2C-}-Y)iX$fL zgH>Uc^i-FK>U5d*&U-Z>t!G>PQV%aj@s%3w{L`o$&XW(`YIQ8m)>6_*YngR@enD!T z=!c)}Tn@Jmj-B%Ceu`ba7JDpP&aRv8VpX`QlezNUP46^Lh~uw5KmGpfE0Z8ovO+z% z(s1&%`OM(t>vUw`8HrS(k7+HKreq10b6y9;IiF(ZFwaEz`ykS6#qh?mdrF{!)pLh<9GGOdltT$iOdny#UkO zx-#NK;}6O+SIUH!xu1`X{s63m8J8klhn4w4_)fY-xLZE=*bzo448>QQW%{f}BXZRn zWJ@XnZMkAoXK@CVH)v2JKjXvh+n;-jcXsDf^q6N)7N2=;ke;?okGIvTAAEna(3?ly zHtuGlZ)Q{Oe^yyDM^E`^W5ztt>A8Q}^y;b%4|GyB>Y{VV^q7suo$eN)e^O*MF@Bf3 zcb}``A)vu}x`Q{mQ~2>CbR5S9tM!W!mv>Kl#ii|a;z?sBpH|Glqox-MgSI810vc0u zPJ7pn>UW;EYxq(Td8}z6ir$>JgSj(l#JyH~n{VI36Q(E}^!&`Wd&-;eyzhx(y#8>d zU|U@TUAx$3J^%F?W?S7Qg0$$i)VSNv>$b)yKe^;xXYfYu)|0h0vd030mVSyV$;91R zju&#N;l3*a#>7C8M#`DZM)D1{c~r{$Hw7jE=)<>>a^IDj-XBeMKUQWwBzU@`H0jKx zg{&={&&~}tHPw+pncChYp!|+mb4DHRE0?0C^*Z^G@*w=0(k0@x%p<|Ze3=wyZiQAz z#{zTzgB3@|ToN8X$$Ka%(q;Ga3v78n8V6Us1&fMga z@@&Zi*R#ATkcz`(zHP8>?whpmb1m+x##L_J=~Jf7O0$Z+okZgu%`4JTZlUIc5Hm8uFdvL!NcDYXq<{FXfoi`=TrT8 zGVLM|;&jkA*wka2)R4QpllsY%;#bKKe?uw9_pehSqh@Fyl1a2O&q-f*#%Le1W_@?z z`vbhcoz5$>#4pz|SgThp+F8l)isbRkt~aM}tER>}#Vnz0D_1|%ct0X@`C0CWqavB3 zXJn@O6`|B)e3%3QI+;bGWZXXm_V73AS7G0wmidg8JEd} zsa?{Z>s`o#jYLhP0@_;FZ}g_R%M~|}@rn=?sHLG>cUH&2EN7l1%av}*ObJ}9!%tK1 z8`x`UOZ#n_h^^x;PCCAp^6gaJmEW~a-3u*AXrzBGBNY7c-7cC6(TG5i_bUhb7&$Ai zxUdd+PX}zS2vNoOgd=ye5JBrgrnAjV=g#~Mm*o}~*I?9GrE>#Y1lUSsP z2LbzjopROTTo=Pvv=oinQ}^2OR}J_PMlN*JCdLXYS&4Q(bxKSRR3=>Wcy3Ir9IQEy zR(qHy{mA=&wE8@7XNe>j%2m6)$;s^;sKl#X=&Wop(kOv44{8>=6cblh#`%y&8{=8I z&ef4$+@#jX5IMJ5)$kkGp?0=pWgNV})6^6SbLQ7-Pwp|uJ56_sc~$&0OmS~^@8e~^ zI31IgJh-&niACBRmX{i;EY|s@#j00KU0r^OJD@6JH6LXfN|zx6#V?uapw3@!Y?f(J z{kE#Nd33-3%#Ztc&G#Nm6UiR2!u@Iv+8;?8{g}1hZXms;T-VSf7{%92YF|c5dEIYMr$qeZ}%|tkp_O#?ou3I?v3hmJunwMbV3jg=@s%oFTSC8CM6H zT+c8|QnXsB2%`~9!)er@`t#j(D%SksDL1ZB@ZK6!ByMMy_-j3V+plruvKj6_fWa!f zwx{Pn`Ku`eEXP?>aX0Y`4S_vGIb}ZG_I+&)%IVgkNyYOj*FNTzF2O@XNM?S8R+L({ zK)M)T%6E=z8(g#Gtfnf$H2(8XP+SBJ{ zoFEc*k+)4ARSxMC<)x6|M7innV0wzFZOOMXdB?02c4X1mFX_Q;!})c_!L9m+4LnL*U2RQ2!hrsWCNN$=xE9LcgqIsgT^1 zqZGu*z*Q+34xVSHi%cyoTIbl0`YNeU3PqH&mz*0>%GPa`ckE}aKTpt_R&)`k8lf2G z7_Zl$59Dl7cfX;w4xu`&RTGylHF7`j#_LEz)Apm(o2;Vo9cH$$4&GF4m9CvAlb@t{ zxEk%ld*qIb$g$K{Z@A@8WB!sYdibPxoQ~dYobf6rbzx|Gj<<|D6s0TsqNe=m-nhM; znRLnCAh6nMx8j`NKX=H49adXdAgz>g@7FsxX)wB zLcSWSj?2Jx2Ks)8P)1`OW71_=Su!mvtyu)SChjLLZ!#2pW20#sd^JCCnwda@SXw$5 zZmXclhx>iJPLO}%fnh-LAdIe*ES+%%wu`P_x}I3Ssw=icH%mJ?ls>s+L%s_iZ7lKI z+5rorzU2hP7=&778ztvaSc{(h9tZ`jS5>Z z#o~C?@>5a#jscbwxrK5Fb9bQX$abenpk83PzfrqWX}x@~GT?ilIQRBms#|aZ%`d%T@LwX9bb@&sYO+m3k zbtxW-$}yoDRz6r`TVfN%dxfE_~YPR82U(4IJJ+dW6`U0OrbZ+Yh2zxh1{AKqK41@01o#~ z%(;eLm)V!PKeb1GEq{A8@pSoa+feXh>)@~!vAf+E2*p@xBC&|Xiwx=AZL6zhdB|yO zc-gXe^}@<$#!m@0E4S#UJvtHzbI+bmi?7fxQ46g0_Ns-7x|pis^R8lG%BDEqe_Drn zFRzqt!qS=GabL-kMaR!uP|F7PbAQRgSZ^s#Z=qTjtim3{>AFqre3NZ?eDF-P|E8|t zV({3hqJ{frMCK?}@v+s;U4p*3DOo(xZos2OGX4%$9x4SaG9AnV>6hN(>W88k)O67O zlA1&2-th?;5XBwM38R{!X@ zqBFXT2YJWc7d$kJ^bPDf?y?Hsh!!{LVw5BTV@+u43UwfSA=}C1JVudtyx9*G(oVBN zN&XP5s}3m6`WVYm=;=U5^R#yv`OIXG+)dKL(A>sS=Z1v*@0uw=&!NB|P3v~-;>94? zOj%;hdyekoR!n8@NalOnX*|;mBNS8}3+7?o$HN(UUM`0x!MFW+tMi8>ChxU7SwY(C zp6+K_moZXlk|k{3ck-IhaQU8L9c$sfQCGakN9YAop@Ulp*yox;N^5+(IAvk4^*c!NGxCg%0VQTb4j)+Gz+2p<5zl0plFFMR zNqwoaC|wT$v{WibQB%BGp`?v$cdby)t~kLKW?IC!BiO0d;ca+0_G)Nr{AnM*MnH~{j>@lL` z8WUeP_76&Mw6WcW5VRTHye@1}39x&9L+^2|qI`#zNk_bMLKA}{q|^1C;58@V-T1n< z@A%uc8_({Ew~NSUPq~U^^CX3&qGkMpIrWB#0sR;QnrJ$F$d1LD#0i%qD$CbxDHKm} zDfEx5UT2>=(HItfXE?I|_?7ZhHxOe}@hhPjd(V^qH&Pnr?l0P@rr-^JSY8WCQUm77 z(JzZwCLKz`yLRH?6-{C^)4Iw;b#VL4v#43Y!6DdISoxgt>6X-e()0|H=7}3}sQ&Q; z?7|MgdAvtx({;8L56y_EWp!0Kl1D}K1Kh(Va5YHH^LZ>VGDgMGrq}Ci*LeMIi?J1k z;(?Qulc97ZyfD?3>m(>}!o407Ms*y6iy5E%)2D0nYTxX9IbGPe;#AI4l=irdY&~*` z(vD|x^qnr1QX%P;!!j4_xXdwqn2EKM-NWZBy8?~`+x&DE9fF+HEYJ*M64WWD~p zU<^4$l;Cp9?Qv7T!MiPNmFH5D=34vSN6VHxcPPOHeya}GOcrwSo zsGEPjlYh1P9D^jj!REXXAEp^1-v-vCedE{&ZPSh17^gBlr%V&e&m5BYoQt17j)UKD zG&}mGB*m;!UJaCyhz&KEKs38NSh6@rh|dgEROU@ml9Wf@O3QiR_VO0|160R_#p}Tr zWD0wnUg*?5+|eGj2!A^|XKGkQxT+HwcQ8l}U6%MWyMd3rolhU;U3iBYS^u(6VC z;UsGXtYAvhadxH8c@X7$3)wL=UF78|1}FJT+ajb)`kKqK+#^*B3H`~`0?nfFsRziA zDDC8Z*$do0TtUGjlROz?CE)&Yl|D256$S1CCrQ9T_#VSICp9Izj* z5Lv^Bhh8r&r=U>iKscNN!OEjW2!X|l&e;G+;FP}G8D;_L*@u~s_qAmdhurM*< z;7|vrt6>l%MAL;!gX#%j7Uz@a0@>ICVTT>Ur!v&Y)Rh9?($rLUcr1lZLm@DTX!u3+ z$M7Vt=B1*efZR5*@J&1vL{mj-!T^SIrS6hr*Be0i=LTuK{OADQ5#sK(X1fOn#(2|X(_j7f@N{5D6gP=sGXCD$J9TG=cw z>1c7_AMKiHVRab78%Bl3H>N6yMHSh8kiL(7j&Mi?gUubl9f7724UZImo_mbSzzOg@|5Ir`sm4T zw|gGsTOYHP^PIL=dEXrykGAA1=G^_YcZzNY&ocwYAG**L>f^wIJMJ@NUn~e#`xLzg z1(n37hSBn;Oui(_q?7iz2wp*nAwu|=O}mKFWipJnN&6fKMqV_Y?27|Bd7Q!7>sb5TU#9(O2rk;zUG3`^kl2s zDg@hdwTY`zP>BYz=To!^UUO3l;Rm}M>-daNQ=jBUt#@KN->B$xXWrup`OSAD!Q5G8 zMMb!<-J-*;t=kkO5`5Dn6$8EL!prkz!#NE$FX!z^gR-?87vZEhqrWD%%6;DsfT2dy(bwN`{sYA zAsLr0izu3C;;<-q9^3}0lpIU6Lqr)QE%%UfV`K%hD}gjG6JbBIZ*iveU9w7c2Tj6n zXZOv>XLZIHmk`Ou^e|kW1#||X4d^)7=7b59Jid=A_>P9x>c*JULSy)ewC-y+oRG4f zTMyMI9f5cTO46~CNEv^Rd;8RmeDO@&k)urI-!&7T@aKa^$8x{g8 z@L|s|k&K-1y!jzDyLTlLyCUc>A|<#z(<%|hTf9J*Q4zp(BdQ!Z3vtQM2nGhS-z|ip zoxsv>-H-lgeJg2MFgowELHU|E&)M|SHSj60oNsNqzg!`8X|Y2vjga(gUXm~sZ-IO$ zrY%BAuvY`ij%%LS7R3UW!9~`kP+r|1N&<`<%0Y3NB@1L#U8p*P!{NnJx)Zn{5Xn*! zvG|ui__3%$zpWW2c@YT==((k=^M92;Cox=c96ab;e11)PC}`;CVK6=oZ+yb6T;Ss| z{j=Ei0joK;4uv~Eqj!udu^;$WLaydSWEbDFP<&X_&fJc>_#CBs!pl)q-9$=k1${yt zj@eHfTfDrLG~4bjK6I{Lf2v@N|AMg)z1L*iG=6q)X}4naS$mO3xzc!{QhS&AGHi)I z-?6fB%U0sE=IOl4cNpCre@c(6Dp`S6U6!S@txAS@*=_f;Ey-MejiTI^6_Y+4*TWel zO`O|lrG_T;?T;)`eAdV89XB2y`6-LRMOj*{9+G|(TCGBAbwyvQKHPd^5X$x#4+l+( z-!(~vQKs2mIp1Omhr2}SKMoZXbDW9QpQ+Bui%BNJ!oZoInYtte&qhy|6hZ#&E^8lk-oG%wO(`jIY-zyB2u5 zN9j%P{s55MYv$Zify4K4=#~64GsQKZ>i7;WiH@GWg+FFdJKZ<`OtSL*s?ZciofBJU zqOpHe{jSG*ixlS~>20I(yUh%ft8FxOmtUc;XIK1JaGqxJRR}uTX-{&o2V@hU687>) zs`lQ_;>CZX34SB}LH3(F$fu%7&_MS+T^wQKkx$UaL+Jq(RNJO(TmqJeUjIoC#Y!x1 z#dLnhc)`{*suPQT@eF4Y)J%DG^)bdsQ#xtY;%sxA6iK#Jmu2)?j(&X-iD>J?*3t1~ zn?Txfk7M#cIjF2F1faqudrcEWN<$*IZ$f^@MQjX3tT?eem{knubN~`4y2BsP-@WTm zGTI*N+GonY`>1#Gn}Gip#rifIAAyGq+gQFm6NcqDI!>DGl9r|JtPp>Hw-&YqGru>- zvOHZpaf1|F`RYxEF0&&8WnW>ku>no-(|!aNYFMxnTk=6AN1~tF;>KQ(OT3H!0h}Sl zO$Iw}=_0K%KRlHTBw0UO0Nh^(gkKB{^B9>~^uIYL0=Z>!!aXar7QHCMPP!Q9c^unQHZcW^u?u z`zd!aiXmn(CK{0?u?C`iq$9HuJx_8k{9<3BV&oyW(C;oh!}(jOAOfyf%s!%G?z=qukxr_-OybT z`}2=2+aYa?R@#oD2!~k>v&+#PV5#;s+?djjVfGeN$D<=eA%gk!6J1bV!@!CQo`yk6CNvtp9HNgLqTia+J{n0>j7RFHkoq=XbmR5I+sVcD)SUrp?N^B#drSA6ytP{@5drp& ze}K_sKS)bGx9x`D^vQsa2+))ebcMu2;^Rg(WmMG_qgZ`1!6!HobrFT{#TB~S*LvZ& zZixK3!`ty5J{1Z(otJ5Acyx?Zws6SN;5Q)5L+OzwB44$zVYJz0jW;|GOVaJD;9|dD zRT2I*mi!90q}FI-fkgK~a-J&vFi*DormE+JMxpSM+qX&CQg4`3rDgKEGfO7}mxQ~9 zdaBpiNN7o zhKn&FqD@4EYedcRPqNb=4xt+*V*;bf!&FGpMD%hIj$$dOLh(RUdtmS+h60eN7bF`G zMq-lVPi&VxU2?)y;g~98cyE;~ZGf8O*uX?fT%2AY-Xo50OYnI zXJsMC)x-;m>hdPXv2Ar6F3D;}H{O3ArEGc*_H(xjWExNnjNq!!K(x}MA;@&+t%9q% zDUfFqwC(m2 zsBD8%`W6tv6{tEH4X2cQz7;WhfX`lp0m?tAZCm2^qSaW+HCfB`(C}*${H_Cke)I|G zq63Ce79~5+6PQdt7M1n>&M`l=AMwsp<~`!qT5fd%kdiTQfapT`;@M{Z+WG?r zTs{XE=zclqO7OXv=k3io*c{`?X(;Di8KcK%stOEtPjxmR8iY5o+;QpU!#CI?R@`{k z%z}NwQnnQGTlPFxCPmUpy*l244XeN(@Q@a1xVX8478w;xanB??%FONX))d5}OJgLV zCIkY2sG}`f8+_DU)e39wPH|jTWsB!AzNZ&~QSz3_n}j7ciFD^tqD3MvW%E;A1|$x5 z2UuqSRBGaH;K*#y+~yh$sscTY92`y8{!*}BX>Q1S^T@tDTh*4>#Xd#J-(te`CSi!H z075}sFAy{>+&WWdsCTI2_$~KxHH=R7Ah+mnao$wNl7a)%AC7YpU7+^rbWYg+c3C(r z>)}&XOBFheD|*pp_Fi$KZEK*D0^}u)>E(#>d$yD9_Z@b8h)<)&Nn(au))9stWeGt1 z{TXKIWYGtbpcRkDBN64AKfs}g!`86-Ps?_0lv6qU)_75W5M9iN%q{*mue2o1X(jyu zlitxWG3#az&xM^aHXR>!^(=o9&*=z0@#SiaL>_qEscV;b9#CUiJpGr#MWpggteOV$ zdI#Bh<$Qi6D1d>b3QfEbN60PLGt|q4X5&t@*#!${3}(fzLKT3Z>H5`iuJ^Ewz-M(67pPJVmUl7 z<7dJRA+)b00ic&1z!Gq*sDkER$vs#T7;VVtT%ZAMwL7}JRZ^z+8#{Bng7T!1tTRCx zr)UNqF}$yKh!Jk`st+^_kO74H3TNh=k699vQs3O)S5)lj*8dd!Tg z=7EYC^YZ2{rFGn4wX^*kHXY56cQ33r7^6(;@9>7Pc8^s&<=Acij+6JMQC}c0(Ia?+ zp=RxA@Xq|6Q^#e1fakk0{OC8Fr{6OnH+nkjKSn48^K9&Eoq{a2h(4+^Tzm>zcF~e{ z+%7%KC5<8QjJ>`!lYM$7zdbIdChZz%moLP=LsQ9PC%l6gxl#)joY540>G@Q$Wo*?H zYLMMr`fV=7#+yd>NfZO3ON$NA>pKeRHGjWRvgpA_=(PdhY@q?l07#ZCUNJ!NQkfjr z=05aQ8byqsQ1d&Si?XH2kDPiT+xe7}Ff>ZwwMjMr(;pap2_^A(08HQy_yZOeB&?mh zC>ljgJk}W@+HpGfBRR;g3m$~u(iw@2O~>F*0_QL$2+={cO&>7%J$-1CyyMF!7CKdU ziKBa9K2Fzf|2!U0`Y{S_ETSaKDC9W`9Gi9bA9|S}$Vmy|O0R*|R;_PzNL%wnlEaF07}51>O+}7fg2kHkbzZwQA~gN zRDUu63>8xb$UtPH7?b{h*c=xK3W^7FV7yF*B7;F-_WlEWbo*`e6)Y&E3cwNoFVkC~ zp;cNPZ4AxrT`VU;ED$%mbm!C~LL1D@iuoIe3uz|mm0D?U8~JGw>NwXJ+%ciaNJrKJ z3$j}b2Yg3DnXG}6azrC_M^x?s^=Ii!nl^IVbn|UW#q#&bwvDKxKDMUq(z)V16wQ6y zohG(VyF1#O3#hdvZplPwjWWXJMlgJLLHQ#>{wM4+r6hpiPe?wxXi3d)zU!a@g=n$g1Qv@=wjr;M z2gcx#OPf^9s}Jm?6yK*80D1vyRLNfeHcBLHW!{4P-A25Cv|cR#Ubz5&Q4>H711nGy zZaxEkvIsM=IX)Syp@5|rVKjmu0aa2IN79S~hLbIxgN)L^2?Y~ilSHB*V?#g*@JFpi zi6KMqCjfu|5Oz2q31AkZrr-8L9OxZvFEuhH2?76)FB$J@7%w+;Fc=mA79If};U&TS zWkTOe#ych!IV?82m>LES83l*BX#$(LhD!h(E+waEK?4<+s+ntGVxNSYds5-t9=D{X zmWg@eHQqPspnj>BRCt7!6nT&c_V`L_iIQ|E)hQIhss*qxN zt;f_!;Bxnh;n2vJkHyh(pd_uJt#l%6qgr{;aeu=92NT-fnEC9)e5_)p_Q}SqMdO{P z>r9vmqhA^e!#2YfQMF9!FUB7}zQ3RfEP|~JBT2hW2cM~bo&6SZr8c`p#@KBFY7mlEIynkeR$M{-YW|d>N(Vz$SiATh&L0>pX=dRK7`@4^o zq0EPR|0$-r+PEPmx_GbwCX981)jtK3@|H4%D9%1u-UQNdp;zA$aKod zZ0Fo~f2vW*()g{cbT;!kCB-Saq6CG*{jk&W@>_FJKgzwg*APgF9^Y^&tsl;ieY;Ui z<#|w{G1N-=Pf5iMG1bL`dFC>*y-{@eFn9VU=80`qYl4*b3yb5W`z1j!@R=uRjL_Fr0?RPL`RuR%&N9coPs)zD=Fvt_+JZc z+OV6;r)e%>zBV@I=66+2Wow#cdtQBoS*@TVQM06~4mXLm%7SUU&%Q`bF!6SLpxd!? zKCbco>XFWr`&3HWl#KPNiF*e1nK-nN%+Y-wpRrCYa*KIs(52#BNU`U^9P_V zWigL>h@>p={H~)BV5Cf~>(#;K6z8WUYBK8RvWsoIZ%#yPHf1x$rPmz_C8>em%_}N5 zS}zU%efA+}&gl=}1=)1Sx$%<8$sGQD^KmTFtrls0~G4d0Bg_%T+fK?zk?g;16=BHR;jnrch^q8UuoKS?jHe zQ)YN|gIF9&(m5-k<-6`-*sb*20;m@u$OR_f=;O>=U8ksjjq7}6lz%0Z@Oysgb721! zd>M>NqI5&epyA83(n3pS-k6R&-EVX}vwC_4NnHA9v)CtedFy3={S@*KKW!y?ja?FY z$%=Rj985t^51*4h$>(Vo`|9W27&k2?QXXOdR<>n7<9g1{DQHfA@$ARV94YOs`cV=0 z!g=UHleQ4n+qS~D17%VQakal^zT}5@|DanlolE5rG{8-EVGm+aev9r*Gdz4@gE$4F zTWkF^*4z-&QDHtfNsdrvUJGWb_^^aSo_nwPo>?(w8j8@;FzDFAL+M;ty8RLeYSf{a z&E+OT8LMRuCTm686-D(!BZ)d!>aVG(LTqUvL>%`WEbmgPle$}CuWxk2Tq-ZFex1MM zdmAK)+f2X3>)1af6$z$^)nJma@3&v|n=TPXiW5 z+#4FE(L@2GwzW=%J;s$dS3}DO2@mQd<2v+IpF3>9n<&3(4Lg{sGdEK5@0@6FBjB~l zDtVKq<;ol!XPkDU6UTjKP+z-RGBY+}ZI+kot{7%rAEtH`(Rf4#FAMPKqPyn05WW5E zEFp__ydC0ew8D7k7rxlHgV-p2H4$*vDelYM3(cwgw0WcWy^4|P>s-UB*v1bA*U5=) z99AogpsXPeZ+3ymWs%6`u0DGe*#E`XTYyE?egC5}u@(j@}JP$C^e z58WYMf)bL_H8U{407G{V-65fLcjG^W!eefBxeI{U1>;S%<5Z;6O%7*uGbFMsS` z232YDSK>@W3S#i?vzGFGjgJzrjTP3v8dFb_ny=iKcGur#nl9Q*WzbV}j)|LhgYcL- z#uZcF82|i6YiH|+FWxG&jakeD3Qu6wQupdeAG?Tx}5I; z3+Jjn!uVV#Ha5fMvNz8Q>-_LlpL*$Q%2d_%K%DdsAn6?@P7@47dW+~R=u?z%M2$9x z_8b8{N5JZ-nohu&`u|YG^?)w%k0?H9bl%=G;qc}K~P^J!7h-R@P8`3eoQP*98F_D9iQ z&$};hjiXEpqGaE>rkei{iJ%p(^j#r&l`HaR`n(w9|1|$vlPAq(Y9Yeb^taC?<><0Y zNOMMUlgPJ)jhvp}FErm#%_pgUxr;S+qm15ytRVJv$C1_(g2vW8dhxrPa*7u2XS^mH4|Bq!s0b|!UW!f;7UWjz+$v_<>WQm%sF0%0 z#O{r23Ei8r<%%a(ZFeQr#gy@j6clxhir+#v1 zn$z=O&DRLvLjX}4SLy{pb=QQ>--;Gi=DN|V6ruO`pKG;rK$rG{!_${ewck=i_i5OCe>!1jV zcMC)m?y)L*!o}pOs!rdw7_a2MidM1cG%g|YCoqLS#k1~GI*ZH6N}^Q zc!Vt2j`fp`x{=zYBteoXZvL~~h?V@i0o}7SUYtZET1Z*58Hf}-j2Ye2aUvGR($SXo znK@5ZPvBjH(esIp|p>aApXHM9bbse?yOlz{ktOIybK_`G; z0Mm#B9@Hv`7inPfw4N?yHd3_uqw;SX=AHz;CLJY-0VN1n3O~w0+qw=cUxVj+tiF;| zPKDYc)sy4lo4DPKIQvt}3rS=HZXjBc;1X^ONqkm1g3*3oKN{Y(?sXwJIk%QYJ zu3*4=@=T!TTcgX?X#}kEKd{_h=rqt zxGy+Kt6$VcZZpN-OTG(5-BWXy;;m@fw_vzB3uNpqtam)>-qi2Z%spy+!*c(9e|K74oE6RfG{fgPgcKRU7tDC!g7dP3ESr_2c7T?mbVDVY4excxe<|-W36u-7IR=nLImxmTb!SG z@e}Xapj69T5?bRJq#HDL-&wFteEPCfrH^5Xi9 zDR6pBZL>oKE_bYEw_c0S+>&y6Wg*);_X9pYKB2@LJck6=s&bas*yx^FR0wP!c}&gm zY_QN|*Dvz5JrWGku|~iCP+n8ER!5w}C%h?da76JPhp~o9Z1LsQ>`*~p{Y1sy-aY{j zQ_-bA^CLNzd-I%GiIAsdf}gF&1+8__AWe6KUgCWRh#J1xXE+?L6@k?+N$|r5=%~c| zk(UZj$IJ|rJQYh3-?jlqoil;J<&vO>%P4Lc6Uf916utwX6n_JOV$V}YBBE6&7suT1ar0+R(Guvw3t@_27;I|>vWUje2<=z$A)wOcYi{L^!xs=t?MGQQRaJ<1~{EvZ~X&tEj_||(HraHVyfY8So}iW~Z<9ZB^ml+DcSKeyEQUjE=W@8MZKp8OqiH6^~c_Kd209WF5^ zKr;kPv0OX94A<7-AGpt5uhCbXS`ri6_BAkt?6HFMDKLI1wb!mJjTcsbx-R_;X?{}t zqmJP1c=X9&%9>z~&(Me9?4MgbZCpPzeBIb81qPrff*`~5GDJcUKr zwwGFmF(jfB6&%L>R;w4%M>_gVFWw72_K>hE^bLMWdG$M9jUF>oDqniygiuB~SckD> z=z{}@8l}YnQE7`y4Y!d#x5_d+tv=CuJ;C|GB4NEx+iJxhsy!Y3=-8`?M%7E`;5{Cw zD^2QZ+B#YB(gDQEJ(G3aDi$f8BxF|ZY_W_O9MKGZBZ%h0S4MnBA zjf55C8iGZEDE`5=xYga2BW-c5@h<$N*p#Nogz=#>Pdd^?k2eQ|y}d0uI*`j}$UREf zB9gBRB>WdgvAjA9eFS2K^+25c&9C4jd(8AuD3v$ZJ8k(Bn+c?~ww6XXzA?7p3GwTa{Aa}09&^6^#FuJiTJzRX~b~iGj-TznQL$g|H(4(5g zFlz9Df$v$?OA$bG{=5YkKXnYh;5#74)uQZrsBrg$>$g`*A zD}7mJ<_E_(?!hHa&AapfvnO)rCWgp8Y6O)oqAb4Z?7t7_`vPav%fUeQbz+$GkI!tc zggY3bFQ0h6^arF|MufbBCJ(e3(7RAoE(!j2C`Cl<<652iF(w}A%_8<@G6>wyaBzS7fP()ksSho?6; z#s&4Zi#O8pO74wmc-(%{20`Bvk>D}g_L^DMgE%wAwsqE0Tm zDVyq-=bJi5Z5_DIcC8~F&yWyFwe05Bqb4Pqb$zEV3Su5kDn?>d1YKTODA&C+4<4_x z*<~tJBQ~s20$beyEv*!|rV{dcQA+K6QJTHH5}Yx*tJ_Fw&D^1AMy*O00q^0+bbXX7^-}8yWH-@XP|4BD9pQm+NEnOM`7AzYLu?pJQ z7MRsl9-)Hx!@R0VycwbNfPpijd`rcG?R>v3)`j>Jxk?j@Jp;dkupp96*gj$J9OjU! zsTPd5CTzaNrxFVs@0kZ_b2uY38@fDr^ty_{`JaB*C+6Gzp8}~jOVEU|<~X%G)c@sY zzQ=}LJGDR5Epjw!-r6r;9cSpdRZ7*o;<(_2YHVlz(fFJkk7w6sr<5}8Mg13tK!2oU zs^^+bD8}cYTgn0PVK3OY0{jPS(U5E)S>b-vKDJC;ABqQM~{6t8AA}PLfm@FpyN9D*T(Mv?5tD(?3xz>@##8#x2_FtT# z!peI*OzMvZE=6498m}mvT|?n{@rq2(_;)db16x(P%%qO4dxt8Wa+(yk#j@R#MqWzt zb21Sz86JEk;d@ncJRJLfNF4E|rfk=Z`#v9|1YUy$wt4SBzqr3I-&~kS&onwk{KYZ2 zbJK+f6^x;we>iXMzPH8o30g!p{_<>*TCA!aDzg*Cq(7N@SA#KPJp*-?5u)^a=v&1B zJ%N~`@8sKd7+{PuJ*JV9{B~J&%o#R0X0b)qmc=otbYs%Q;6L5#>P+_L(DE{*#Q<+$ zs%sUUz*}T`FfN0Aanf|9vEB_`DJ={!M@LI~*s4OEt0MEq6=>qp^Xul#a-H+IDV>R- zs0Z|uRoi7bZvm6|WX=?U2I zW6n|HuU^{GWv@z$Unpst?zk-MkvHAeAdc13A-{s( z&1ltmI(c9CNk4IeIHLjM4!$;>TKZIK*t`lI?j_OMGUc5xE&qv!K4+StMI0wF?@tnh zC$8y=bhj@H%5z9@=IIL-)_IX&Heg9X{!#+rf8l2OOhj1TD#FbY2ox_4t`dtSkGvCe zLh!MfbF!lMi+wwcyryOJ1e`10%!!!o(BJ;?_7D`EqvCmAPgV4Lth&Ww$h%x}>erf{ z8TLY^Ix@$$ZB*t2e)F?<)-!bN7Q<1lT(R&=v)@k=8cV5EZn#A_7P+dy6yA{NAFkfM z!DmM>pDjXhO8burd29oRBX19MfhbGeTarV_Y@<*~$GjwTy-6?e+CNs#Bpz!(p!O(o z&NU+;VlWT@t+m_e7M%0wr;nR7ADdiuUX5F<@tq0p%dD;m-nq_}n$cVn4ZUeaaa-1u zrZE?Ut)(YGBa7*dLUspBz8(k8@s^S~T$H@)STc&8@#(w2RaxQ*`u9O_b-H%JM1)L6 z;I}bicTwwtNLY|AuR<9?6Pw-_{*%wDOAfQ9#hfc4ZtVvXR@LmG!@O{>-R177S8fq` zIT1Mu5$5tYI*v5kd|$O{Ib_}f?^XH`Rj@ul`>o~Uhmpqgm}g(#PAJ8+vb2$&^b7cK za|?FLDV{E9w%M?>7dKiUu9L-IJ=n2rlBp5XHkyJE3 zS%a1y(#5=K`MPFaLiH3s6T6Ei|-(IvyY@}nFY$YMnGY*6X z928#6w8wb?F0GpUNQFttWoICDAyYwhzxI>SkxSkzX3pk!KXSHHLPpR%)Js%}>~ zx7cUDeYw#ddCGg0gdP9Yvfy-4TQ?=P3kDHD6j5LhQ9@d69~^m-iN8k#=@+v6gT*Ne z&LOrL5g2f7d8VbAz_G$6&=QJc0iE|d(v?=BJnB%|d;)KweW%mWo2^1o0q@z5L;u;w%3Ve zHPzMbmCqb>`HM5$5Z$`d+wp{ubTIcG^y4m%)Z;k@^exf4*T5m<$&Ot7*glM`YiJon zWl+k>#v-EypM@wdFBnM}k_(8XaThVrQsPmrS;0jZI4r{Qw*(MN0dbzhv(F0uH|uUl?{($p2EEQX_0nQynpmIAGC?LYsv zQ*yc+{S`N&Wtj?bP1S)D~VdUqp5~BTn1J@IQ9&CVFN2v?nsSn(yQy)Gt26qMS zy4@GpK6~u!14))C*&=sLM%OGDXJl9!gvic<4z5M-V+_*Ak3Vq@pG7=#Y+CnL-4o+` z6u@G{vYg5?v%gdIJEahwVLY;Yk3LzJu|@y<=Nd^2%Q7-m{gnyq>DGN+Kzb)whRvps zy18GJWN=`q)A!tdK+=B+oxxQB<16=IO32T4yUth3yyD-{k9wHA((Jr2d=U&M_7B6j zME*!*Brxh`f^Xi(ZSe&ke&#u#rI2BAc^=`u|MsKZr^Pvxaif=d;!lmyWNVh_d@DzT zW_^=`na5hrZ-dmo3C5e4qfkK^+ISZ6A@#6^r!CKIcs{rDo058I-n-Wluu5p37j;9I z(sy;_+P;~ndw+}OLU-+S%_QBVrHyG3)BYBTR*LGn!||!vcD@Tr$zx(NlJDM(BYAr7 z_Aid$haK9-ac^VkX!=WA(ytKenwG=r_zK@Kd(HuqRI?7ksd#Po^0vQ@zVx6u#buxq z>W*CM;Xim8_3;Tyr|~!OcMmZ4Nlxvwf)ROnK@|F{_m^AkUUyl{pKkx7>Xf6vk`dQQ z$HL2!?Hjo;npRJEBl+I32<-w9*u5HSox2#uV!1Nb(_(G9hexU)zm9h5=aA@~AteN$5dF5bXgvj+H zL*el=xfEM^rAU8!3+s#8idykWEINI7wb2&7OD0H9qSP@ne>&3$MeLFZ%sTmIs}c7Z@@^)qfZ zBM<>t{5w4SgkR{Lx#*&(_q+;X?C1en#J2)ee7}Tyh^W{fkJC(VdeumdujJ25{-1+*&7P76=Zz!qbgrbl1Ih zj&#p~LVuaeazVf%RDU$e29&08C3}H{sqN^jVz9z!ixk`UbSqu7w*Kar@qbR&oEyh8 zpy?x5<{pLCMJMsUWLMph9tt}@Rxv9aRk2vujFc^7N=`{WdEH|Kqx?-l2T)_rc);r; zv-A6w6{9>^^l0r^>VO>hg(GrZSg|(!tYuRM#&lX; zln&v9zX9(dLA#UX#WcP%g}4FSrFX4XU_4?loqK4ZsOc|G?}*F8aVvs63#|gPv-8q# z6*6l22He{w#BxwLU&8mJZh^kd)Z=IheTzy?=U{Ath}T! z->ym1xb8&kMO_T&IhPf^wj@VOkX}eTDo4BBEM@J(z0J0qR!)0V6GSQ{ZfH<^;5%x# zni%25vw4}{v&-w1o@kmWCFlF`Tm?z^sG{hy=&*^tt-4?w)%@q$5FIag_`n28U`4B{ z_;eOZ3v#SdoqX(^NCF86K$!RI?8qrgj15{@cDl{-st5T@&|LN5?BUsvG|X zRuOs=r6)7!mw-e&0^hwqVmKm47t6|@H*KK#Ve%~lr!kDSJwNi-^pt*%>rNkAnBxNl zwr#pSr=om#NT;i4(v)Hh=O236Bw}!1%s2}xw5?VBDuG0l8v@ZsUQ;SLq! zXHs!+mFnT7R15Upsi1Kr<_yli@7YG}x2uaXCCaf;HbE)hm^z-6AId^LkEoY1=J-=B)2U8+BuLL#d-`v11f1O`$s8wLR{aCD za+%}}Z&D>_-HI(?KI_pYg1Kf4<;PMt3BaWC`Nd+D?`7)tfwI>hOf5D>HcC5+WxABO zH1`RX_L8Y121-Z?rAd!5;4Jv33OM+`y8c#zA1K+!C zk)!3ZeAOfqPDtW?^n8q!{2oRlZ7ZZ$vA8)uLs$&OQd#S8-8dW7l;=6VxwibWwL@Z8_h&^x=Mw)L z$FROoCu*EnSbY9elfV4A;K+NWl(p7a@ws+S&Cs_c-c%TLCGBl={!$Ga1dapU!Kwe*e084wwT?C$UVyn!dnX2^~N9^E!CZ#%hPttf{7eyHJx; z>qL-Q)9;bC#j+T}w!ktl-QBW9%1|7*2#E9!#DTEQ|G38K3ct5=m-9peQ)9?7CnDM& z+d#s+m+Fy!$M{-RcqUby<<2;!zv({txzlTpw0_dKm3pFZ0whfTfe?#lybgoinP^x0 z!hyOx#8Ge$T2nc@uU44exvE3f(DB5KKdf*5i;XR|{u{>+MC)W7>FM0mRclJI0vq(u z{Eqq3=F%C9c*j&!Ec@9GeM$PbOJj;^)vvmWbovwcmG z%6OZgIzgB(V#}uCr*vbagYOVI&aLdg)?0l4ojR)pELL@GN9gJ~`bds+@2x}3uSEH6 zh(2;Lau6S`+d&ruS@48kZ``il5>c7Gy=eEV%o1{5nBcbF)J=xG9#kzYj8ECGW_A!3 z@6n2C5w-QNTB0UWF`oD^S}@^t zVpBzhUxSqoIU7Z?qe=7?ea~AtHZ2V%^P2*HUGw;>@`o-Bm-f&!Q*v5jzGwQpUx!J z`jQ3SeKx@FC+4K1V?_7Rk`!M-1MUH<`im3KYe7kr!e-P630!+orGVTsP|DL4W5Fur zn)@EF)$FMVIf!0UL=Q;M`A6zKI6KDYk#o4|OBuU*b@q>eb8s$Q?Uk$zC`I$13afuA zFzIR)Qcf-ci;-n(DA?;#bKjNz;)b}Zq?aY9a=ZEyIS=jNb4U~I?bta?v_-j;)2d)b zH!!5;Z|?Eb02GXH&=j}=gIy6 zcWdj`Hbk)%;A;OZ0fRB%S7(D9TAr^je8g9-&4-+PpAkyY?amrLf*ueLy7g#v@Z5_Q z`0mhs)=)r~sO$8E>)3_vdw=KbueJap`6Gz4T})uLE3w`c&pY|+j83yv8KmugrK`cd z?%fB*!>j7t##SMto7Ys|hXfXcp!~wRL;7o1%2nPU+zS(FxGFWa@lmzy_yx}w3r5Id zB(VWivj*1lQaw}c%&P=3La~%KrK9)Ta-z8PDP$UMK-@ZJ@lAEVP(F-Z_SthE62)8t zC**!HKy?`1J&MCw#!o|r(5SPnl!=Z7`~MUvkdv<`q4pPm9Qr>t2ZS?lRG>mF8jBQT zgJ$hjWB;c(jXqLI;q~G$Xadh~8Io1nr%bj1VZG>mFWHMij!*+Bg9fA|k>UM+8d`Rq ztYX?3hBK_C1p#nAZ{yVxE3vF z*z@q3)BjyrY~7pU!QXt%rnO;xnS271$g6Htsm?7gXZj5I&nB0V$9xSY*!#GrbhYj; z=X>I-*%Cr|0ItMn{L@4sd65jp%nMaLOg3_1Qyv|SDU9ieCO)Y)jS2oDf8IAoKQW#m zL_KZ4nwy<#!tfU-?{!V`GOvVRNOO92VQT719HM<9a;M)ArkKS;R%repgO;|NH;O*v z*pgFO1(sJC``IVuW&b|Ot<{*P2(^zNxIkmZKBIk}RxRfFK=tF8gqq;8Xq~D)zLX-t z=&1f}AEnuo(CwAgoZ;`~vcElOeawmKFo~_u%K}L{0#*Zm0l=L3Qlh6v`*}c=C7AKGC1^; zR2vdirBBRcWz(IHsyd|2JlM0-eEmWh=NrYR4F|G$YPSon6oz`0K#EDB#!7j<{i$F! zA-vY0TBZ;DVQ4$H>VX|0^etEZgZB(wA+iJQuyP&kOC8$fe zPTf5gqg|DvBB+ucw?BPLXAfHI9ZCLIBPx5yA90HOg!zJ+HSd8F?op+acp$ZArTsa= z`#kbXEJm1v9IGI{*C_gFYo{(;bLL|)9R$YV!F&6j7p4)6ooFJedq*XE%Mg=cEgJwY zXkSeYy`RXq8j=jnn8d0wtSUt(x-ve#+*F0CnueE)NXqHaBisz7@aBbukRvASyDR`+ z2c6OUBUhix%ABV$@2Bl-_4SypbjFhCllCI zn9(Jv?PBZasu9M*o+3$r9wkBE!?~F>w!woDtCT(y7f2(mdHVyF9P99YVXRPyw^=~; zqM`LgV<|8acHEnGwb7=evGXE-SQ9gVLyDXOj4JLkBLT9bzT&%b7eFyPE4JbrdZcS-Lf6=sJS$?XJ%Wo7VgC6&hesi?vJbKR}v>kL~xXAl1$4=x8!bY;UvCKT}ZY(tw1 zkA2weLiq}U;f0Zvw16g$&V63=ywX&?k-f3l;L4$}QEBouw`#nQNK~?Gu@8|BkLmX{ zTzW?96)OpREjiK}OuSru@L!yc;(gT2d0FDGi({PgQbK$qS-29{;r6h~h_}DO@AJcN>!@ZKA*Q%GC+x z{>2fODjWOFihx1Z+8s`boU}v?NuJw~Y~A#FTB{RfFxmcgSiYn6u!G0h5tB$`?<+}& z`5q{S3XbWp>%lps4<;=3@-fkVoewO6`m32U!dNwNcJT~SBUrJY<$~ZqQA3IMB+!aD z`Z(4S0}?mAzE1l0RDU;hrWy;YHMCw3*i7;9BISqDO^W56!jJTKlV&RZZ5b4pDfV?f zf>SlW(m(vSvRBP|P;ih_qC$L3P;;ioo&_e#`(IlQVC$*On9i_{M<(-6#^r3#pCi5G z{;~7yFjiTl2v)jEDGv%N=_qne5hL*M2Mcd1#3v=QPq&Y>T*g8YKd@P`g|x^S$d%ZS zzOtYkENrL~p9E|@Kr?zQgggYCQRnLQp9=lk$XVbCFZt{S1@nrn{safa3wF^To;it? z`}8S;U*2Eu@q#dB?jvobZ&>G_bNwC(lr7rtdv*to%PvB)S*^M7ZJa-(wGVd; z2#2^(19=3~)JQVc7BV{@Yc5-DaD@Boi&nENS2n#^+gnW>pR$?u!keTY#EB%+D! zf^U6S>q38a?;TT*uU__=jt@tKrFiuU3CCwP$wbR$zF=$<)x)xky*cO$vGb^h=8lZn^{%vYD`4CTC*Ztycz z|KgaSHs&pt1zql2j9r*uRV<)-uk>i?U)dX0&`o=H<07zJ^9Ghb6+5 z-y|S-Y0|B81DS7AW%AzeJ5kl|=?ucUn_o9bTLwN~D79XE?;P@tll_(1rAS0Om=Aw^ zv9_e7L$3n@$l^B0mvq zkKan7-<%+VjE4j0YDE7+TsOX%nf=gtL?@WdvBgDO3*ra?Kp`mL-=P9btUKtdZX&Ik zczWBx`gbct{=x6KXD>|X%(6w#J>=SYs7+K{e#7X5jKxrK6A>jD7<+c^66q`gP%cMp z2LDUwv3*Z`->^OaP1L5N)}r+d=>Y=cnrr)z$Xg}25!pz!_VI<2UP0wCTx$IdxfNko zj;~rE8<14oc0$x-pKyD(H0MB$bXWSp%xk-dH$%&#CPT!IQv~NMw4D=~e2Pz(ZSXH} z8C-E!hJmGT3c{<7NBhvf7N$R6{UE9;i?+K@pqqo^E=%&g2LcHJ*OEOJAV#@2_k}&oP{l>oXm>M< z4$YCOSM+I~9g@+3#Ucl^BD_YV%vgK9z>pv9^^#cP8O<^H_!hG-`+}h0V{UU6_LYx4 zB;qXOF1@SduEg`cgoJb-<-1aiw8%SKaSbCQhNm#_8rKCrwhxy_3{Pm|m|!$A$rtb= z%*%v8xhkC(MjGm!ERS9)D>qsr3GM9Wnit)Ric)5TRA4YO3EC%xTMTvnT95f<$wn+T zV?fE$vqB2+Gdp$5vmY6gwDzl#@#uV`m zyH(>#IWwyR8)>@Ci|_%^gFXBb5bilMSr)*W+SR${LBbKOBE_zw0TW-*bJB%{=07_} z41LzeM&vtR%R#E0UUpud6OkNp?&g{)#0`jqtl)b&HZi>IT+$qWb&pCR;>t-^+HxTX zw=_;eORgjcH-JZssy29pAQIcTf^TYW_30>NQHMV7qo!=H)g7Po^!lXN89TflLc-Fu z>8+Rjl2jkYn?D^M@_Qm#oHB~3KZ@2i8|;>QEhhd57;Ih5m%KkB#EG2aLT2BGdGl`9 zQ!JL4k`|f9ecfWxCJH`Cbk}*Am7lfeJYbJ&-vJ(fv+i);#O1V@Fu(Q8cpLN5^Qmi1 z=klR!I~Vf>x}T2*dni4LmEj?JW%h1Htf&@D4?}W~Hh{r$MKF_8a<{;u!r-wFFGLC!Q!^Q8)Y!RK0T=&>|+I%Dp7+z`T+?AC{j#rd~;T<`m|{a8yble6CDCZOMb1 z&lkCUnJ4vw4b|n?pG@-^R8?p=r?bpP>Xq!5!wX-j8hAwqflLdnt$gkIB|o=1`mAdW zzg1zOA`k_Fm4~RQAfe)o_5S{%7-iM=U!@rBG4=ZLY*Bj_ z`OT}ZBj4@qcwEVdxKvn38{HJ14^||UYqEm}x=^`G=Ue`Ml< z%u7*V4By4v@Fy;#V}M=NeEpo3PSb@tNVaoAz-wdo(7&-0f}~qXS58j&S(w zZlzB%;=d>VAJzY>&;RcUd|(kATSJ+%ix1r7fAs{0=H}iF4o)8`dllF`K!gimLl^%! z{6&Q4O>QE>zJhV_%F^Xs=8g;`?`n9E{DlYfQG`cN`YH#*d5ydv;_?bU(f|JnZ^ z^}w)rKI0{kf#b62^q5yVhx*P;jEW0y?T03~x`uzd$?LdK0_avc@ZB)+L+HM*wOK%J^3n9 zBseK&uz+l$I!{TOHF#9%6;qTLDTf7YvC>ADms5YqfZ|V^V%Wtf{ky zFpSmnWBn2S&RQyYTC3NoYIRPKX9ZE{Z$A_0j9}O&b>(v9{*W)Vr z$C@8HXeM=nyzVqLsBfr{-)kZhdD^v%v6NJV4_R^E1`OKFpuULUOwL|pKM-Q>8lF4O zzU(|!?J&S=O^l%V?Ul^j6^>w~ma^+mpnUJ*(7m2tVF(*@614RmWPhDVfa{mzrcG3> zS6}?>$M_?vcS4W0kzG8DcmsjuPguMl>yE}S`8)m7Xp)S8QZJR6HGy+lUYOQS-mNfS zd`17}#?uRiz3gAhZU`1F^}$VBz#L<^mEHkMDYfN0s2l!x3nM#$|HbJ6yzhM*YMbV_ zir-du=!OSU;b|yjTj06m^Xu&93j;Ozi7k>ISatq}q}#IyOtgbz&kl`#UvaXs;G_3G za^&lk8j&m`kAykOQ;Xf5pA)>6Qh2dC{J@1ybVB>e>fA2jc!f5CsUt?9bIzz&Jq~rLMpl5Lb!m z`mBu%1>8(VJUKAdbl~~!TIx@uOFsHy;_F`=vJ1ZSBERM1P{6+Z+S9tF zkTT)z!1k7{f5yFDNN$9j9E$^{PVQ#}p|z*^;Kw<;ub-Zm+SGLby3U1{RK3%Ml#cQa zQ}Flbutd7H@M|p@AF4*RZW_`uP_##r_*Vtkay7PSZ+pxR7;wcsgb-LSMR8qg2hAsE7 zm6@l8tCcom>Jy)e`B^QvkE$c!7h*yUX``i&Q_0+ZRn~jHjQ_6QIdpNz_sv~b>_~;< zCg~!ldU(SRo`2gzy;%7$c|%^0w$Fa1+L`bBh;~TX+bDhnEZ0GGTWqd!ZH?d0Jn{m_ zqyfZ8Ie)0FOBCk*gquAuwSJvwiZ`%!@Av(Z&WVAZhQzB-HgGU}RZ}H~`FFs|?HO$j zTC8l(QP=Gz=P%Ai$Zo5lws~FoopBfGr-J&xuK!!>i z>YY!T;ztT}uv|W9k){R=<aH7b>KF+ds{;yd>PmHYx~TEnyV0g; z#Z|^wh$jyjC_7eOe%7FJ_UKnu>4@OVO_rEPz)ZGbpBT0b%gW_-4xN;kExz<9Jka|1 zIgucSS-uMjAm~WEkA|$M>g5syFA-J8J`72hz4qI2zC!`AA^q635Onmk;wUI@} zJ7~*-#nNaXUZI5;Uc5OEdS-^rjwS2z(9GNh0Mc7V*K%2T|A*oI#kq;*ywP0f@i7mw zzln&gRXcg}_3dI_+=$`@J-Ty6V*{yX-v8M<6YaLM) zhs1y*EV^e#!+KNZRZ)8=`1kaG=hg^OF zg~BM4r&d$YGhAghM!1?ddU>2ZsMxVf$;#N(7C@0w9+4)VN-Z0{*swRceO9c*$+;lk zN)Pbg`M)^(60GjfMH?N$&()F5?~$r2SAk0AlofAxMAXgn`gJW$H?BLQHjV4aR||y zw~sGdl%Py)_V{nhrxYyEM+fK(BE>DRmmQc|F?A9@dAjBmAQj5(D1U~Ivf_1Z>F&<+ zGm3G;U-TXCqus*fV)s$Mh+OvZk}{C@G`oYUFs{YgRU4TVYF%f7{*1r`!{-VWt2rd_T3 z49oUT;#QB;Uw-UfymaV8g_i3?@;7K$r@mDWLG;@-G&pn-owyT^<`;NtJ=**-5JHne z|7^xiX4ERX>#_HA2(?VuV5r2G(`v78R>tk!7j??)bh_7~r}o~4Jyr_u=I;;7F7zx* zfM=l|_C&{K^x_!k(`&Nby6cF%xZ^u;8AjFfTG1}1OV7iCnQN-I5i9t&x4T%w# zmyH;UA(aW*|BI~mfNG+P+J#kG=n#695_<1VL_&Zh5PI*uN$*AAC4^oRdX><-^d^Y( zj`S`9f&wBUf(VN5&3nJQ?!WH(GkeWS*3MaTCYhPD&wlpvoW2oc+)Dc!`N!PVLutQu zmJ7OFCZxuml2G%CXlbD+dHTx7k6JeBJ;Gs~l6~@9)~qEa-St}0#)ROBL1R49_d373 z4J_N83r*^ktyy2}3I{0vN}@k2DJ3BZWl{!}^AAbUN5V2z-;4|xEUWXomlBR!8#{>a z&6vJ;>XBQhpe7;4t$w;aePkQ#(!^^0H`8%0kZ@c{|sg=d;<(87e3$H8!JOBj) z!)OI<1}3S0>G5=et;oyvAx&L3{+2~e(e^Kok-z^Q!7AL7R(sLC&4IbWjlF9uioemR zU8QW+EWDI4%>gr!j@?atGtl^_Ei`3Dj2wv?BIES>7?Ry@`$a+&$fkPD+WvZU zKUU15b&!ghXH{W`^9^+BE2NI^ofVB4YWy(N6$nCfuC2c7cKJqtU=z`D3@A%`sT)7b z=obWQy);@`oZ*ou%|U1BCs2@a&W%LINqTuF_4FPCHwlk^74wQP#kD*Gx6|B&cwjcl_M*&jZPI zU+xe(Hd1`wFPvW(`TTm`abuR!13D>JB+|sk{bX{lHB2uK7w<|Vb(_u{=M4UQoR1b- zJ8k?LEIQV7bXbJYZ1B>54)K?1BHv+0lpJ;HYJvgYjm}bdUZh2S$(ubta~YEw0*%lL zi%{l`3)_asuHBci)kyHE*{gY7{o%c!N6AQPWARlD$8~##)X89*O;2_~s5|!%by7)q zotcx8nguvWNjoTfnis-768FpN%QjA>D7=1g#YvIAYxAE8Sw2cRPyRXS%=N+-VOlJf z$eZDvZhnVA^xLhj1I(o*`wnBsA5$r$hWeFuT7E$a4XN$RFW>rVD4D^mMutiR2;njLmq;wCV-GP5;UEFqu$et-{8V-_Kq&dBhmUHIp+iMfp06A2~Z zq~1$iWM>l&Pk-R*&(2`xH}~Ma{FZaxIm%+a??dB9r%&%#My%5+Jqh=koVI4oKBT10 zEsh80(Vp-Idq=z*7=1Mj8Vx^h*P4$g8k9ca5hZvR#vR4g-r4J?)c<0Q&$(d6#eFq^ z(J>XcFuu*ldVkV3y|({+m*~L(Rm6xmk-S{o96Dk~O{>Jd#g?PnoY$@#^Fu%*)ncgN*gho!S^$HeoZH0$NMwGW11){W66O5clNKF zJui_MfsgGr>s_}SNEKRJsbb=YDHaOuz-4aLVXMVK;K|i-YImXT{&4!dwwV)ax`N|#Wr|gY&~@HV7BI|sT^MMr92R-lk4cI8)d0D zMkMdaH>YTB6@dGx#|+kG=`9UdeY#nSK6}-!Aevs}@33BKHA1&b&sA|F@nbs{6A{-r z&q7VRi12&ILQG+%LVjH{B!PDbd9b7GT#s&@XTcX0OQi4CcSP@wm48jI|0evW;D*EV zi_Ej*Pl3K2Upnp2CqSWH=j6LDweVaXXW6ofsObBWzq@kpP&OUsNMYv-x|T2ad@A4` z82Zn3RE7~CQ>}EaZ|-DK89C5Y<;X?*YJ|hvRrKfe;8`K}ec9~S)hv}A!CbiOJ6%ND z>ciCs#a=Tmv*+b^a6}-jAB;0HMJ6;>y=~^UZfo94SbTVR$Y|k<>`_^_R5XQPxZ*?K zpXNQ=al^tax>2|9HJh9RLu;{V$OxGYk@K71D}l2w5{ln${QE$#+m+DF|A!z+aR0D} zyJOPU1)i_{s7R^h{b{6Cw!u_gTD-!D2I2nX_bX;4N|~lHp$htx#)nGpNO^U2c}1IF z>udj3RP8um>8GWV+1Vg5`#_u4-)6rN^7(XA20eR9*vESsWZlZX9Dr7tQY_3I$V)j9 z{v)#Lp>`%oZ&Y2WsORSJ{5^t~y1q*(s@_@HqW1mVmh%d9pPhX2IB&Yw=CWRd1FT;S+db|FD_(F8Gn{-cNd|BdLvqWk|d zTw?5hzDsoR|Grh;dqlW=$3XES9l?gTG*g9R^$0!H&OuJ$geXXP@(3_3CKo0+6~$bu z0^!{MUH;Z~PvYHtlvsVaBZTXi=7xV}OQVWiK(1th$m;4n+eBI4pr~ynoUu+=_NJ)8RAs0T;B1{uJai(#ezAWKPBFheOp-Z$r6w6l zxKU4|o~Ch8_65jW07mh-EA_LDuJvgCV$j(i3Y=J9Jn7VjGk;swci&r(F(a{_Bc4!Ro*a#~E(}sR93I|S| zlqJ-4zhK`@F{^kYkc^~Hm1m42qSyG|B=OJlz`GlE27Eov0rO*F22G*_e>pX*5Pj8N zotUHS-n(YMJywMHyFc!CBr!ZGxs9KhjQ*NIN;O6}KfXU5k(7Un-G$Snc8u!-VjG6P z;a0&|7NdAia%mumF`?yuR&UTZ#oiSuc#FQGS}>PBRKekAn|FMrRqR+}gI5N~p?=MWAUwUS=nn+-w8FTOW(J@RM0|RB-lF*I=XoLsf z7W8r6U8UYtxydh_4{<@xl8$vZ#N{Rjv3%0SH)Vy2lbeVzylQLp{`;N73AmBZ_ zxVaMBfQ7e$to?SwKRd*-2duNIsz*i^(uXlB7r?R$J591+&k_UOKyA+MRev{^9p59L zEN!D-QIyC33?xShj|kiDqa7k1XZ2nBq{XYKHt2LBPj%h-&XlHBejWSJT9vTyEca;f z>~A*(foc7-&IAmE+M$PS)Hb!fWttT6O!Ftb8W9zB;kE!)uhnBpm1x_{uSXyLknh|O zwN33*cf&2|PHYMh)tA=Z6=|+3maCiTzk19|;`h4+H;zDZ_U>3UwpJ#0BUa*;*TlAy z3P*oxdi8_XzmZf{uI4msoNrX#(*nhz9DMa{u5$xP;8L-Z907*sMNy^`4jxWu zE$A<^1ge@=4@#y8gX&OJs`!D7u3TrY*{>6=d)I%_&y)Tgr{j~lr)hjD>ky6p8<&wB zwb%Ev>X&P8$PczLuajHgb0hbuefhR(41gns+9PU$4d&G6`9_$FU=)=&PLrW%l_n-8 z`)uR$BW!b#zwZ5hdr^ zZtAk1Dii>L&KFthoQl>tX!oEfajouri=noYTjme{tVYcSKOtsuX!vMaP?Xklqn!S@ z0{_1g0EE)m{bs-5pGlUFN;r6V&TQy&oL&b?D5Xcs&|Ay(mgk$F!4UwSC}dt$J!>oP zPdB6l62S4_j@zEAEe2mWk8xN%Pqc&C15jIQTA&g7EG}60*=Kbpczrf|n$jRXrUg8T zGQ^k3UJBR;yuTpw5 z4#*oq#Ob;0!`J57ymc*e7gX*cG@A2HZN7)(A>XOS6mzW8=+B;^ILtw+@jg2AlSKw? zuVa`6g2B|eBm7PMnFAmBUvrg~3cehVb(L-N*Ro0>NPf^K0QblJbxr~`&aBxwy29{W zSmbEFVx1M*CMp`!R=X_O->{+8RsMsee6eR`OuXH75&ibE`CV*FU3QK`4R^o(iJ)L* zlwDyx&x_Q`+~IwBcEm<%*Tr`J5q)h3c+$-x6*|u;B3`88*Ld*38b$j%ERhF`C%`0B ze5o1AoY^d0oGlPTA|3r>@!^xS=EGb=hHtHUdC}ryScmV10|aa~3phc-9Mnt!Jv2-> zX{Bq?%QEo8gQUBF=ZaMb*;VKJZl-*CwN)GE$wUSvbQTgh3b1k zQ18t(0HC^dSlRCxg`U!Xf8)cc0aouvuBBP4(zXV^<}hxc-%MQ5_RhE!SU~s4T!wHo z^fC@TLZE{=km4TRm0H~?glwC1<2yCYj-dDzn6V{Sw3w^{omoC_Z?wZ-8h`)SuS?^L zcB!FXmP3;5OkMmyx_-hYjmdQ$RLD@Gjh=AHPHy!gd(a67qBix@#@Yc>7m&QmJ84WA z8q;!kp{36P1-F}7r0PgHadr$*ns^iLYYBC=zC25v2v$tn%uM_wzVfLh_g4}eZ7w8{ z)Goy~$u$3(xU9q_WcV@mzdM9FMN1lm(aWZo>iR*wPA~5686im_Y*Ucz2cp2AuJ(59 zcafI9BLFp|-Q;n`f$5SiMX%_q$>}H4T?2huyE)5gxK%DnVi}p`M_D^X&X@CTEGW=NqE~`j){wkN$18`VRS9V(`c`zd; zD;?m4WTNooBOZ!fkP`0U_LNyP%Q=hB^E4+V1ohK>fCJQFKze*Au%%iCq{WU;tggsH z90vi?AKpmySYF*e3Ieq^o=%?1u6UX4Xa2>>qeT=UEB7vn(~mY{1(T$Dnsu<>%usp3 z^3>{eRK2=;zG!|SgA_T&A{}9kP>&~Ob5-09@Yqb*_l0WAuDl;*_AC}4hxFAC)?DU9 zKL!mD7dWBDYSlc`z(Y$Y^;3oz%Mc9Jto@TvJNR*(aPAXd4){0>_!v)bnj}R|!)M+m>4`DrOEEnG$fh%$XQ6- z_a-mWpYzt&)qI9Yc}jbHzeSFqS%Ip?z6JF5)7%f#-jIl_PJ1G(p3W4VSJ+w%DI})~ z2QyCdxV?WbtgBxQO~8hr%}}t)3VS^ZBJyckCEAr#YFD)g63s`uH4a7TM85q4@fXbqswRi48Rue zy{~4(4crUc_<)wAWyw|hi8)nPCy_muaEdFg5Tj~z(#s}!P5I0{cq3@vJemJ!G`qE4 zUB?&%A(I4rGA&!uieo({8xxZk&^v-w!pss4iYH4u%)$*NrT`_xv~4`iG|vP5JEG zyEVKyTmrGhahOvR{FGIl#v3JB^XLm#aND)$Rv@GKZWzgYdS}eIN3gRo zx1YsZ*)Ymd&*ZlsZ}9XCT=C4M-iRlKzsbj%98!!fRuhOrQ<t7dRg$3Z_%QMK#)<1Q-NDL{`p(X3X*A3<487b zau@Eo>Bu(|8+aW#EZQX1Ylh;GG{S|im!8xfs`;@}?&Ka^&BvC* zlGFNxf7v%j)A30h^7F%(S-6g7*!Fxlxg^5vzahbm34L$ljnKkRpmzS;_)j47_|n70 z+*|Cqq$~Ut!h$25k_~&@odl{yL*=@>A!&yAp4@;jjQmR}8tp`@)|qJkti}`Ke;?#; z3hxdCyG@Xd-0d5}UxeoX*tu%-#5SmeL&KHWbsThnLHwB8BVy4bAlaDmH){d4+9=lFg1-q@?^P9NvK7PWaac4Cv&Ot zFzStt`s(cEJ8PD~{6jD+;FY|?vvfgmA?!AO;G@t&MjMoR@+}Fc{%hb6O&19AV|9)24QfTsYT1)okhgIk-X0QfAMf4^ZjCMR+>t4b%~nDu7`z;P6Lb@FWer- zqh>A?Q%LBZY@zlMQS!DA=vApC)vQ7bqMv)8bZ}$6Ij0pF8 zqWK6sCBc~26b^};W15dl(Xxp>j*5Rrvv0&l?nlD2e*!n7@UIzw@h^++7`_8k*L$d= zO)p|>MkR{hShaCW(_|HYuR)xjQJga%Na30o_H~Ad6 z2A^)&nh$I*sOP~6_T1GCBqHMO5r*QOh>?Hej6a>C_HvA0c6-fc|Z2uQH>^K4x%QpCo`OMQCW z;}-FRKq*Q`C#gTnEqT*r5=~=6Pt?m^@pcc3XLZ~xQ?bqNn@ZKmfyND$h7=#O^6scJ zqRmn{Qt4~obBU)qvdaaiy(2rgd~xU&q+MAQB8!hdWsNpR9UwPjs6Z>KGoK2NKmO*W zLj(`moK&ZJOxu$G;+oqfJg)PI@2l9%+q25~>is80Im%HmtTuj>k~gv-jK~GGdCO_8 zG{XJ*R!Ba??Vf%SEYJ=ye@gU~le<-gY?m?v8HXC@ZZX#(B624ugddOYd3)S3#>-ek zT#-A|+@?{0KaPmG5e%;vE(i?bq<8SLPT`I5BFq9?P%m6@IA`XR?WF;1H+XPof}~n% znR_fPL?eBP5pOpZ#DEJcoXXvJlHUc2=r@t-;n;RDweTN8&+>dYFwW`ksF0IHy%-$Yy+~l0_WLev> z-mFx^57%cKQ3zUx^f(srqPzW_{z9TE%^g zd;-a=BgQQ{i6lHCQ^lu}&egc+<`nIH+nOj#^KA{=mNX_Kw5Wfr?n;mucEz4_QZ0qK zfpHX-XF`h;>$po*V@T~{EV%-ys-fI?$h5umTAsUu{O;V`oXD51};1S8a9Nx!d8_!wn;Urk5}p-XGDDFtrL|kXfmK zBYq%j5+y{Cyvw<9)T2L9_h%e|Km-bS&5f_~2Cy(KQR6%&U0tE1%7YG(uXOP#X6)jl zFdQ-ui=PmgxiW&-E@Mp9t~kzFCy)%JW_|kl=b?hF)-ZSbW3n|IslV6LLc$(>s#UU&wK+eg7SgJt- z?*0vFAWWVfL@bS<;lXl=`!E7cDD|*5l@nwysD@{mA|%{i%v`vIm=hn^+{B~4?Z13` zWGyot8^CmoG4omLqj~%lz)Ov#J25icD<{8kWV4rPRsCUp5*xeKzm5#c1?FzFTofN?k4{8fe=}uJi~I;#;=*6k#uA*skXM z@s9KIg=9n+`MZ8xrBuLi&5oP=w6NgeCL1NKZtWzGp$yo?u0}YQ8oqXzRk~1nOAsgz zECseW(8PNvw@${)FhZbqLB|Oq;BwoJu46}dg@)lv{uudohu}-nu*n@@*N&Z57Z!Tz zomos0aBVmwC6q-+_A|W%Oo)a3bT->s68BlHaWY=15#zjJCzz>vGKoPWq55c4g}kCO zX3U(wQ+uq+--VeN&V~6La3O3G@VD`X&gZRv(%5i?@&w^p1_9K`ZCFImQ&1)GZlA!^ zI-~q)wx{1Y(Ib7?vcXd#T-|TvMe^Ti%^h4WStqhX$AjEM`?34ud&Y@^eAi3|*FhB}+?mlI*ceru8HVB5fij=W+V7#+-C6N^I;< z*!X`dVmLU6b9 zZc{zkgBBNJ%0FYL**30S+N_!7$O6Cn-U>?DUH{>AyU5&`{)%)VtnQTA!Ke$V9y4C) zSQA#aR6CGVOnJPZk%Y0521o`aPlCBGT{r3Q5uaQB6?0ueQVzdf82ejguC0_UF|NXj;_#;enP+dN-nOjK3kLa-|+wbCwv z4|oW9d46c{>-;?S@3HZ#T)o0PSvH+lK}^(6LxLtQkzx^Wl2QRD4&r`6phb>{NnL%? zA^)k1u7OUMWlu_$k)T0^%;t&*3qE1f+NhZ2!8K5;%(R32tToz$NeZ~Kw5UnS<6U5lvG_7 zg1Kh1jS)9(%#&KxReeL~+^J6+fQHkldrf80`3RI7*MW7u4`c`y6qP%#(ACtDe)vNN zf)4fjNsJ7y#8sGx11AqWs%_F<> z>U1Tcb5*PA%;HZXW@3BE|J3OXXiP|W#EOHgs_K>U*lJuT1&UhbB{Bs*=3O9%ns%Ab zf6Bb~eI9%vrOH}D^g~th-9N)L9&=dUU2y2qoxnbgztdb3q1i}Zg8*ZDehXzFEitpA zr5;?9W@kn9;shn_GT%N8><_I!H+3Io3U{{8AgI$iDvgO7s3<+c~Z{ zuHtX!Zq_YgeQb6E&-A1?`}}q>$@N z1d^AGr}0n+jO3wq5@9W4S(PNr z!hNNJ_X8L^n(3LDU+ctU-YJF35?)qy&o|&H_wM;r?xTL5n>I7Gpj{ipCPG!N{d9Iy z)(HV&Va5s&k+*4m;rT#rFk8u=x@x`*(@yFp7;&2W#&4{jGrr)S0eXq7%^WzF2c_&n zp&N~>BK0QgWKEU^k4i?MdHjbVuSF|)Dw~ab3ji^XY_uWm=*HSo8#VL@vlqp|P-j^< zuTX8}b9>%hK=i`0YP5YNd|y8IQ^ilwfg{VBf5)j@e%zM36CWj;zVa8H80+qx z>ta%p!A)WE>nD9G9}9u6aWP5(f1gC=Fa1z7SU-hPFr+||={X1ckwPYD+# zgGrwWLEhQtR%QBGt%zvp;3dn=BjS>OY_HQ)Es|(?Yr9Clg?!B$T+B>J<`I64d8>*4Bdw}Qe*l! zWwtodZ9G+uP+{2aj80o3b_e>@G`eqA_3qTlhY{c66q@Ie5hmDOKU!UaSD=u_QiGO$ zfPv6im*|QRbK$dJ#b_&%=P#2R& z0vgUX8SuAK`DzQSDCsp7ln5ndLqe4#AcLH2e-gIS^rjnc81CE8bvyaj)r~jQsor7f zi47F6*Y?q)q<QUmH&holV#^| zoq@NQgy)aAIZv2%UY39T>Fk@UG2K)bL@S_|l2RB=Y9-Wj!jvSx))3of*ApOl-3YuF zq~7_+9hFtnSk#bdQOz}6u_$Ad-&HqVVXV(O%p%nqLiPl}Y-8l@(!lJ=r7}sC+t)4Y zIEn6uPjw7$yd%D%Wy?AYStcu47!W-$p7e)1g+XTc@#6Fck~cMsiKjp>jF!7!R>J0Lj8;qXr809~RyXEN2+v2BMA@BzWDSzITkXt2W0avL z>RB>8BM3xtwu- zcC){qH{;EYv;~8Yx)+g)Ww0qjKO~Q~X7VzNE;-Y?Ku3)x7@d<|$TA7>e=rEsX*{9_ zRrkFFK@(azTqeP3bZQ>+4Z>|WqAv)Q^m0MwVYn79e9X-(_ghPD^W{wuG(u-^Xo)%h z0ah5Nb8I^bhB)tIH!7Q@Vt9^lSRsO!#Q-}pb@cX{$>3~9j%C)zp68!{8*sCRvj zCgMoZvYF;ou9fW`zYWNJpI#-i<6&}hia4Bh=3h`H2g8P;B+VzqG`;Qq(ke^@P(+=a z@M&uwR}b$h#LFx)%{QZCzmVk2o$yD}mw94oKI&AJKe*fwSy33>(S{CZtF&I}?3&{X z9QweK@t5FQ$8}=mpwnJnSNl+;XAL3eyuIo&)qX;l(k7=eKfW&jY@)9o{1RMSc9rTr zdGniQmD)^U=yW`#+Xf75+{n8hUM^Y9aJ;Y0AwCPs|$IS#|``OeG0 zr%d|zaVNL9>eOmc%8I8Q<^nQqcT&fcm24FgD37x{$79_lI>r(Vi|4k>vMj($5Giw1 zL^#ypDdm)a?V9WIlCs-&*=#Xr?V77r#&a(c-ewM!d)GIlq0hBdot^BCUvNi36Nx7R z*VTVXeB)X452VY_)2dhOSCqrBlfKJ0V+?p{v#yGz(NY?ImR{L`6Qp-=Qhf@$_`tnx zOBOayS1DsUHFnPVnjZWOv0q57CiuK*?Mm#g%ZQRPf&CT}@U_Wx(-gHx_N~5@Xk3K{ zsw~hnOL_ap@>%{!l^MbVbV)BaL6>&#f#`!o87FHAJ}ps+Ih@AN8X3&eJQ#-g4y;lER74B^Bd%GBHZS zWS{um9x=CD8?4_>|Cf29T(G#dzSaZlU8y!jl8-)lt5w@ezDQ0>b1YIF))C}S%%>xm z;mM{6BX0vu9LpPnO8q$-(}$frOeJs+UEw^$PLQk-9Z`U7YlxWvVwDEqNQElYyVAj{iO=8&7ZOR*_Eq_)C4qWF>Wr72r&m54s%K=mz8e z{;+uS_&)=gBTnv~&fGoyefM*u=;I<`bQir``F3KS?eV?mN3 zZ2}uamG_802c}DmC+hSIrYe-zevH^pa3YLH2;;kJxEzAys-3OCpSJ7#r>GB685adAV)s5Vzu+% zo-999dydcUX^RX!`|{CHqau*tjZjIi^2i}s+t>8@0kt`qK87V? ze50Om#xv0#HxSsI+~yIUlSaaxvKlqGk=8w)8i1q*piWpZXE0K*G}Qu1P0cP2 zOR8qi0@$$0YRGsRYm*|~G*;{;ItQzo;qwb1sbEMjcRo;VJR&-kHrNgqN)+;Y9SUk& zHTjuboW+^iYhfwiDSy>rQt-?wwX?IGEh4a$=e8@s(}1E~L^9k>-&MU~@}yM_4i+9RR%>=>Kd5`l-iq^}-R&#(3h|RWc#6d0Xn( zb9D-s_W3^kAZ#%UFf@C72&K7A(h1MviCA`;m++J7sh7 z`g7=CmV7I&Xd|H?Ji9(Bi!%Ll5CH?Q z<$MS8UQqyS_oh?2-Knb8o(GQ6HCU%lsKdH&xrq9uHsVl93@17nv9}ybUF1&qp}`h` zK9zaTT02}0JQZtM_|5FxXh>9hZweWw*4uBI@<@`8c$uES4h_{%LS4&!*N_g^HZUDa zyH(js7;Uf(6Ji>@q^0@A2dfAuTGO2lG|89?Iy|S3G_G>qYm4 z`L6ktHZPg?;LzK@d{RsMV*f>&+)1`AktIp&gNASHcf*|@#p8yCSWPS?5WQsqjJ0#jt6-{EjkYf z7MukjI$fSvBSWJz5Z#hRq6YZoD1W?6!HA%`T%BMXNf2r#@&@Z9os}s@753*%`6ilS z8Mb4F->ax7P!p%vozV+!%yOSP&R_V-XFfk1a~TcNwb0Bwz^ zheZyL+`_ObUm0fe^>R5QSow>WmHw2YmKQcL&$)X4;6(5bz<=BA6`hWNm)UNpyKm*4 zbQ8!IV+a#g-l(80(`nh1SYvwc&-Q+t^;~<=P$`^`nm};{!J`96Xo7WK>%VY4%hBu>!1VMAqBIWd#HJ2gl~JO^WP8DsW>dhJ&=Y8*#48-SW?;du)MZ^ zOMv|=Xdsz6BBpb?exqoV8WJb8^4Qa40EUp9BcoINKvia(xOypIB#Qi4nRY2XJJqRA zm1H?4pZ;(>YPLonZnHxZwhRIuaWU-+jH`9A$ZTxS7CYsk1`sz%=p<*IqaYzU5C&H+ ztp&n`!7CV>$~v?=s7=G)D6>M{Y|U<@F?pTm6pA5S80Jmt6F%lATqsUog*LuN7`J>% z;KP4^G>w^2KjU(|%C&lC($!F(lnz%bf-}!L9v}HMWznbQl74TJGwAcfS3P9YJ9=19?gkl!ds%- z=x8Z8kkI|*N@BlLXAlfZ&^dmu%lA+cy{myGC%lwJx;;qIEn) z@h4*}{(+eimZ71V-Y*qvT{_*{xOOdv@!8&}jhFcA zmW}WAtAZWkd~zkHlG=K+-2~y!Q%F}sb)-&;QVyNXIeJs!Ry^Fl9F8<02N_zFSgY@; zqXx;VZPzZa4tO+PK{GghYyYKo{|V=H<(e8Z(5pXln69YyPg0$(gOW2%O~%APuiv2E1_vkl&!22w!7A~UUr>2>#gPsPKJja_RQ`hHNTb{(-KhSCU4^O zs=uAV%ChGaokY!&6k@b;WKX2|zXqvy3-8;bA9RJX7r=dsjgyMq)zSbKFy%7nh+yJ; z81Q=kyQ65udD3G6=bX=I#X3dMvqXQCn8D`b@`pYW=EuJnfj{v-yuIy$GyLHfHSSW1JbQ&7 zQ(j;3B(s6W51z$DsLExWTEM_vubDeKjg;RK;R3gr(nYpYxf!6Mrl<+gC3+bMmt3z? zgTPH37mve1ppf>5L-;4BHfHEz=0k*uj4{VPV>0}?eti*MVZHT)-z_Iuk;*J~P}m$1xmE7@KsXlxF&upD2WS+ADP*ekY< zBn`|_~Ogz&&bV(o9QQJOarlphBhkfPiad@N9g?;jH?;6bW!WaXwmLU-GuB+RK z=g96(WFO)5+(R!x7kje7uLLGBXX@tWo|qgaRck=HAcwXPvdQV$lNpV%0K#i?H6uhQ z7aiL6pn@g|RAK&}HYiPoHuqeB5xAQS$R zxfYwhQN_(Z1{Lh^ts)*BMWB^3--Jt^3SF+OUnOHib1D$TmBM-jB(#{tWrK><=6MfJ z=_%vYzlH)YjVB|MyP3T^fp&>Hy_PXNY;!&LDZq+~U`UhWwz-g9&3hTzQlt9Q4}Fex zWBBvsp5{%X-s$OMz?Y7Yk3DjNZ*p-gb5o~v9gx)Ti;uml#m6U{`sjz+r`Y-))I>Lbxjqq}!t^CED0(BjYXVHsDuMvsgs@#piwcLJvd z4d1+{&vJ_3A~`<^cZyMVnY0Hv=Y?@ruYu}_`zS^Vn( zs1Evml0CK5Ra#bVzLMs4mW9ZpNn#Oat2F*=oA?XWxw97$Klz7vbL@F5#QhCmg7s4` z+3(Z3w!OLsE57#;F?9R9wa9F#U78MS^?rRzDj)k6h(_7Fr6rORC@d2pfe{F047L|33B56 z`#Ltjk7lCBs9~siFH@e&?!su|FKfi-9+yW$(&u_V(e^j7{A5sp?HjysHQLeYi_tJf zxeX*xy)Y?FNuPzh8H`x!5UE?_;~R66;Ifwf!{FIQWpms{%R@4GE28{JQ4y!vNnAS8 z#%}u{akBJ8baU<&)@IuioY@COJDe!Amwv8{{TxX8(aqYJZ-DkMcrzFgtRl|}40=!a z&M7>q{rHG@@lt8Tf2PY=HAA>`?v~+cwRy>gDCb)XE|YG7iofD}r&&r&mX}Y3bTubj zoR1@R^TJ$85>&CnCT@f0^r?5gn*mhVl6Msp@J_>Rg}F>ksFz*eGQS;E3U_1`EMvh7 z&ljJsUSwQxW2+!~FJpxBaF-q7fRFHdu_2OYLE!OC8E(G9-~8LYTC!8Y>#gT%40BQ< z;aY-yTokSHUDgK1Q&!)0QRE0s9d=l~>|eqS`c&c|nC;!5LHo3&@QsVc$Xnknz;XjW zdXQfR_&3g_Oa2R-p^o|O0A;{RC(|3b@n7Mox_CJ4nI+1~$533}p99t=ub&pa-F&Wh zr+SrPLhmm1g=h`GNC=f@k-0)KJF{>j-_M(TyrQ_cbVzoP+0YKUHb_dA`S*c=gC}PW zLe08>ECKtX>-*y_5iUu0C0VRQQvtctiUf_mk-DQM@{Ao@7tS4h%re4xtR`mzaE9g~ z&xWIjk?gU$EdEIbRjMs&3kmqjgeld%8vi~Blgma`k4hSI=qMO8daB?nljJ(<%k!<| zz*zM(Mw1OG-)4F71n-NOm4wTvk(@6YGq-adOY^A~Zl_oBESqiDQN)*QrE+2x?)6r* zLmhO%jLQp|Ijc*O%QSw|6h)r3B4vWr8Zc|DRGdmVJ4zX_ptelpBBr+MF!-r@iwvn6 z=Da3=E~KH5QU8e%M~GM$=@gYgEu{CI@ajASA<(9B3}*v<r_mqmJxLV*XEvY5tH z(S(7=_7j3l)<|ijz4U|2Mqp-{bsN#1uqKsIkD$ubfWW?5L zDJcf}Fxmi%YWEc17aE@UB~mcyQnGouXVN0@Da`h(tuE|@0+lE^MvX#K$b)qulVFPu zH512hRbbH6<1R=NJ+pnPNU6CagSw+>OhvS!xrw^$QlGOfL#=viTrDA#Sh z%Kl~Qqn(3RKekyeC|^AJ5m`ABM0$Z4REfIWIV;_NQB(dA>JbZ)kZ!Imm?JA?4_e$q z!{xiA^ouRD-7%mg- zi!+#qGU+8UyAOp+j7}WMBnPV(<&8M64AX^dZB(aXM$N&Qs+y@h3_I?SLq#+y&BXZ|Ra)75ACb8*Snf%8zPXxIX&PuHr6puD(CpgaoTN=Eb!|&fi6o~~g-gu& z6A^#P7{X2GHaM3;0u(t=%DVHpEO}dt(>6K1VHrCuzD7`FiI&=!Tq`d_-1^igJ4n-M zr$(GHwPW>W6i+UL8Hx%nMdaze<3;va^m7>$7gZbBCYapvmKo7j<`Jm&Qqdm2OsOe$ z7}0gjCW)xh{F=v_gM*a33I+|D4=C>c048;^O2NHvtmKI@f_ALbcScZNDmvyCXmP22 zl5|-INh6=p1!U$Dd_-L}RXpK_+4o7NRPzwSC63tg5M|4_1eAsC=rU&tLfU2_5t^5; zCn=<b5I5^gZABd6L|=EtSFY@@h-f`4dMhZBvKrRGOO9{FPJ=>Tvl#G>>7T%~@-j_^tlPGR-KF{x^=A@< zwnf}VN%D^Isz-s8x>jwQUQgZS7`Coxqap)%wL|gh&zriFKll~f<1kILiF#Dr= zZ%x^|H)ibJo3nOr&Dpy*X6)aa^L}s5`Mo!$^xlr)G(|G>1 z3q(eQMubL$MubL$MubL$MuqEG9(6@<9Z8usB#vFBY;yQjbq-qDf?pp)R;2rl0RuOdqE#l6n=jK_z~p zV1Y;{@~+VcC>TDTDtnPPsw@jI@d7l5gDeN|Osmnn zQMMqnDL~VCNT5xrOLv$J+O2vPyu%l8&pi!+bg5_!Q(?OjE81zV*lceT0dyx}i?OT< z>5+ZqvoeW9u8QN|{{R42qRyo{W>pZn&a=6vc-luvL84pO#;;a3ZEi0G*E2ldxf6_Ew z5ha3qpD|U@@91i6o;dXTQzZLaON#zqAs_C9V%z75{@MhF{@m3 zx-&ZhXXFMid4`9dGQOX1%NDrp4)}vWu9J$|)h59CMHxuCdrc3*V8lgkKJ#5Eg}O&_ zcj<0emm1~{cQT1twR%?6fHarV<{5-A=ft5iz8PTEh}R7tthu-rHR@Gccj#LXAjH682GYCA&+vy!+)MX5UsS7Jjtd~Sl$k4wnw45&Jh7*t z;XTl&bM}Lsrmlpcw4=EzlrmJZTm@<)&|<)O=k4ezk~HY}gT9zcm?azxa?6aTw6d-p z78~MMDa2BldrB9U4j|zGdK#6&e84(W!z+UqX@HoQ7&yCw)LkW7ge)AcfvYL))ubI4 zs~)4P+jbZ|0$oarYqBR?MWUvQQL3??&?xDAz-G~^_LtJ$Wh%4t90l@Rwx+;Yz*VdY z=_71~`~8q&#{2ZV)UWZHt8Qap#*2O>YPbNX&k!1Q5u+As!E>1(AuOlpE3W-9E#->l zHK0dPxml*s^?I$aDTbvD9?`b~rIBlE4rC2|fe|C9qsZne%p0Ge%CF)T483l>VbN+0 z-nGy=Iq}fwwbI6;?E=&pFG)xnhpLWoEYiVk2j=rBZ=p-1M~LUf^7}DO+VM0Xou4%0 zE?r@mDCqC6h{K>XYIg_7OYiZ{-{qJ8095im*DLB)sBGF z%4Kq#45C+wTuRS(p;Eu>j=6utjSn)Lsi7((Z>-Y}CVDfpL=7Q)<*FxAwO|HAEm)nA z#K1xWVHDmOZiw3RIF=Bnt>$0)biCgY3)GbqXZ3@nj$vfm&|EV2Hw>Uc8@}_Y(K@z%Z=(UAHcC1uX)ugPYv8ccHO+tf$YxQ`5 z8vbGe#d+cZUW|0HoJ{%`Vo@%)`oVIqXr<15Dh+eQ7Tmyxd@rNTLHrbBsJBzynyd$D zc+yvQ%qqHDcBi!e01^gmLx_%U4y#$$68F!A?;b(z0_j`~MWTL@lo;_L=%QL~{Pgbl z`6qYB6&M4^!BNJjy8`hRpx>canAe%z4}YYt$@`daz5M`Y+ES}&h7BiY;Q%rVD($DJ zLA*z>Jap|9ek&%3*S*SMYD+kdx^%xqMNl2I>0iS}cl&xmj;vUtLKcEUjdAhRAS&P! zcZ6bp>M;P>_=~i;R&-ZDfo`<0uW4yar;do4jKATh4agPf zVUjzMSMyP#$N3_GW#N=h7?+CLI?W7qZQ@aL?>Rh0%7 zH`6f~`Ug^G0;iars+U_!>ZpgH>B3)m`r=nH8XsEYp1#&+s6$_hd5R?|vsNqTNOOsv zb>=a(;(x^7yj{=8KWR{=JCwMETYk8gUmg(`fR6dOa@@;K{)OnI^DOF7Dq31!Sk}D* z_`)p4<;ov`i@e0N(g*N|Qzd2ei$xONWyR=GlKa$1!aeRSLZJ^_kZz7omwsdF!|zSHj<`}!MT_AeiTHkIF}5hxe2KJ&1rDRRkhhp7?8t1h2u zQp;(hR$W$T(CQssBK}jM93Hz13b)DcKFGO!CMWKX^Nhu)kS-ka7P26cwuQzj6zJVUPsjV8gH zU7mzASgfP8&4&$C6)(X9eHC6Mc<8SmNlwucoKDp3O29QF$4{Au2keGOSMM$=3-ia@1rFWz zlJD8+PtwW!F@;9A`}PE8bv{`ruTD&5*onALC4T@TnNS}{#N_lXbxxo>KpF>er$Kdr z{2~YlIrHpIMuR$Z9>eBdtflJjBBRAdQaS(rqjX-CORRh}Ki8Q5n8m2>!-a`+~k2C7`Z5Pr>#Hn_oLZ zXumM>N(HnX@e-uC2cTDpUbT2S^x{{EN!aPFmMiPpIrhGjgJq9sKBwGh`JAO~di5jb zDnWs0Sh|;=rQhY*`?XxcD@ipLpRDE{4b8bFsQab##7J3NDA@&~2J|%cl`2%E!E%wL zul#k|QN*HoKN6QIca}g3C>) zf|zQe)0^1sEgoU8@zB(d0gn$525Z?KUD?0MRgd>RkWu*{`UT0q!2m#!wfe<!mR2L8^a`Q~-!FnEZQ{>E2viKQ z1r}-fSgFnhsHZgfzPFifzS^C?!G7}3zAxHU!PvO%SG>2Oc7Csxf)`S^G!A!N*aBP} z#cJQ2{o&LXarlq9NoUMb(>ME+kB0o#eRD<*--Hk=S+FPMpL+>^6$Iej^i9A&TF6p_ zOCT8JJ}ELQPQm*}n;c=6R?FQK-yUW%%g}_P;tIzc^Y5JdslRaH zI>aGI`A0e(1W*{RX!@bF{gw7+pmIm#WA75t8C@%)lsHsv@$&FR$X+Mwq1gZlfh(et zksUSZM5{%K-182j`<5+e^KMvKbN3ko`MdYAp~BRD*=@ONz{|(=p(oXg^q# z+8P{oJj?*1kKG9(jnDBK;i%g2$tnQ0^!7llESh-tK3Wx3(eSW=UpIzhd z!tQBEbDO(k}Vs*PPQ+E=2Kn%#ZhmI1m3AZ|Eo{{RtKPg|hy zWlF^H{Q%34Rs$2eTD=gVs9XfQ*cZk7b14yiPlIoGP%hUeceHM|>CF5TFsX2>bk~@j zHukn!V|H2i=!q&+sZynSMk_Ev!E-Wn6&=z!tV((vrxiZ&D;||! zw`pF|gT7%gFwwIShHYY0P`+c>y_usAybJq~dfVC?{{S@Ie30J{v_~H!G;fv`&_3{d zdP1d2=&p){TN!q8#v{8xt!Gwi>mQ0yEd;Yp3N8X)oq`OUZXYE5CS6TY!6p(ECu96_0i|*Pv75uuBOyWk%ld7om>k z8Vh}+%N$x){y*9%*ZVbhn|(3;-U-gW%EuS1b)VMAXuzfhm)oUEn;?FP~J7`<5$wDKg^1QyXB4DKbO%_23uUco3~zJ>RQ zy~IfCAxoLf-5HwaDOu0JgYSu zwt;H*1wRtRs<3O0mIch6`52W?c!l$??HKnuffCpo%ZZDt^%rMi*Nx653_ybej1eb@ zU)B-cz_hvqwE#K8c!PE~QgmA*OsOjEXUR?=EThfpJ03h!xrtPe@8O&pKDsJNWbg5Cc71#{7vEF0FO6uzayiwdj zDpyepY1{{*Qw&iK<^AFoH^y5Z&|0-Gm<^Tfb34vC`9M_oTU;u;w%a|SeOABJnIAgE z<7mLnt)sv6mZ3C&;3r(0sZLc5liio>uy-QjN;?pQVuLm)Uw4n zD#=oy$k_08l~mN*F}l;%u-g+bHJN;D%eDyY?KD&JX0aR*mfj_PN7@_7Hy>Q&2vwAO zO*lko)4?gZmNY0Hjt_I%8;uixgEk^JW7;928YPB;(!4-4A9xOu2TX4*!Hp)Su8`N2 zyd2Ec_ZXQYEc-$dPA|N-qzim=3ah%dl(efxn%^)S{APXSIf*Xsj*~#W5%-@%^Tp z_6BdiB7R>@c=!;$l>5%pF5dwYyGWH%r(;+vdh97Nn6n9*0|$Ce#NPOhI?G+$s>ds- zaWjv2Jww`~xF>LZ;F<@Ki*$ZV7IJu>>>?aC7 z@EtC8h#vXkeWAT0d+Uc01l)T;w1C=tlKex2ng`DS(ZhQF({k}HSIkJjbmq90y$i~A z30r23A`jXkMrzo#{{VF=Z*&m2Y<$!dwdp@Hrn4ntaTYw#<%D}vyp)~k-MX7$7zH~#>5f~+`6e4<+EWCOEVj_z(CuW8!+ zO6bpQMTb%pz7Ow^j^Z zm?M1+R~1;`88yt=Qz$HTB?5@KnTZNE#HpaPDiy$;NQF|53XEiwslM@P?oim5V^c}v zD&&Xu2zOp#ygz7j`%vEaGWJGf6zsRCKsmhE+Btmlcwu#;7g(q`N34KX76Q|}t_cMb9p+=>z16$a!*Jc593#f2!@gKtlH z^MOOi?DmYmoNL{MAvJy>L@~*@wJpbh1OEUeMI5>22LMY7_Nb6O%K3wABl!DFpf|Jm zjFRThXy3e-RKdS8sb^vW+n5{Iv8u#eN<7q2s&F<_E|pkdxa5=@OAjS3fjM7^YcjDg zOYs53CElIRl+4TJJMe|Lhh*$@vg^=kwb&^AG2#u3s!s3kb&ECz<}H*&s1m~I2@2JTHYzGnzdQ{rE?A>C-WFRFnK{a9O^RrST3m8~U#e*axOtVO^+OnJ=?xiHHV$m#4QKkYC+>k< zdh8->++$#O8~KNLm+$zQ?3Z!#4>?YVn<-bd_MELd4`wG*m+$5x{)TXT(&j3>%64Wj zs(VY?9Oq`g7I0WT{{V;%8*h?gb`G83MO#7&fo`#sq0G=&hY)raSRA_}v&<;4Vs?{e zrCX(mu0f(Fd=rR;sx?pyvuiD*7VWOnR)}{JnCup<9%V5>bk~S+ogw#5@1*Y&E`fam zBiV-mF=J@xG zo0l4>Rdcw4+X!+;g#)s5Ebf5EY-f0!?s$^pc9K(+4@pjtr+n}}(~+ky)dt#vZuo`v zLG<~e`G|Inw4Q0um2Z?mr@Ta{_t2O+d$Ah4)XT&pEn_gw@PZ9OYqv7hsJ$&NSzfm{ z1ddsnV3^m?3rg9N(d`>*4M5S*RLO7`88Q!upHJQI9qB^xH@SCn07$CL9WKaK!E2U~ z#z=TdEydxCaIoIfFiYm5L?)f?;96_H!(-+Vjki_ ze2yUt`yrT=1a4CswV{=dv^_bvvxLwi^OpY2Rggr*d+JR(Tv3m?qeB5HU8mU{^@P@DVEASel*T=;2uJ7%sXQ zj@2t{qf5NXK!xx;Vh;ngF!zN105L1qZysF_&(z87llsX^tSe$Ht@%$3>GB z4~V|Rt{R)^a~b&gRMFDfon^0nbqca>TzP_QMP4C;s<^`ntL+AEW#;N*Omvl2s{z;E z6&j)6yrMDVg0T~UxuFuvrOJ_eYl(YTk9kpy%bV!ZC(uvqOp6ox`c0E!HZ*bH5gp+d zD^{Gn5S@sB+?Os{3SDJE3wR*q;yFereWvfk?PoYuI96XN+9!1Ksplqf!a6+guIW@A zh;IqaJ%)E+aZ2`s?*QF_g=Sgy5W4kc!>OCxa4lQRwLpFDSJxTayuJxN;EKFUkz1zn zL`RrTuVz@>Rs_XnI<>&8gSeJMjf!+q9Er_OwB(g1vmS56;GlUUDla*AU?l@_mz6X~ zXHhkQM|uoOGX}^Gur+k4Sy67P4-^*`+bOle?2$Iy=tLfFvjXf-*mi+cXrf}b_I8`a zJUC;MhuY?SF<+#JbM7z@rCukpTZwKuYp+cZU5qotUm7by9P>`IJkL3N=es+)ley9C zo%f~UorJ9Ni8I~kJI6D-W#BaIu?FUMgD~)C6ijEaeth0Zl z!US0HjJkZ}M#UYur<8eU?6E#B-?R-3UCr1ty!%Dv{gXpI`^C7?w{iuUNE0A&!DZS=O4 zmBM9ufp#q}VpWRqHgCKs2Rt>#dwL@5f6SKtHI+cTGqt* zkY7(n{mOuFoEbEJVQj%nSfg`SENk+cOiJWJi~FL*B|u7*9*AhdTJ#hAOn?l3Y{p9k z=~nwq6pr^_h>eGEWvsMlOT;XzWo&;lR+pPix4mR;{CF!L1b)*g?$o8sKpHQZM>P9G zbTe>#&DedS{{XoYr1%HSAaFs(>7>EOkFR)j6j@9ST_DwM1R+tN@3b2H%0gJ-^ACV- zEXu=~LJsuqGS2Yg8Exk6(&o4&+9ywzQOxq58QV%j!1c>FI((AG>{klKkU4dmhK8|t zs|;(h-EeG7JXxO+_8kudE?fh2nXUPtb76*B=48f%s6|SYf2f=_D3o$_-jy%}Gh{ih zxAhFgU8Mncoh2WJtMdfPcc;{q?zX$sS(U>V_?ti+KZ=Z+R}KF1m00KSq`2-X`Xen7 z6E+jxZZCmlu2_oCh_a^0Jd?d5yoYZQ zt_he6)Pp>>@i*H``;W9emkQ<%Qu)i|PReMD;VOImD@r$KetTz%H7UW5JX>-jn5dkm zc|&<>7GS3At-&bG<=T5q(Sm2p8SHc_VA@v18nG2 z!vQ>yZ-6_`(BFwjMQ(k~!52fo)EKCI6s+=#EMz_Z0J92h)#2J992!7es2wievbv7t zh{M<=bR`gwkTe>HX^uVz5PMI#AIUsHqQF-WICx8ToEUTTL%fGEJ77T`$z*u+JF#fW z(ObKPPjshBc8NfNrcIw}W` zNFcF$*hC7^$tqj;MJSAz%k4@ae&^>k(mSu(p-PVf_hF>F(S708Czs}jTj!6or>A`X z05~=Hp_?>)$PVam!*VOXM}Fk-^!ugvV)>6ecnGSZqc3#gWeaSBI-QAN0oCOP6%xAC z2o>D@rAn0X>2WNMRB1BW8-qKLRUQbEqDu4wRzul_!R(3S;*J64(RMw|OR^7WqwzA9 zeZp5a9ZGQ&8c}HiwnRQhWQ}?woI833(p~ommf=}zsgr@Vc9w}3l z&1|&(rqi>8x*GjQcv{Y86kQPd{HUo-5H?pvjA^yOEh@fHRTVX9Ux`rVE53fB7tNA` z3~a-2nfLjW@M%q#iS*zRhCWymGd;}z07*CM1fmgLLd_I|)8v-nx3ujinMXiJqNPqB zVjJ^^Wy&;Im&*8x8sET`!lT4axM;X0>|bbjGwl#~J5x_$BDcGo&jxbZn@Tqtbrnxf z6H)S16q_zl_m*~jp$;>1eVjm9xkZmQgX*5&*iBT29sdB>oiVF5oqHfL;u&jhoLODh$;=V9DGaqbxC!mdfS@#Hp%S zg4L>)bpS3jxqU`1iA=iJurT&hcp-=@lzm~r_@A+eS9#t;(G@9y3+Zj+A$XqBH93Wi zhO!~T4!Km`*WHFTVg4OyH{91(BomN zE1`y#^o3Q~0!wy$vW#kxYvN5?f0x8dV$mTUryHyzG z?F0$&;K zmC9cvd41=5@dkpl9pI(n;Ka|f$pp}R#O)XBtFK}TC^UtwRH;(+ja?u@j-|iLJKu25 z=7!J3M1PPoUW?E4oIdT6{TJ+mps&hnz2(nn^@#N=tW3!&uVUw8?=Ntk^MX? z80zUTWWFjlPqk0P@4qC&e$Yyl4hW~Ta>|0vi5E*l%-#n3GDWeW`*AGR1sdBbr7Wb{ z0KuM!si<92{v~v;PXpcQ%Sn9#z=Mqsh!JcnJqo;S_lj{5(x+@oL#NVM#mjb26l!mMf1OJNLWp`}5| znCAKmOVIkv-eCdDp&nT24uRTW)?2jgMpx6SS)E`-s)I*%X|a5e#>@8jZdes)-2JDP zY$hOmnljfbFYAqU8AP~3p2+Qk=4G=(?+B}w2;l*8?H$bGoEyOH%_TCR6eFZ`TYGfD z&_bY_%hp&?_x+{I@;+fEbnE|5}T^gX=?L!-R}=tZ8FE?nECDngCn1vp1Ige@2o zNt;Y_6eiq60aM2jZOkYWGf&DAS$8aUuMh>+qfJ@kNyYY~w{Hxqe5d+480C$;OV0v4 z$j*%IGFKl~4X60s_lf3PPz4=0irFjeD26b!WJ>^wXepz-VBkqZ!>G(VLbS&{E1_cM zW}o0j^ zq{md3nem|pV3%pcjbYGsR@OVOX}3e7DOam)rKQV_^c2xZ6tO;LS%S4ruR|{#<|h7Q zESUy2n;?7N&&&(hUms|(I4Fj-tg5xs?v^vG!FL42l5px1husD`ur#7JGac-hn9|e` zdY85Rr;p^QBHHC8Q5d^jSS8HG%~6J|49x9H5Ns8f^Db>I#Nu6nSOu^E@c#g$Rrahc z(SFXbJXdNzXmd}J{Liu1`5-@^KIkTg=4YTC5%DuFT(s{p*OKMsQA_D^;|iNPVvdVa zvq~QZ9Z*^u68)gy)#d;SG=eb8gASU`e<_EadMVIs-)V5t*?lftzKM7pQL`0|81%Wk zKn2?_A}C$XUSa?&vgdTrWzmAPwVZoPymp#YYi9kT0t=fVwjT2NL@#TZ=4L=GxtBSM zYBAbVx>D^8b2;d#5%Ux~AjfsCCXG7j?;E~>w{RL|v0hcO)?Kq+c(DX@FAt1U0k73j zu|86Lrmc0bO-ft2KM<}R%>%<0ug#dIhspaOpP0q3tvx)#H|pQQG9*)#pEDlP z<;`X72zB0JnA4Oc)*;LiTqVJjB7oy)dR1B>UGJI4eubFM4*E-%1;j6CbiS7@mlqu# zm>M_bYPI58-yJ#|bORz#zV+f?RZzA!t9yOXDU2o>q7r$JBr2kU<4IjCxr)gy_D;u0 z)XWVVK{uHgUo!8EN;r=nMba65Nb4xOUOazueKwqb*yV8`+^DzfF`>`Xp#r^&9vO=U z@i7jhO#{PIM{qIA4TC5#9GKY|ZPB3>12tprL{OxMU>WCV6L}lvSZ?x|x!khq$Xw4I z6w+QHwKEe)LZYm;YX`FjIX=k(=IT`W>vHAB)uviRY8|7 zU)!NB7hE#>EX9|JxqLjlMN3{{;bUhk%Uq;*8EwK{y(pF5Pyk{eYMgfyTOm$@6-hJK zp^0R-NOD7#UxIi+{A|yVjC1i3pLG7}e6tY#<0lAxyD6!(C}o;Ay!;=`Zx+-v7}T{D z4N!fWmaSz+VjAM8-RV+-?!<6_`sx1KS&rpIHojc{0Dm+f-GasEMR|BSAV!e`{qLkm zLN;bK!9RNZN`IsA3cp9<3>+;*=VTNDZNrb7Pd=-iNC*ppA_?jzr zK;{@!WsRM5l@kW6(eXRqiHBFjNnpo;nLV(nJ$^xR9MZg<(Fz!$6Y;4}x=3#SIfyjvn3Do2|4SUTL+)?sjfk_Go zxD~MX>ZWrR;V#NORW^m)^gU{rLDf!<^u*P=(V1%jwL!&j7k?~n=E(q{FJNL@0MwH` zRfxsE6!y|TsTaHskwrPmD(e>(p)C3)SqJ-_HHlcQL30!4RxOV)j!llE)%^!u&0>GN zamI55p`ktDoW^q*F%tQvj$%28<~f2~4`C6^6POlcj|fLktmzk7890=uU%YxWyv3-I z2CZ$?4eKd$%V#5ZgB6a>CVPAM#_Kqk&b!RLv^REzn$4}|A&Wg~@+HGFyIWRE=H1-3 zx_fFZ(bs5n{@u2QwO3t{L9q}5`Jv`1S_25oj_aBCoI45?VVX-fm~m{5PR1NoO$Y#f zRIZX5XfvWwy|@OTX05w*h8L5$CE0j970kM2$}Q+kI0hg;D)c=0qi_Z)n|>y`3hb_r8_{x$iM6 zd_h1VA#PkfW8xH~XL4e|GS@^-uQ9n(w3T{Pw#|D&>CWsbFIz5Zo?ev~G4!l6MdCR7f+od2XO5kw^S60(g1MnSvi|_H zW2*XZ+G#`IE?xCr*WHb;sKd#M17O*Uy4APd9fp+3Lw>8+aXhz+& zA**GkR3_aot;|QE9#Hao%e6n~F5ersZz4ztXo7wFvj+ zIe-obL+6)d$Q5KNKon9Lr@H zbK)F_bFi6(n@dR03ARI-rg#+|!$m?2V5mWwR`X|I)W#+IWv-Rr2RzGwQ_hC~w|B(K z*ByS=?Xile#l$WOnP^NybhqyVvOLrG7~56*KZ=$)j>G+>mvP?vGXDS(lK%jye~4~& z*?sdUM`@k1eF+qw-WT3!E>+|4*8XD~bxgkUr@L+?skO@^RWE&}ZXe$nFkhM2md@C= z{1D_`;-3)Y$O zn+A}#Gdj^D&z;_mO27=*6M;NED52`#(86>~!3Mn&8j&c_*apXpEZCc@FbdH#g|078GI3wM~G^hEyvu_yehaAe%( zf50dF9)HH>?pLZB6W^=IU-1Y|&}I#{pRvC4_BY-j3?IejD_--m`H7h?cg-zGrlssi`}}?I&#>XJx2=39?JEeWD6igzwGFnG~G?ogOTYofD(}I0=wr41}EeK>S%B%QG-l>x%x|1?$OOu7OFMCapN0i z39Y-eTJtW_k~xzUg5@ae9LAW|UC~7b{{Rxn2q3Twn$l_xBsfb=)`o?9@v85lVdYt>lL)|Rq<4TlT z#wC@V@;oGKx&?U@xz*zS@Cwd{>sH*^#hQP!2ttxy_o0R+P{77H=8>o*Eks8il<0CJ^G zYP$vsEiSJ^Fyb(p0!VV&(?aHSpDj%RuyruAI!rJ^3>Jtc>mpgQLKaI+Wx$oX`dmmR z3~cnLhuD{XRF<#d23x0*f3(%k(vg=gTp$vTl{I>E*A?jR*8Lfm(Q^6+d2-_rN^&}o z<_3%Rtb0I>DKOJeSfSsUjBAUpEkwzw-DxqdL|S`$qf0LMkd~aV^H~`IS_hr{Ys&&oD}&F|}JjJ)+)*HP?8l=j|1B zix%K6g^{hAnwKg(GTMM7D;6BePA1;A*ukyLBojizHZ`c*q%VZkM{HEg!b(0C(9@e% z6eeLnIGR9`8Dm5$&jh?{TG%Sb+9a|iJ^`BpO;`#ofud+ZNbI(XO~~|w_yUaO1Vgek z+}AQLX@Y`2*?dT<7U>uwlA@cbIaV|LJHYfUVh(!MB_$`6ze1T_k=^pj{{WI%q4;IC ze|hG6#C7F)dEUa{m)Re~tku{66p%u^!jWN?OE@HgQ zK<5m<`RKUL^ssZVw%2)Zbaj;G>a3rD~A z4F`d(#$gq)aT+7b{7yFV*WMtnQ*GU&3jz13gPpXEm_4DYh$~a=FIldR;Wi;LJ9&2< z*pHhan`iCK@eV4@Ko?G3E);B~M z!r2rCtwrq5)xUUti}#rFF$1nPE*h+olaYt(zj^yV<~#`I1OPfG`;+}B+J$VJ{{T{d zwLj8;Ky%WVL2Fr9H%q#etc$V^z22IUO9!wt;B5Vp)ue~gCeM(h_wrO5l%s;%pkM$$y7Ksa`u&inp!SZ_2`GZUm%|4&s3ndp?E$RvMm9|*3cH+MXnzn* zOvoy2aZ0ir2CTY1(SgGS+KP<(#IJAwrA?mpP!0}-e5EREJg@5==jO;{S8%Ia?!;#sR9CgHtOr^IO5NRTVr5$EfgLYV7^g&Wa4T))ri++5 zZL>(es=zLhdgfb~N`pN-J21AgY}Z`NV}6*I{FVGRxL-heNbAz#;Iik@iDsSdxA%kU z@U!{^o630z91_+l)vmK>e@&xt#BXq3@}?z5cbt(S0l&yWRAYAt4y?WAPb}^8>0nvC zi+z*kTN3%1fXD)hFuNOPa0D6D140>n+1F)ap)**C&`X+j%uJSo=1r}()8i><;%`AyLOqeW?L z#I7J!s|BHGqc&U-f@Yj(T(PNpPDS{GXke`qrFCY69`o#%E3NwIH9jECRipLau00es zwm^ZpX8MMD9Z9u($I*_5sOi6=$Xex5V^lZ{IhQXzF$Ji5#gd0a;x##Iq!^`FePtz) z!c?yYQe0K|r|&J(+#hLnx5&n~nVm+`+c4F&x@O3gJG#>Z+l?hg=>TC%zUma!`&3t2 zc#aQ}esqpeSS~{CCf|bxpypuT*fDS zeFJo4P1kP6HYXEjVr$}wlZkEHnb@{7vDL9{Pi)(^&AI))-}m2j?^<`=(|u6Ybx!GY zVb`j^K1z1qg?xBh?t8rC(lQM^L*ZGCqoS&3F%>q+T}c{hG*=Do*qCmiN*NtClln(Qbzhg2k;`y zDBi#`;Qssz;QHwM#CS`i7tC$8X!7E})cQcV^o{;JY&s4MyFz*X3%CUFeIC8&U4rwp zK~cUay;nuYSK84WDO}oPeDxPMbiEcW4BvQny1dl`dP7Qo7s*0s4NqRK{Q4A#s*@`t>3Vc;xXO`ofd zr@cpHi5PwEn+{7|C4>!fg>M4%ye2$HUP0A-n~qgKA$(&~V`7>3+GQAaG$QV4#@5@Y z6QMD`+7FTtnm;B)X}&8!O`m|-nj_B^3@PcyIKeupehagBbYVgh(S=!3an|`-A~Y^0?3aN) z9^vC5IYR-TNy*C%<%ll&PNl$*FQ3BWZI~77O476W!Rl34+AzTi5MM$Vh}PT+i3fA5Beeb&#}qkK;LWch031^4;gH#TQi|I<%R+XG^H zjJ=AjqgU6&sd`)4)yWV3#Eu)M0}FV_D$(jW)Hvc6D3jMj;oU29zn3@Z$hj=@j5C70 z*vH|0rFDnj6NWV-jn%}=fE3J=4*TpsSQ^P$t7dKjb-F3k0l5yy!RP^VfTzy_x|HjPYY$y5iC$tB}nLUXLz_tJ5U}7F-jAB4?vUk7bJJE1Jom+!JZ> zLRV@3L!*T|yoq8&6vMeRaSCMmr)b96@oJV2CcLL9G&|o-0zHNg;CJu697}Kh()cjP zA90U-IGV?u6&3VZNVO~KckaiUykWuj=rJ~okDfvt%0Vm8^3F=vxeA|(#-y7w^rU*m!xAWTLSz=NJ&`b(y zITM65%FOcAkek)1BX`KeG*fI=Z1_@Nc_-Ynad}?#LRIv9MRQofc37^a2T-VWdNX%X z*(UVRvx*z@!R{9=A!PI}^=Y84F~Ftt>jPy9mtCixQ&jhwx5P z%fn;9I#{(|X%<*SR?M|@Q1SDp`GzM!F8qRT8L7o!bST&S@Y5J9I*v|l~T{YHY`J`1vRY}`RCm!A|iY?yx z@qr>;_1Y`FyjO@c{Sw2jrP{4-G@qGf3LH~4RMQIl!cI}%jM@Xi)RZJq65k`Q60v4~ zXc5qYev9n|$`Oi?KL!Fj5n6fE+Uy^2@LWpKwt3f{EA>^e;JOKdwLCu22@b z?nG-A8`CS^gzv99_%+}99vM4kQr<|rwQ)?kbFe<}`S)!_sqjUaL zb)VP{^*tMYU+Z^A~Tt9w;%r;+k|+L=;vAaE1KD6U=i%va;DP@SX!ynkq&|GhyhR zu=zmFtN^7j8>|7cIzty&WJ=?#c)DKs;Hsp;58laD3j-d;@IZ+b**`8bGQtXf0sf$_ zWX~5T{6nqkKo7?3tnaa&MU%T6K888hAickr*meDku1%=!rFFr~0q#7xgD>Q==>#|; z|5~2KWSC>0^r;{rMtyETkgLzJ2k5IsD3q_;L2yPakLwM?B1-FFDFW9zG z9%3rZz2HY8rs2m>i%?S^52dBRD->++$Fq*)2%rQIJb+D3c~iimKRF1VeFhR;6QI2tmYV=7xN0Ki_R>#YG-0-VCqkROGY(8 zDu{$cH_m?x#ux0nrE;8jqB*K#T)f}1w#*JcKUPlba z3L^qb+;Hw30pAu?^VIy$qm$ChA;EM&bfjoQ<>hAiXi3hs^@o%3&B|Iz;*kb21bG(I z{^gL%TsRysd)%2T*2c&$XXyj;HD;M|&3ej&W00=Y0 z`}Tf8I{8FACDV$ei>eDn2F#+tTDZ>7^2O7QWL6+AiR4$;ja?)tjAVYSHj92@}MhXF_XBjsJ}ILrC#1*eCME8xtCYd#MiCSRJ%_s9p*>R zzFiC74;u>85;~omMtDkQp?C4U7uyZK)(|rbpPg=XXjM#QjWcluD?<_~Ra>JSZ=iCdsCMB# z5xN$y-QtlXSg?xg(Mri2l?4+U!%^KW#j-F?nW0*0GC_^rEvBxP&6TYmLcmSZ8>bog z3XaK?oK27mU#Pr12k}*uejh8bLCJn%Sa*`KC*&393XIMFK6muhRb2i>Ta%OhlAV4G z%`}tI!X7-=95cQ(c8e7q1*W64&@)*!<%X$Hb!k@^#38C-rECSL8 zl&vVwT%V>!<|km;L#GcLYxHxyBquB}zc~Nc z)Xi=7FcUk9i#F&zL4V(n6NbV^TDWSZ9nAmrc zZ-8|*Uf6(m5x5o@?v2$gUM|>3&OD%VSi1j*x&~VkLtJ{vZH?=(J!#9v38{+siRR>T_0sFav|s%7Bg^yRA0)^(T`ji z-7{EcAIW>PfLwa1#j4xYXw!SbMMZ_s=hdXxmFAnCqD+(u0vlFfCO zJ+EWc&}ssgVaIjj$bUZaT4)Td*N_9wK<4pax2TllWo*Gz3Fj_o&8;_3<|8j9u~K;0 z?7CU9xGG7zNc^75#IPa@LkVx|mqU1^O(st~8xSt%yJFe4E{?lWW^dpeEgV@{mb=EU zB!vsdP8?pfTkRG}%AQkj3{Xt-sE)mgU6gD=qUBbfsJ=9iR3Qa%a@VLH@?Oqmo1XGD%#LYa4B+Qm;AFZy_Dl2+?7JP#PhS8F3ymZ6zQCjz*rkJB)cw z;y;&h1CKdv;3;t3I@=u0N{Ns@!_W!=l7^{lx`y=NnQ9xA=953LTbOy`n&R0l6<2aIuy;dk_-YTf;pV_c_PEg-^Y^$+E$vkL?Sj*iCK zr<`43TiH3!sXLLzlz$Ts!jJrm@)>OoO8F--vnNQy;ox4S1ICLd+Q*ws)Rqwhu6fl|FEd^Q)fMPL z|J0#3ju8%no+v1l+O44MCx?>dx1fZ#dXv?Vb2FydQ7>J<*HJoTv^eHDr5U}ovr)qr;ffbvI({ny4oXOm-X+iRDBHW?%@G8MUiYrR8d$S36 zH8YB!`U1ss=CEr3dPf;R$sP;hP`H(D{INhc|0a4yTMv%2iOxyF4XxHACA0ylrzgsF z;;4dhNVNGG>>rXC`G~vTF26<1$fsQPPo0CLcRz(L7$XHx(UueYw`&X4b>P6*8zG8(mK`One{zG2yjff7Upb8FdC2+)*bjav6 zOiD6xj`MM1R0tckoxLx0d9hi|Nuj`=B#5P;;k&p-i!YTXeGZrTU93PKTS zT&-57ENQ0ww^j%g2RN8-!xxz~?piY3XwChk!}RK^u&bJ`ao`PvHw(&j*{ci;Mj->z ziB^YP+8!F3%X9s(+iYWYU&b3nAgEMTLxvVIll{Ufl< zQGl*mYdNPmKL;`b1H=zDB?Jf`&q02XFS5GYH*{HI|{ zO1K)8u(@a)H_v3+ppo+;JVew81N)utfBZRJ^5M%cY5=^ok2(ndO2Q^t%ccxy1 zA`qUFF!GkcT?(l8Ids8xipJAlGOJL02}wO_x>1GViI&B{FyyKaY(=TTXR|2gzCwjS zj>8)#J?yv7H|xh5`o>rn{U)Wb-TVDo%xIhh;8LEQ>O~0A0*dw}}=8S3^JBR6vQAX??JqXP5w3sv&jX7IQAL)Gz9O|NNs^1+kF%Ok%%7kc`p7*>&q5WvN7Dvo`Af+`BgcNw8ibW_(W>YY;-)z3q24#aPL^Ia zi!W{$NsWzC+2>ZWVoCH0vutj4k(&oF2gfcLahACkZtk{$gEWeJ_PO|M#L-IdL7l)M z-l0YE1&^ItT&xh;O? zQH{P5eZHtj!vrV|Q|<=~9v#5Dv=m&jN$nl_Sq4ijspK)IE0s838L96W_%p zX#eFid()Wa+5BgSaNluX2*&4Mg=5L%!E;=mQWs?FJ$)_iaJCDaG}_%l_g!y@TM2!N zpYxFocW?riapcNnAr#peDU7qzE%;}%my<`L{-;a1JlMUwif6Ua-Z}&-a}JaIC$E+f zZTWuzDs$3obJ|Qp_)LA$Ok;=+eMrutzRe#;uX?M#l^?}Mw^Qr&k8~fA{0(rj`nSEA}d~?OzdIrp-;ArrPFFd7Lo3!C16tpaDqARIufRo09RQGgv#-I+6 zP*6!jpxRtb>?QG>9VsEZ68-|dzCV95nTJ6ipZUHp&@%ZMt4@xaED{dZYkZk&mMb#w zSJN8mydFX=SXEQf5XLm}32D72fKN?5hVnZwf1R4`W`^<~Ub+9Id`X1TMADDeyrw*Q zxedAXd+lW?#hx+0lJ`PvhXsx0qeDf`CB6&3^;><@Fs^UxrP~zzk>#3ow2{@;9Uc-I zZpZiwJw0@))aUReZ*R_|udr-lHCij8T}J=33y=u4P*Vn+sQtr*zB>c&H$(2%M~*-Q z*y-MJm>sEDK_V&#{xG^F;MP;D(c?{F+>T$~P4zE_%p6m# zs=8a>xf}@Eokyzhjq01z)AC);-a5@3X5wxMu+R^PPDVIqg{b0y_|1y4#^i4#qDJ*8 zy_gNfjetTHfJ}@O;)&NGENntGC7`l=$kz0ZgiKfURm7X56kcS7BkEk{UG|#$gB6L8 z6r1V}%ap)UO|Hy)dive~3%JD2o`{%<3vY1+6ESH6*?Yvs;e6LrS;y(znogxKWWs?$ zoH-SS7`STinpefRlomUk+Pb>DBt_enh#}lQUYuS4Fb6Qt_6fn4spzOU`-arLlYvOG zD4(%08&ki=@mcC^60+wpn*B)Bo1&4@Mq8JE1I?f~{B0bxfN`!+g_rle&SCYIyPy=a zQ!e>phnPbPYM<~8D*6~%t=%3A7$ba#5h-8S;|w}aEQiJrF_0EFEKS!c{Uz0iw%|^- zexeueqA$g%pQK1xJ#eOS;5~gWe}828iF`gj$1tSg@P;$zP01?UJ=bm80(XjUw|d~b z>&{=hvb6|5-rni**8L$H9XejtC=1LDVS$Jk(Pu1cLO`bIv~S0Hv} z73eo{EF#u8qHkAnzvM1m?)_U3-Fa~|^j2pu*@C@LD|pj@Nkzd+7Qw&hv0t-@rCe#B zx*EK&;(O<|lYD;)Q!xi+6F2#rz2@z2b6olm(>3_pv^=+(dAil*j>P5ceRLn2f-`vr z7-)R%Lt|!CZEMjg?4ocU=4#2vv`sopbn=7!ejp4;GhN_Fl?Y8D{+vfd0REXLkk$=l zPt~}Yz9T=IXsA$(a0$^7qg()0m(N~eu4TS`0PB=_1lNwJ2gA?^`WDQw+b7H%vwj4Z z+R`gQC+*7qY+0a8!N(GuaN-yv%{VKVcyd6h*wYVUfIPs3@|a6*_3Gik)r+FCNo|#d zSzNj=IwU?3(nLimB)}}adR~FLkks&Zr0MOQK^IK(t&cADo787S<#UdD9abD{1Eo_h zv1!>)7j8YNq2edc-Tt>%@BlHCWO}@E=ss36D=*}oP@kx-@&%K^gw>qf#8vDhxem2s zdb&4Qs2v@G!TlD1C7CA9NO!0hztPb3kF=0jqFzwCDazPpP4F~2h`bf~7FziJ_*B1u zG_E6YtaOf!{{m9|p=-Y4Za+ev5pST?3IUfn!`q`Jy22^+daf%$)k=I(yRY#r%*_ zE-iSQ{|U#=i#~FndS0L|-$_xz;xf}^&l+;C*Z9JHhes9ZP+q1DM7d+0jWEkiiY61m zlv=nGExyjv7pr!>4v+X>O03YeGBPklub)G| zFZey*mKYrbST%whq;^+6Y^TCCqM2R_-pOk05;iB>YYyJBgK1o=JI*o^% z#!r$ry;XV}hvK;%G2ohL%WXx;WefxHVJ?S+(9~%kpA8joDx^i zPnHAob$+snjOn~?vqlZMCep&qH(jiK{J|>iG-DSrw?RuHzhl5@T)#Y*{FylQYj56+ zRC~pVLIai^UibpxPox;B`73so!5W7F=tlPOns#OVDF-6Ao-`SzC93e;dhj`sr8OIR zbmLQICM5zarJYTR*(xIl20xl-GG|i0gTlu}Nbr2A9Sm&CumH@XhT$HLMz3D(e#FvT zXqD{{I7};x^gL#CzgP|ohkQgi*ori0*!fWlL+@AWBy)1!qX=>|-Iej8`xsuXS(9=- zES~DU8G^UG$TsO-r%{i3Hl`F@Dst+%s?^3^_DUz>cDro>JV^I1VJQ?gZEZ{x7A9Gw zHk$7;*0mLcCq~87tb%*b{8G(&;{bkZhXJV=#0)$?0&#O+5DXDfPw@d?^2)d~wLL*C zQ{Cnqsx(oM%0|kb>$2Y)GP#5K2EfNl60os*=0aWsmej01@NlRQ!~~Un z*XAXMmV7h9#I&=mEVji%FR!g3$+Q$=+r@GTgpQpT(!Z@t1nSPKT9oUgvR42-F#s;f zw8BpQ(2;ZsE%+FkBZ)L7`db z0`v{1j6%HvXpu`Y2M|J}>}zJcx>|w#Q51?-kWS15mG2nm)Zi5XiQ9y9>BnZfythXx zSAdaB=^KQWfv@`|ffZ4PdB){Z1wj4F@)EE7Jz5N~LrA9If2Wh|-PJdu@eJsC1LxwhU9$CYQG;|2{`#g6S@p z47V^{EPs1{sA5T4Npa0NT&cD}S#0Fhu(1_AOns&H4~KDo%SuVE>naZRDtw+XPc)po zmOVUep5#1kEXF6tT#mKbK~Yh&kq?j?9-v>90(E9>jD#_UiDA`M+oIbbur{RDD5F;W zaHb*p%8ViaQKkyd<^v}_TcEszb)6rT*CYpwI*Cn_`Zf@x(zNujYL+v8{T;9~u92eM z)bzcyT``UH_r8Lfz79kMVegsFN(Vz~(xi&mPLT-<|Pj?j|cHf)AzXwrD&8FPCYE z;Y2=dtVrq1LNaTm_EF!Dz`3L9OPA9x4!<#iRU=6Z)N4BBTeVKZY1(>Y5QQ6spBzjz zb#7Ie0Ton*hAb=2k&Crp05l!@_B_v?FLR3U7Q&jV_el`Ej>2H2w3F$B z&ic>+ew`3Tw#8d$0B-*tp2eCo0eW}?Ex5e2NMcn)x}sXsGd!VDhD7S$(Uv?h^+fj4 zym~Fc=C-5h74F&>R1o``w~?wvwIqIj>|FZ!4sNj#NQbMiMlTOJbmwztBqZugk)(2m zBAr=T+=R?as_nwQZ|45|T6ccmnX*-75IofU%XK>t@)YoLb)1s1C#zM{ARSFR`H4of zzB)CAunAEJfUI)W-v(}{GE1QCo4irHy)>w&6 zBD*+Qg&C_AbaDnt7&_9oTr2<+Qll7^-_T%ixi|q78m5Sd1qLZaIBZoLl;Jw+9Meb4 zs45n=)Jy@-RKVu0cl>P9~4ZRLb1MLR{mtKC-#t?*uGCdpo z?j56pC9NwAj$Tl-m_e6wM+w(1NghkQg=S{+F95heMDYM&ay6akjQ<#Lq~I&2gaByK ztmlwN+n8-(BvKiV9&@BU5Sx!bVz&BCx+Pns*6oR})5!if9nUZvPG}GO+6#r3jD?T( zg~NEGs-PTqw(rkz){UV{;*l&?ZR??>|BVL0RxOmG);?ZBp@SgINg#%G*AdT#A$Hk1 zn`^%qRK}Ryws`ZN^FkZ!5YP-DpKq7x+}d0mtu4^kx`0b3dhC187_|zvJckm}9XeHr zBAJ}9r_%vZs401&YHRg1<1Z2ep2Q!ozLPuFZs1qBZ+CP4-#y(8pJr zqA!PEzs(5l3l0bX%)RUkHC!C6+|T!xU;D|!^q2f zWsKQ02D24r@+KT>z>*Yiy21^+k5+e(-{ZO!@&R|4XGm_WC_c)^@S~UioHqdMQYcMz zzy#W`gdXy(9(!L{3(w-#dG}rewH#K_~e=KlP3Q_bR3z->(k7>)yKQSnX!zR zvHauvFLvi&tWT|T?>~^A`qUW1SA94my8j@6>eIsi?|?={;C~hp8*@Dx^tuba>b-Qc zva<59vbMK({{=|N$Ebv>65LI#JtHSk_veR;Lk^+GzzH@CLFNY-m@6>%(ngk1zdBLx z(D439SfjeYFrc!Q`a-$0)HRniwOUA9Eh)7kiP(=*AY&& zc6}muBLVtp67&-Y5SMd+@ecf-;G=xXkBK*Ysg$LmY5{75U^NK1D<)|L5nB;rfDd*K=DBLcebg=8esY) z<2mB}jM|<>k3j5$evue|sPn#|Ye?{pMAn9;Noo+o{CdKfxzZpD*!}2HZloI%Iwh5| z;F}hDeG>L`fDj@1>C}~so-a6~Nwb|Q7%QW*BCTd7+70?L5#%R+$_~9 zb-z_jz;UnL{ejJwr7mm=SABzq%q4EH{K+V{9B*Io9GeN?W;1*vi|2wmZjI9f=d#e&Cf8l=@^o`v6)hKn3h}gd7Ya3c zU1iz+jEZAqy?Fz^Gj0E|5uP%gwMqCT&#u}CqvUeRNb`|iQ&XygXT`nmRBN5QvvJB< zqu*2hYt06SE`zhSC)CxwXxDb7xwx^75N>uwLDE){p8EU6-T++tPGbErmj~Qi?KzYN^C^wT$y-_xm-7+P*dtt&U!^(OD}X zT(QB`e)~Jq?%;+FoW=r`d~t=1mI{UcZxuEpMAMNPdaA9~3I(83k)WvT<>hn;9W{=v zwtSwjpBa5kp`fA<45MsYNBh_U#y|qIgF7Xcq$9kmX0n!lD?vjoZnUg@Tt z9FS*oWjMj>t(5H5D()hIAnTQ3+2mZ4jtB_wEd`{@n7k;&Al$N@9$sA8Q`h6^aS z9yRPxEK2j^Gg7AdO;4mbCYAh7tN9>vBnJxh93H43gaU$lopi=1LfF5Ng9jt`h2qz< zvWn5Uu?ZrHGVN?^I@m%1pg17>bT&@5@~_S3Fn>>o=d)w>Km(ldJ2{J8JzPB!b3#nb z>&2K&O`||&dwJSB`30ptKu=*6W7g-5p2njbJj}*iSMu zR3y9MXr;RBDceQ_JTu5tc-tA7>c!@F`-&jdYE4iWEY2%mjbD7HF>b%7AQ3S;(2|9>? zGVSWoF8sO`&L8H#2G7>EqDW@>60jyc}rmYtpRvYL_a3Mw&s*g>=?GTcGt zC^FdIOdMBVa21w{1cdYyjfwY{yTi#}W)nHzy*~FiTBfo@{HW8@Gp^Ipx+R`{bhh$8 zdE7Hz(t)Ep%F2oZ#Hha;(cL82khIt=x8Y523*2+s=h|Pk`fTXNLEHQ~J3A|z;rIl0 zlo9Sg`u52$kc9MWx0z3h$LfA!P_{BWb4)}*32hTwb}blXMyHKkK4dX4e1|egr47;< z6P{D&sG_C*gVQrQSNq}uznRa4%-Dm6OYz~AmU14x+xG7~@UT8S z1+jH-<~}@mb4q+-bP?wMB2?H2CD+Po@Pw#*LVh%fCi)(Dk09o~pSxFDzR|8_D*s(d z{J&2b|Fejv-Kt#u{7;)Ehz4Tj0fU5whJ}QLhWNKx12t+8Bnk$o=)|PVf{;usiuQ3( z7y`X8zmSLGXjkO#B5T-p-Woy?09%za(EEtm$S* zsX320(!X%l7c!1KaSQzgERKl|vgk3Id3#lwiS}iXz*30^Ob-DWBgDnMtoQbv)LxJy zZbW0L>k;H?tw#Erwac_bRfbmcwZ^z3W|f0~YG{;*WF|LM>DdcSSgsW0aCnki&@g7u z8LXnegw6f(Q=S2afd zsHCjS+-+R;odx@fOnQw?%URcn6x{cd%7I9QQyTIf1&?I4k()SEkhEWog~mp7U1cHh z-nnu;l3UpcZ+Z=g z>A_}n<4hC^V)oKoB@`3?V+?vxf42jBvnhOk< z4C~$JS*J)ov@O>sbKGuVVR#87nEetrkb_o^zFTc7d`O3|6~St1YCgPq9)I1ldcFHYeedxd-keBM74t?n>|lc6|Jr1>0~S5`)e5cz41qg`TZpMuJk2 zeP=9|1%K(VyQkjr!KV~TIlJ_lHUK!~2+~*-k_WZ0$%JURj_GC2h)I43P<14&C5W>+*X=EsjHQdVw zby!C!aRz1vAhXHz%gsGCA206M*e)KMZ8{}YxNQVPPlfyHLe#G(dQ>1MHc=-d=^(>| z$H_0rOqNokx7k}dBOdm%?7L#bGWE~sR8U%wX}RO(jV;l2)>nSCDGzCR`>`QxM3 zkoh%KKrJ#fHO1eUZ1EK_$J>0%_?3j5ak;o95|do2g`lG6pT)6p(G}vi|TuK7XN6wJOuwG^xZQ%sK_HM=?XNNMuR%sgL5f>I8AZNuo{ zFTilsBd2e`a}Rob)VeZzx{A~1k(5HDgk(eO z4=fdKq3HZXi_*b%!a(3B^g^-!(wi5mP`m^i<*!&UFIWf;g*${hhF#N;??_zkc0rdq|G02xV}PhZBnT!; z)k2Rcg;5?vicN(Z#x=%o71@Y6&M)Y_37}8>WjCohi_X%%6tq;^d$|64`1ZeFSG_p8 zFF($1SAj~Urj5G5^hRSXZ)E+K<`CZ;smAQft@2c{9-l^DF zGqDnuPj(7?GF~z>l3Sbp=hllo-Mms;SrEq?uM}SS3=EQ`-E?Qtu_vsKRUvnwWF#aV zYK>4Y!vF6C&WQk~PltvNyDbjRiPocz*87he${!z1JkMhN<(#3>8KFdr_q(f)hmy8v z%!K^x7ni{^bdhV2g_Ia|8!J+V`_amnuRPs+m@1@K#1pE?JYPrP2I6FM<~u8+m$rYQ zXaFxV_I1l|ISLzFZ#llS*Y=qn?E!1^@DvNvD-Vp*4{E)CD*Wc`aN$rdy(6V_G2d{H z8^CFfnYR!Vq)`Sg@6q%Myb0rechN^Tf!i(E4q z@eY-wL%7kqZiS^=ig^Zkop{phhJ+&s)WWVRpeQ7_%opZTkOn3-+tQ2JgG1`?1@1$#Au`;?Hv8ik$8uzaDyv}F*Tou zk5iPM!Vu&YH9~tW06UeQ7NPOqHBH>Q-opnY?0-X19~krvFg0)C+s(a&xy_M?7q6wh zPwj_$4Bs{Nh22;7oI2%+ZzkvlYhg_3`tVs&;Y+*?|hM7B&jQxcl9l~<+nvYJc(k3B#X^Ed z3VcA3*)k!K`!C3Lb8DhHnFK^G+eobhhhPd^jwf!Z1unDlQ=6rP6x>8|p$l%Hb8U68 zUc-VpGAifd;>2PdBLR9N!9elmS$f%n@!16k z?VnVpajHST0iujiI;ozML-2QE2p(=hiOh3j6y0uD+1Qwim`0aSZ7f@^mzw=Db9p~i zT`uw*O(`{ZU#?|Uv}8`JH}Ap@Bfov0Wp}X3z?3L5l!z3+j1*RqhD8R zVLRs1P?vbwrlcd)rJ7Tq1a!(-`mcs@UyfyA&l4UZ&IH zLW5KwPf1BB+x>_gcgJ7Q`rCEUI?6JmEmuQIJ^rffF@r{iPbL%;6lsH%NPv=j+;~DS zJ8R;k#!*}@aWRyFaPr_>F(Y+<7MCV?Q|n5^3eBqO_icocJ5;j--$=DJcypfS7{05Ai2)5j_0QT{GT#1j$4Q!Q8mf z#Ke9Pdo(mOEVPI+0cvV`?CVn{Z$1Su%!ovabb$lvT~e;FFhzSI8mf6PRH5IfZBpKD z2Dl-kimA5w;aG_Q$|wLMe7U?`&R|6)0izhs-GW^(6++S?8WOA!W)0KI(ZQWJGCYuZ zmX&o%hsKs4qno>LKN8Ar5Pphr_F43^$>W_;QO6o+is$BXMoALia6P)1vFxtNh>By7 zZAfOb%zb@V_NsM0h|FOfyZh>h4$cg=geo~L<6M?#3gn|?){sGmK|`|}T2yH6s*7%Y zuy6XTEV3}$kP!BUD%86FYL_Y_eb7@O#56=?G(NS1FAfbPWrm|Bkx5XJ>=r9v=jZU3 zT(o)cO*2z@32D?zu~K;nvfN_H(mD*Oy-Qa)0-ECu(xOIr52lu57~JRuiP-ap;U?~u zLCm8V9P@MT1Ifb2s1MB;m;VBI#S6w?MMUh(wK@eI zUzb1z6|&Z>iSE3=8o!B%h=@XP87E0+!_?q$?$3ibf|Mb}_m{DF0lzzs%-TQC{@JZM zeq7mfblnc#y=^Y8v!1ab4uAV37BNCYQ(|YaG&Q4srwmU^d(3PPm~$c=PUl`_kIfXT zzbjc3>&UV?QmA~tUi|bu`qAS&Rg>j-{(Xr_M2z{_lACkd#;NFWw*eu#E4s7z7(A(_ z@{xa<9<<{wZylYV|GGPDqI^01PV}<9EdJ?y&v=&vN_G~Jlw^46sHs`lXM*swpTihy z|3R{b$-DjAUX+MY2pZZ6(KGW^3Y9~9XB~WD>u<#^TH1ZScl2^&OGG^l-nDea%KJga z_y%1*yN$(a$K2(Wrm-_uMS~PuO`m3{G8OaAR%cgzTc^W0UyrAf{T!91AkTkF>DZh$ zbzjqSxOfTluTTOBNI+Y%#=bNt@}nFxGgEit(Uu6$S$-kDd?J0auyT)Vy?v+@j8S;) z3x$I=O{NE|^@i8rBzoSpd5}gmteoMZ_gA=`nNf%a#cCx{22YCY;!gVK7zR!oQ3S#; zPUv;sX345T%IQq)AD6TlzFH9wVL-qTAz4^Oc=pe{er08F8nQ@VwUb5{*C&^fJi*D` zuFZvZ!R-^*7H&eVfQYxitO!jxS64%|wN)LdNS$sn&?FUlX_N5s>OH>Z#b*NVchc;* za-P2oayh!}tU1d4vkVMeAHy|2?n7j8=R`cuik2*g8|PUaXOa` zM^mPUhT^fqg$C`TpdB9gHJ@FWL&V}jE_u8@eM#drtU~O|P#)DO3nces!zFG>oFQ&( z$000nCWAeEB16RIgDg?QI~J3(oMCJihALC6hks|)rLxkQghICQQut>%NoMJ0{;+xG z;-idG2C@vjefEP~z{-FT`8rT6Qs*P$E0U@WPiCkGvtjy8IN5?t^k*49w#-H#mSmU< z0aUT0M4Bw5Fw(5ZmTC`{YiG5I(2Px!dY+^~HT|F}6!coWuKHDFdx ziBJ7TtAb_Zl$483;+$&9;}u{^B#jeRcyN5wCBJ)&gd=t4>@di2`pvC$Nf7!HPi&B^ zPbCF;es0hf?OAN2IXcyz>mS#O5fz}$1bs?e1}$;^OazqhDEMgQOFXKw;w~$Q+Krz| zdqa}d%vtmoHT*T2%pU%%-egT zFmSEuX|kJfCO{UK6OgY+W}d#(xFA)T^k-uI4)Bdm6btdYOk&8Fts?Lj=wU||xugl* ztKBqz`IZtL){HUy`Z%9hy ztwO{=j>V9mC22EuS#L;Fxc~kqOJd@#FCecgbCr&J%Kjm!tc=V;C|1{=36SR4t6)L? zimoF+oTiZ$6>`)vQi(x*pV=-EVNED2ECyaP?zoaI2cm%LEH}26K&CR3KVu*vLM3W8mz#jFF@&r_e=n98*phlvr2A$w5x;@n z3hb*K+s|`1OB_ttB+oZTw*s^c2*<*WGo{X6sk7J1@AR4j2c4(_p5xPK5(vg`PmS`~ zLk2@aDhfs&cT=4_ezrDFM1QT2%R9;E4Ha=aX3dWZ7>zR;oLda|Uu1n{P$bLNZR76l z?(XjH?hNj(gS*S%?(T!TH#F`HZi5dnxchmW``s_%y?8&mt1@fF&Zwx0?%X?9t~DMt zOLUpv44?l|iK|AMB|7udJp{|(N6#-41sc`I($Uwo$QRmcx<(rhdQJ7W-wrv*d=-1r zri~u&So)gQL8tyh7Kd4iA=9dJsQR+bxdVM#LNqj!W)x{gokFp~i1ak;UYI;hKn@&8 z;RU}7x-D!b3Gm4HojUY(`@mZ@%rygpPucxERy8T1CVW|P+`%8ubrru`yttp`)P-zN z=g4JZ!+kZ)_=JO~QfICYkb(Qnav#-%YgbSy+n)3|wzV%c0L?wD++n8b{l4J z9X~~=X_iY!HvG7{t{Z^6tg2pSwME7^?f2e z&-*dK7}2$Wg21qQfH$1|S1=;KVTh*dBK-pUi;g61Y5m7P*kX35@w zhBsGfk>D4n`_B&D_6D>uNChzz+nhi^iHKF6fp%T0g~+NMM3;OfLe9BHyUmNlMP?2{ zEW5N0Gb}Uhek?CVq0iIy0xoV(yhUz))J1SS!*;+u{ZmdkqNmQCC~{q z0%x{Q{Pwu!z!zgvQ8~v=AhtAUTF7GIU4MHmw-JKdldZU0fSUtJc@@wop>K0wb4NNT zfW%eW_p19jJoU8KhTu6|Lrf0N*Y6ANfANQ8{Kwvk0<;T2Q)f@Q*>U|8Ra7YN3U>Q_ zM<5o@+HHpCWa4fwy>h>J+JM6SNECz}hS``Nwp@c)2U6eBuNrsDs5h;Zt5%2qGF3f#TL~%8WlFTHd+{oJC->a!i0m(b?q1sh z_+;;|;$R6y5LwU-O;_@4nyzBP-!$JS2fiVVyp9`qHF_K1p|zb&FAk$e`m?-vgwsy@FSRM~l(*kF|b5FYIJGc9hLxRBBP4qcyFlrCAACLUUeMIx09 zGNgDiF1=v6*1q(V@;wz@I?~UyOGWN*McjJQRvcX)(pbK8DG6_^@WZOZ*F7b`fH@nCA*(O0I5zjbK^w)~RZYt5|kp5r5Vt_I0kkO>?*A=fKH zNHr@tp2-qiLha!4Fu?aUUPnYi&P9JCMTqhMFX`i!y)}(`yCNXB9*dAJ{%}G_7`Sw4 zITMMM`^(HKW!kwH$nlg4O$8gG{`;hv!FXzNM|kSK?p@a(N=t=6oXphi>QDZs^fTf=eWsE79rDMwPQItX7uLY52xy z!C>+7i9*`gVQ`}@6>x_>i#g$PQ%j)4jB6Nt1ZjA7-X?Khzgb~+N5PuA+c?=+W-I8Z zn)SIg^<~CFf=|6vVyF`as5ZC!YmeA5b4DXTHqGnS=UPuM~c^(QNVvzc%UFrYBQ-|Vx4Qe zZZ&@I5H3z{R^%|F-@`1(FS+N7#}>GL z#+vt;Z-t+`C>I=BGma3$i(%LaWC$l|XZUGGL|1nquBdQzShdTImj=r~S=NT`c2#rR zERo`2^g%cMB#10_%~oHnSjQ;fG$Av&wZJngasPms0RI#Uk_WhSkt*bQ}~ojoGteTjUknu{OB zW!iATsrqd;`+#?2VbZ?uJg6j7xYW@n?H4`YKHB*^I4ALu=}Ikctx|kDL-~`G_Ny?y z^ME%Udx7v>AL-qq^drn~N#48!hLyXn{-9bP1YK%T&Ow(yiA&j5vPhjxCqLz=RKp~} z*#}iD@J2#2wQe%Ei*TR$58(UU%*Gxh+K2!a2Il=G?Y>46?LmQ3^KBXGG)LapJiiz6 zhl04jV6LS3hW_zjBrH!Te(x9AzsLIc{P8a*Tq-FR#s-{%Eo0n&M*D$LUu?u0-tE<{y{g>WIpJ69RPp-b3p zj-5K`)2f!nj=j(BMi13}xMf$7s5g2t6W0J$rPR;ZXv1AOhe}&)T}!i490_}4138a= zo6=lHZIM!xkSPX!4*WCTWS4^B4Bbc9Yd%XI$<(TSb>Y%RJ>&JU!J~9TB|DKC712us zMnBeP!saG48kw$C0_1*s#<%~pEyQgeL#&3I^u7eSzTmBBM2GvPGa17jb#3PdyKa-O zFd`G6;lUF=%R(y>h;-&;sLMp;V&tU8#2F$nN(MP@8#zQ&%HjfRqj&-xCvi8dgns}} zn&zeJC*LTjBv7}uaW^<<{Qn3nLoVm>C0PqS&GFsC@IZ1vVo06X#aQ8$pH@1R_h*sH zPOHiA&Wz~Ceuv%53F?wI7aV(lhh^u?67gOZcLi&WrpyOkv8QSK5i zr}ot+KK;1SAHnlQ#?Po6pqeic%;dZGmdum0QU2A{6Nc|M zalPDbhv)hs__6wu#><(d=HJ;}I$U0wcC?ZGCD$wB`DuxasQ+pBt?`Blvs z=B?q5`tZFJKJzG&N`8}{&xp!@u7WSpH58WY=NQ}991o`XD|6M=L zAVh&bxDt%NKne}3&Abca^>$`FqThV&N-P0Cyc85Wm2B(snIA;xn zd9Lfi7Lrjd22(p86=gh${l|uKg`~Qp^(` zCpSW`+5D;wT2N<^#5C+$WW@3bSSC1cs!RapH2gYf;EZ)2w`LOXMU47jtV}agCy*~~ z#*HK(U+FZSE|fEa^(9X*i{+awRvy7r8^LsySwP%_Ed1C&99}8&eL=A9rGR?;}O}W)te#wg&auO|basZ&-lKHNr$B_jP|g6g{fTny-$a zcqcua&8jceV{AEBF54ue@cR*<#n&>>oapn=1PXGkVz6CIev`?6LCeWotGpVdavc|O zJd80H_y0zQO7N~2tXWq)g?>mD>i;)1iL~)it8Y=Ta*~m@#N(OB4wr=^Q4mvzwp&4x zQ8P)$!sj((JXzauE_iJWV3i<4{P9&}2TG<)9L)seAWfoIVXBu`l2}|eI*C{Yj2^dO z|LMlSYwSW1JDG#s`pZ}s#-Kb%Hsf}%#-F#WJI!vn2J$a{+m?mB3w!=wdWn$I2)QU& zZFWSe=4P#0PVjwJ20FlNTE@odWJ|8WEZ<7T_M&Fy{H+IdH zQiL2*6f#GiCEA_4;pyhO*`%iT65rx%EQE#bYPa++hv;^{(IdNwveYBAe*h>@sYPQ^ zn9>Ofgh&ToW)uAjBrpEhDq+~2iMZ#TP7mRY`_0a+GM~m!sl|L_D!4NVPFK1LP^keW zBDc?sg-A`(1#FA#)jg;#yZ?*JMrPo=Nk}eo0uk~uW?y^_k_ogpUf3V{HI};dOF&5P z`rnXa|Av&poAAykDTpoes4jC3>g=~TiqsY{%aCBg0^v@ zX=jvvluI>;KBcoLqgv7rokPn?*4?rfnRNTTM$abYRRW(2DwzbEkOvf}x6D)nAaC6e zSTPKfG_l~F&rx(g-VIfh-z1GOYz8S-;x2AIvL)>~XkjVj&D45hDSkJoRENS&kT7qX z@zBm$L7>OF&y|v6GhJjf$wF-9@2G9@=&I|$7~dbeEh1gq`9*D@8bU4^{xV@X#~1}R zo!BB^n6xi3SOV4@8+5HjQGtJJk_Lv+>BQ#b-|GIYqXi)YoSwA4#ujJcuQN>?V!$e+fU9 zY#U6Hs36o?#9i`bP&kl4DeKg(ZpG7C$(8Yam3)Qp*s$qWlPZH5W|f|>mhn8Yq+KUU zDjBXt`Wb4VR(_bogkl1&q^C~=4`Cn~BN1u_TEs=II54TP>$U)I2I*pEwZ?M9d#Tah z-MMF@xs2-6H4rc?v|f}E5vxJhC(dw%l}MD8203I+m+)um)#39Dx!Po^?E^>c85W9< zqzjqYh~#rE)?*WdNbL&N89QH%6v`F_OWfj+hRRcs*MC~3js%d!s6^BK^tLgrCte4f zuIpF?TB>iS)1{Pv-1E~IxK#}a4fMY>1flLjxrEcfe^QFaAqz-Zc_>IvN85n=Pfpe) zrkHgt4ME~axVST-LI2V7!n*I7po^G}Ctl$mnzCOdB1*RCs%wCt7oWI3RgO6lD{!}J z<&Si3G((eFgdA&|_C~f3fh35gi#OMwhY(GI0ITOfJW|nw5*oK(kRn?EQNz}wv(zx4 z%`MAC3uh9R1{)_#>ovZkM zr|A>G*vXGk232~-y6&ibAs=FcbpNlfuSpf%w%LCXl*F*5g|k87c7#H7IIj>P_b}RH zR($V&tbAm(3NbAgayln9mH;#0mbVfgkZ{!c1+Kjd?%~&}^*^23RFUZ>2VGZcEHFSh zQfJB;m2z-rjtP3T{Bpa?=uJ{iMB`l%qc>IbI5aTre$OFX_5#I0HACo$CM{E2?0hlJ4lH!DsWeq8N^WWV zf5*=sJ-m0}wo6%A-YN{y<}|H)UCyB{!I=(6sNiDc?~zEMJ|C4^EU>lmIHI)Vv*w$% z-q%#7J9J(mzmAP|UE+(S`-2|K7r&~YW8)@DpkeLsOua#$9_mDpwk2PqN-^!SH<4RA=QYB1SG2l$5JDlVR%GLOOG#l zm(s5}`yQ_EQ7l`V%7G@Ic4$joBID615j6iunz-}zQ04gbiHUi zqul=YVEF&E{(H^Pi*(^1Kx5&*%hae}RdR4}Fo=I?&Hq`a{@Q&*#wMm_>Kc-aTHFM@ zUf8=KW&KY%91H*^f|{l|-QjA~hR*b9V<7>Uv|m9bir6^XvcnM&Q|^_|Cvh%KfH|k~ zce=2)kIjH2fULb^VY6I1IH9ILTy3>d@AIzThZ?|g!O~#->8oIuXlu@T0DmD=ajDU zgw1_)+6Eb>J=Z4s9({0YdU!Ar15@MZi#fb-FBWEr-=K|@em!}qsPAtKQKZbZmoxiR zobmT5OaxXIl1B>#e1YBQdfoocEw%8uM=En3?zvtmAi#ny5-5$UCGHzYP1HPu1ztp` zwZ7+$s$RFuM2=s|bg5MbC))rA`Yr0=HX`NJ`#wFTuit^#N^Z^IFk{#WP|IQm^Ln)->}1Tlxv zLK*hBB_Re~0~31r3A2DG_Z9Q(enWxI0GpkZk_>W#H1EAoG{qbPms&~64;B$3DO#LG zY@0MJ?P>k=Y8f1Qrr6$s*9b2Ng0#u$?hF+X>A=9u>2`y$PoQSS`((-;<9(s9`Ou#_ z(UHOZ{hC@q-nT(j7rQ1@K8PPvjID&9$-2_33tMuE_;l}*vAaOSmuMT90>9W;CH;#y z6Jltg-6PNQ00?=ZnbB^ADbvTaT}uhA{3WDi;;WS-)neo-zhJYczee7f^l?cgJ7NhL zmgnmT-)FaOk4c$FfdRD}%yK1vdI{oPJgN|zIKZEzXMvMeRl-@W9Ck=bfnOsj$;2EChpM(gsz zJlNf<$db>|jhmRqnDXCxI?8OMIW%etp z!u3`3B+6kzn9mh0PhwS}2)&~bbdMb#v#Q6k8n^nzYYeuG(T}M)x}r;`>uZm>i&Ne- zNuI?RGmpKP)W(rs2Mz@rR6*?3gXC_LkH(98eS=I2d?qAcKJn3i-J1b#iNzrv-N)sI z9H9`h9}fgJKg(N|SrQfWqWseP z=BczL1zoWdaMypioh`xZ)T_)zV>D;|xU+tcx0)|!7UNO{RMIg1<{yzQyZ#ZTwjLCCO|CP@B~Hg9;&uboU%GKGh)0l^g};SX-^s4wmjA#cF@~VoeY?a?nr$mt?OSkd+M*S;ZSM{BiUui`lK9@6+HCeG$Cv;JrTFQfg-WZtCF@k73iOP}O?4|cgT z#G|Jnk=2B3Q-?)frU|{~*8B>}+Fz`_`r$+VF;;VeuanHtcyZAHd)z+r0l*5`vXXO4_Q3c<)b6ah}NXJ2%c^O;CahvjDvSTUh zx`FSU);pZi3f|O!f{s=l&YUfB*Uk9d%UceZ^%TikMjY&cf1!w;86Oq^{ee>=$<6EH zL6&5QQRhSi7IU?mMZjJrqLjB>f@~`b+&!;Y0Flmy9p+$`iJQVnYU*?FIwTlowx0f9 zbU{-KT+D8kD(D>0%M`Z4fy~5M>;QllZ4ZDquKao4>3<=b|LmMPmD$^y>UELu6R?{OIJU`-;`E!!+&6qROC3JGLN6^+^j5HfBHCQdcc!-N3ns{$|}}eVCq7#57S= zZKIAtco_Q+Kp;y#pgf49kUbKix5L=R(oB%=%g`7H$RN5PRDm^|v+bQ5O{K(rKs2kj zb)TkYzC%hIZ(8oFNs7%OoB_3Gpqo)IVNin2#5JY9q#gewkSe3~$#q?`QIg>|>m&S05T|LH zwP{%)>ftdvt+yquA=1SoIs;Tp>$YDq6(k6jB1ZWw`k^}IGTWzpXFW4FjyF_PThk}& z3@{L*{8#zjZ>-14-(QhGPU@*D>f*=tboy|hF4)*Yw!s|Q+b~&W$<+?Oj-K)mCGBST zk2Y88#_xRoVv_9#I@Q+MvBy}`K#vL>wIA+^`@2_N)d2{ZxowUePt((^;45bk@XxWk zMm_}o7{vO>^(Ekowfnv-YbhsmM7FHD2_SR3d$UKL4DfmEHls#<>l(_v`SM?(uCgqLcSdy+8b#YZei4iGZ_X92kx)|0Sa%KFa_ zVapc~lY=jb_zaE{yghpk=HA_3X7{RK$EOUQLR9!;aLXlR*Lw}zr2&p<*bnA<2pNqP zcMMVI{z~vGFQ0TqnOg3XK76tp=n`&Wvt@tj*aq+VF%X=%ic}TSZLVR<;FkOB*cFoc z0X!u0RQZh2KY-^>Gy8}8=Fd>{-F6(Up8F^~U&gvOP%PvAv3eEfycrz>vU0il=?xFy zvShq256Io2SJ1Rq)fiE?Mk>;!j#?q;6Ez2B+`o^UeOCgT5jXjHXB~V18sjbarlX}2 z69(~ZvQxjBNOwRQ>Cu#ymdo3r!MS`y6@noB0wtO_Y%i^oW9~T~3V3D!rNn=H!vkgy zRUK-uspjz#tsME9Rm1zL4!u#y6%#|m5L(FAoyl7-L{3mLjRT=FwS}kA9xS}ixNDy# zUCRElT1RUjwkuH;(y^k8EKxH}yl@U$KB$s9Hji;e?C6Xe;`_9GrcqUTS9EvzG1Xvd zeM#mV*lM0P!hpZ9 z!gAH$g5mGlHBFle#>ohA?%*gW=_S#{RKvjaBhslNPZWfBfYx|2C4nJux9SSHCX zsJ`PigYdvhJSJ>(ISK`=>a&#jB=X8KBK?lkk`U}`B)0RH@^`K5%yJl`6!)wPN~*`u zoZQuw)UV-ZzCn1|@@$va&&ntVDr!w7+YBI<1hdoWU7{lR%!#mhHm8Y7f;%n+u+iQb zcV4}rm3K7sVm-L`lOu5UYWSo(^8SvwV9Y)yzvr`rQp0By+mnnZ@Ui=r(i3G6tA)X` zaJC6V!y)wi%j!^d|Js3`gW#g(HcN%wHwbzAfs-Jd=Qm}ZM*m8Gl&iI(Tu^Kv!ul>% zle1r(t*USffB2y!#gNoHwJfV4I(gL~w`G#n>m+RQq-01tFpa&$szZ|n&F2}phAFR! z&>(w*Gpo*2D5f3EyzF5m2|uM}BxHgMP3`U+;}drBB{3~FhQd@31>;vF2i|RBX;I{;n zV?2mc%``$U`?GVh8qhvL;0QU*V=E913M_Sm-IPpzC1m_G#+V{Zp zi$kQu;ttgQY6W-v^ljclrC^JtrSR)CH1-#}45@+hMazU3{{)Mo)weC;x#J~6b5bd0J*EZ<-K$!25nC=xv~LbNPZLS}C;;r~Eaz?)}9G`+3BfI-QZH|1DM?;bV3 zJ+gBAqgrg=*7SgbJ80Un_c_8T)sm<{Gv43o zoodZM+F>NV>63K%lAH->RAbu0>^+#%>8`?}WAGyQPKXThtQgs}EixXqAQ>dQqk&f0 zEgiex9*xZ5b_@04>E>LT_3o)LTM{@{n-v47=3ExNp2YVmKF?u?3vF`FbLc(Z1U&3W zTjhqjR6xfl9RaiV*!4j;xGg_2 zMg>iLxx=0RP5eyPGRz8ZUJ6uxzdtjXSy<^A(se>oZMK2A|5vzA0ky8(68t5b7EX#< z`diJJVWYuwUV@RHv53^G?*~>^eB+NMZOh=pfd&pzQa7%GJ>Si^$0d!(eAgwdgS8SS z++$Ttg0ieenZ!3VxFW>#0W`~Rcq04eZNu2VE;<=X17dpX1x3&>w>yTY$BR~$5rJj3 zFcg*hye$IdZ(WY6+UGQFFuyRO1}e+s>PeBKvBCLU$Wr2k;~Ejp;yoA&C9WaWlsuf+Jmt9K=00s7h%o%LJ6+MdNCbd=XAKXMTIj7uDFqoc??Tj+?E(*IuEPCslld{IS z!Lrl}(R}3tcGOl#6X^UDN=U|$$A;BnR<)W)@=svc;y)mM>tIUomxjJlG0IfC%M3)f z0_+&*+Tlz!eK`iQT3!lFtc+V%7}zUC6jV@|g5eYAo2-8A=9)j}iDoCpxFK`O3w5eZ zH!ic_ig$ga=dP7cLSt_IAcSD;iEeV!hgF@=9RT;Ys$G< zc>X1-$Xb9mM{LT8S^6a?##kPkMZkyx^+_J?AbhmixO456TOl*NYlOUf1dI;ZIWnAD3Rf zTkQSu{#&!!L=s8GGEOnC&pjAV0vqRfF#(Sv&Tu;zpMKVDjM4nldYtom$G)`*FP%Na zGAa|z^qrkkNv3pXdUPOZBl;4GH(zH_R{#9(zo+i(FRy@aR^QAV2JcaHs&s#nF6e6% z%5DnHm}h+-WwphU&%T^kYhXE#jUHN;dP(mHWSsJ~O*}Xunr6kZS<+K5S*LSkJ+AoP zI*{eX{tv)#YzfoSIcp9pcZ(GQ;xlfL6`AKBG!#l*sJj5aS> z+;40_&#`(6*|ZH=KYqE19HQ00AgS8<4fN^ZLGXH`s`^9(q|J&LhV1H=R$;uYei709 zx|tqI-Uj2VpjdM0d5oBC8z)Rg|J-okjZD!`4(j%^A+8Xl-d2wao4Vb(dPZ~Jz(-7P zR_7Yu8Xg#nHuc$ea$z1pOg9p7H^+U=!Q#RYee!%PxiD#AIES%Ri4{rA z=sN5>mq0uOm&Wcfh2RWnp2?$V0(Qs`@9Y$q%@LJ$e-XK34 zl9)(ad5{+avyO6 zU+q6dgCl}wWy-sn{q*IP*jqPXYa35ylDlHsDiN!5so?>y0}|uP!6`TjmTuLr1+uE0 z&FE->>!Oaky#7>7a4FX^JkaaY?T62GedO3- z=nk-YCDF7IESJXRI_&4KY;K!GC>kA&To z3s3&5qS;U3Q-5j{cw7QI`-nBkA0EbtnIEN*@T1``WlKM^1OeztY2Xm)Bs}(p7ddFc z5cHk)&%_o1el=w>d>zOx2k{&<1)*RlzpM zow?Z7WMMx$ozCw3ISl9z6=>EGotlblolfC}BBVGp8yAEI3%keqs)AV`U$Z5UskT9` z1E;cMcnb^+X0X~eMxRRCm0)ssJtk#UCm?pLP5VZln1NV^s81MpW*UhkJd+;2g~nR@ zbe~BcOA9STG~M@1#Sp@YEgI0kcqYi^rXuw!e?+^402lklQ5S$RM2to^USM9Dp=%Bg z?X+SLCTSp#tA005coKO^{l0#XfDNI(Xo#eYrpF!gL##P}Y7oz%=HZnrR?X90%I}iR zuK61;wpjv%yAux4cHduZJILF5dD@~8^z4)h&@Nn#Z?tqxXsw@#j%tSqV*6r&jy($n zd6BztciL(HC}5*=;8DFf^w6@RR~(X{GXkYhbwNQH1?Bi%^0XBS0^x9P6NVWtHJHAC zwaXzNgS)kKEK46!s4Kgr!1*9AzD<)!SdrPWiQ)_FgcBA zWXio>lQZG~4<4CAx8S}d6jMY`cShuU{JouGieG{T{x&2^i3s}wh#iIeqx2ERCPZBP zRN?f6(LdNpQj!LpZ8vJkEU;*c7(BBSsuXyKs!f0v!X0x#d&4p*2^3XMZhA>$8;V2d z9#o;YBN2$fu{bU%t!c`YU4yBusqG**X^CN2orR3E$^ZSB@6~bqaN^8~3&Bu-9W(@fR)7E7oN@kzw^^Jl#irn7j2zOa^maLoPS$^B)g|nzDb&O9GlERkyP4^jiI;+a(J*FIP zVJM#A*blQE#e6%&V);828YFB+pi^5Nss+H^CK7Sg2eZ8U^B&)h(D=3ANWv708z;`> zv9JvDU8?@)*hdDO98m^|8^3UhN*z#PcKg+mSk-tRU0KH&?qh$5Q?CPp`xSjMc*JRQ zg{O#+Szj3{7lpkzCyqu`zZ-=G4bUQI^4$58LLcg;E4JB8El6TM+B=>|Q&Lig?GGNg zQ2a;-iq6h=Qbrc<^r-;%mjVGY5;q>=j#)2Tct;~OAuJ?OCQ=CIHZ%oYvEbk%+uET! z-fZ1h-$8LBFCkfIXXC7s7rNw{2kyxfVt__Dr%UoO35Q^FL_5m{4^~tm=Vv7XUy6 z*pTHC&YcFxEKcP*HPjzK{?NeAdzF;PLBz@B$abbFa(-Ed?HFG zxFweAd}VBpqTKoefF&)1p5R`lUBP;|Ts5iTCz1-%beHs%KkypUB!t1Wxf0^qI9?%d zaH7ofYWW9Std?pop6$uuBY9GAG!}r9qO9YB@7PJvs)1*vzzJfqm@~Dk_#} zO!eI$>&)mi@=!X+KX^HL-#>@we|d|Ur(!A6HL@})T!I-8f0e645kft%$KvetO&7$X z(_7rH_8|%hV)7LIh80FOFPxXCh6#JPNt`Gk@!<#cu3)fy7~_}0PsH2()vQko-6}rK z@j8k?jU-&};#&UzB&C*BL_aNKA9@OHM?WAQxQ**jraj+WEE%a;DhP|HlX7;1lZ_Xd zv@7*8CZ`TDvn%kr2sRE24Hx3-wK}>8vwYOxarlkOE~>tI|UbSI~c&Z+FU~&4>{Y zE)6=2Ko8xXev|AD)=~*03}L}6vA|;1Wxhz01WIl28wnUKCc~Fu-2~fUm-_`su_*il zkcrVRsj)hWJTsD}8O4@7y4dEhy!z zetaJ?8u>mQ&dY2 zLNYC56PWKABs6`>xk6cCx*%X5x6$H8j%*2o&8{i88b%E%aI&zewb{jOblu*8s1Y#L z5sHBW;dm<*bggV1-Tq=0Tv7SDXlEt-n{nTn3uUd@#7Lp)l(tm}8(NQZCxfLN`UlNH z%G6eK>UUQ-L`!3m$|Am@`I740PW7B6%N=ny?7cWR_=$?g+u~`MOtl`q{iM1=P)J3U zic=;`BVuC9$6%Ne;F-nH7`~^$ruLgzc*ioW7Zz0dkJUkV1$e^+-mzuZlnv^_RuKZY zCgsmvZP#4rjn)w)k5pUBG?DYgLDpbRXA!O+1hKYHrEnTcR*qgnUji4@3nzi)+%zp8 zg{ch}s3_RM!nnso5pffPL>O#M^JiZ z^a3hP)dQL8U^`_UYx~tnWA;^#4Pl5bFS8~smzK7TGdj8<9aFOM`KL&Sau5>n_kMGG zKQDJ6D^d>8_es1k;%jR=%h&)$iYSQKZZdFGttC$#nY!6AB=D^9o&;SC2yO2<4jS7ndf`8)zpKJmZeBL|3R!P zWnheu_=v1jl239SC0YRV8(ziBBb1O#*6J9LTi4E`Qckc72su3=g>Ggc?=CVKQu zA5OW;<;^A)kNCJlq&tJ&MeFO;nuXUIB25e%V!wVOIkwW}GBd1)5d>$d!5G*S58-n zzD#!`44M>v%}|qrx=4WmURfTX^hlVC5%y0OHKkQ!%;8)3PYULRwfB+K`S8k?C5gj= z3?)^VR<(*KWG5{nR%;tffl|r_B@RtOUxlUY)a)rBsE4-6|K%y_Cw@Am}e2I1X|w|KR+$Ev4y#EGVo1OvT|Jk9kum)h{#Ch$}PVl4M` z_#69?l~dT2+IR)rE!K3!4kSveUwswzY8-AIG_?=ZeZLB^Ras z@)GmjCepZ$DTtGHGpo1|jD&C4LNKVnZvrMm@Ju)T<%#-DQ5$QF*tPB;7ZT1hI+WMs zS9ZvY96RTK^^@bP6DYeeaVJIbY-4yNeTydthG23_>Y(we!{oteXyp2d@^}+6o(7{?IRgxSpH`Kbt!~${JK)t6d8oX1c**M*ryw%_e#1yW|H+@7FuYy5FeK zr2gbjG>SZb;SB@Pj>&ih#Df0NJzAe>HbjJ4caA((Mkxvjh95h@UF-Z>&p0Q>Mf{|n z*QH`E_j<{+qhFe9WgYSnahXTrnn+JMM zi-U9a%3g~Wq5I1#j!>4C$Of0HfKmz7qXG}>KGwAn(?Iu^^)K_h36s>jc(<{YgPsaw zcOFC*A0gLKqyjGr`fu{b7&>U&m^ueF!t$PTji9X99eC(9zfIG7rdoPO3ozg?JV!8| zTO@_cvP|^?Qxp<~F6?DY^7`)6)3R? z6MG{r3NifKB%AE*pU5a%Sk_G3mzYwaV~=_h5}`R`Xul4d+NJg7HNG3AYayz(1O7nb zI^Y2Lrd9FxhwUemXxw%71(2YOu-niP6o%BQ+xEik?LH|qzG^#ivqlSkoh@1syu?&H zDTE@n5?!e_dTmO%R6M5HwqwJPhcexL<*$~nh#ghIW}4Z=w?BCo2{f?iGF@B*zKHI< za3T0Vy{({Kt*_8CrD(A`nRgxgpxnAS&^xK!*6INBSd3{rNb{DdRDUrLBfivRn(Oi* zl)nCW7)RbBEz|G`<%!8Xa8EB{14+}%r-FE}Zh~G^H)MUBr;&r6OIE})j0{}a^><*{ zLo$fdcGKaM(b7?aozd((X+^m^ez{ge<#HekK9Mw$24gg_U={3|oAhZeqyK%MVTnfn znHM&V>%WD^vTssZuQuS#IgKiXY@aB-iyRo={iWQHjpX<@UhOYSgeP=z=@QmkaqL7V z2lN49nYIXA^n$RdmeI!;F6kJB+-_94fe~=7wpzB%zRLS6q1{=|?h=utET<-ZpGua( z1?yz&Wgh-AKoBAVMl`AJ;P%umKwvu(qhQzzwM@`HskBNWM?82|f1hR%Y!QhxkzQ1< z@!WD+xI(p*3m2AjNTf?ShF%o3XEu)z7G>NSaH^v=qyVjopD0Nv+~U4OUAOgpTJw4;Lg-5Dw}4gNtmT{3Az(pWwhGic=#kNy5Tx?GZ}iF^r@ zNNknfjRV(arNj{f!x}e)mcZz}-<&KHh{>8Li-{1xh7L|8Zxl8K{zwbfy<2a2FvPhL zQ0i%sB?I@@g-t0?Hg1+bwx)GDj~ScJe=xkNNsIDN@hS2@0RKVQd&}t43mn(m&{m#a z>>=Ts_(?)K+VM7`4IgJ)b2{juX)6{sR>{tCx2{;(l|;r~o_Idk;7um~U)YtsbXMv& zP>TdVP~%#5SXgDt<%@L8)-i2-4Q^b?%k})tGnX@1F+i4w-4KEE^4=yN;B&4a-=t!J zM;U3^nc2EY?6~bs;Fh=yt`;kLi7$2Gyx2*<-fs!(C0T~?{a^>;|gvs=ooqP@@vs7#i!0QAhHtiO2V zq5gS|4ehffumCkpES(${_Q80mOf79JR+(Jqrz&t#BD{25Yb009#rplsj1hvjZp%%V zU~U{U`FA8n?KNwE;Cp_Ym%hM5IKMQ!jJG{#O<4Kdw54D6(Ph;{M~~}@33oxVdt?=d z9)(b!cua2J<#IBa@E|x2wRo-b(Mn@3nCW=7Gm+xg{{eYGhQAA4yt1Rxq1BI4;;&+@ zaCX7tRt>F{qaeZVo*;Dd<`^(-)Kn}*EH0qeBj$2Z;^VPh^Qor=*CQ#=rHb=VK^Q9e zf8?sbb4OAB%p%qDmmVs#5wcxhaYGjEtX{c#Vjy)@vMsoKl@Rn;cYlpVM!3lR;~Bv0 z7t}&jQot(4Ozt*mysvePc4B9BH^h6)3e=^ZlLoypC2R`~>K>#Tq}kSE&}b~_>M_E5 z!;JgKLHWl^+=iteQX13thc!JIGibrMy`iP zhL()TGAqsIEUo}r!fxxkFz9l=wWmk_e#exlF(o*4%BY*h7$ZS`i z{FG}om;6PfY(v%+$Xdd=<~UXyC8OdiWaWpv5T18WVB%n8M?rB!GNb_=HAD;4)!?yM z?2e0`>-IQ+R3$9~jLcwn1!u);(iS?QPY*0ycpHE+6}~lyE``Cxj->+$4BasJjpEE> zwt?z$yt3(|H{w&d*$)6@Wp-{krC|4%^ieh_t0uHV^#Vo_gzlW&NNufP>BlnqVVpze zwJMYWNt)99%atptsA9A@cjMk?q_f!s3q8Aoje`U;`9Kh4^;8F_0#`GXiR`)mXk58bjE`G4it2cGYv3OO=@+nxYtiYO-7V@JjB* z_cODeBZDLiQ%{(NbdQ8>MnGcpi@mLG`IVEw0`XUWoXYr0XiIY0%wW~4qXFn}c$Yna zUQ|@Wmkj=;0#@SU*t=TXv9R>iAZbI3sJ`g-ZUEIkbWq*iXLHnySs!Sw-?J=B54_BA zdcyVT)lM?{FqK8O!>H61>})z>dUFsX>n#;YP6H6|JAqF8zy`i^MNOhiB^6a&5HElo zh{^G(jh~#y#}88cUg}ka873vYn3fkD2nEFUPI9@#H&#D%Simbmrn-z$cUdI1GxGXmR@cM?OSyzL zqf-HgF*nXBn4m?AG_8PMJz*>? zNour^EFUx~ZSe!`?G99({{RLG;UKn;QV*c|%N!@X74Ea#1;>LhDPB2wYk7ffU}%Xb zH82I6da~mbeCoq_5k!2LMA4FtYJ6r)HYH6q?*5OWhaw zLpp%Mgkym<44fu?WlH-UM~IPbVcWYrkPZy;oPuoJ>r(g zcQ06dss_AE#WCl$2S5v_XnrN81+{?qu1cA7=A30C;bsBP$xsYgHxUHf)!Ibp9vAOg#x3`#Xa?@`BKwLrUcKt@x?hhg>BjboRksHgRrqz*@njvi&u0`A)t=%37 z@HbbSVq7QqL81sV3oJNzm?iz@9i#0sB9jJRvn?_PBF$^EE0^3yZqFq}mTBphc0Fzx zX~3APSs?F2#3kDLVj9r;Fz4X06{YS@8T?DM-tjIEqZL+%ET-lz_qOG50KoGs!(r)( zf}kx%fD2c_DT@n6#JAM*3Y4CF1S~FIsmmNQ;Ke~xb$O^1Bf!D~?KNe*C*)bBPh^*`2<-Hi#!n@` zIz(c8LUS9{`<8%DAj69t*YO`fL2l~qUXX0TJ(;L__WVR}{XrD3vq8QvFo{Jxz}3Fw zAE&7SW8jx)w~2hwUho|w-UC@`2e+(1z}m&*id^3=37|8AlR-d3ecB0_L-1J;egUGlK3TM7WE~16VexC_^Fgr z=b5C2W5cq0I@sHh#cT(uD-Hiz9%b_BgzzVRt>UU9^xv-*h>jTc6d08%unD25L!-WFE zy^=MwiD?Atm4#KYYYXCmb==EX@Tl=)7d3r9oQj}!Vw&KrWuoQwOc1PZEmx^2DZ@gW zlUyPE#`J;T_=Lr0RzL+mPxMBIya(|*Z>Ue%3YMAvkPdF(xHyENENq}Q=UUCZRIF(x zT3oMQJU{`eql3~lBRx7h_JjjZydfGtFi;fRs1;w{E2Sx++YL*#ZS2ktqD2`z!ci`F zdJT?W5Ox*wo;?Ubgz-|DNc3VxVuP2d0OU~PE1HJXhPzYLgW&K^aQED{#FPr0Zeqk*L8OY4zXg(QivKJeVI`MFPl>OMf+zqkJw$t{QusX;;W?trftL}+# zgUPrX?&dHwwZeB0k!#EI;S6ND1y7NR_@+fEyK9J$QvyhRX=}_a)C*15H)I~V3Kib> zoG~heom=paysBJ~b&obZY7!p;FmYoqRV%)l4`E4o3CJI21~gTPe0Pb-kzh|!TN)i$ z{Kc88$$t=-=-UFFW-2>{pNRU(%VoFsDdj0g0P1ugy7q_Nm}A}yyaO$Uqdnn5wf>l^ zL0P+oQ!QK;)m^P>h-upN$Jo=>SG7xR%oy=1RSVThj4TqqPuwkTh&m6(DU}}6P(LtD z2qu#-$xp)!2~zHnLz{Y$c{TMHFS>0c_=y~jGC-7)3H(Fn|(Vwhc5LjDA_AqTt<@OKJm`;7lHRqAh1CV-V5L*1u0V_ zT(M(F9(S*aSnK9#Q(pYT$59u8V2I`%50q8H;1)lKbZH#+nF3=boxmN%_l<3n!MIUk zhf7>D)@5D|#ViKy%s*(zG0~F;M^F)_@a8hr0S$_#$`xYf&w-Yu!MNC;kb&f5)?GYB zl8b@>@MUYX0_Q0%dtd``YtRUOVM@nBpOZ4O>~OcuA|wsuZ*2)ZW;i8P5zARE^KcN1 z1syCFdPjHS+x8LngrH8$rLZ-~N{Gtaw@dy_f+c z$Cw+sC6)prcGB0E#1Fkb(Ath#*O)nErSvi*)>eQojeaw>H~l0%BGY((6MR1j8%|!Z zX=8Gou+PdNz=7$aG@kO|l0X}NCSClMFQSTJ6)xFlv|E&m@wuW&pNJdYxM5ou4dtH@ zybVQks>+hU%Fx&a5S9> zh3WvSJl*p%KwH6smNcV6fK41r{)Q!>)%6_X{{SJdE)17g`24|Ej?r6(S+?%hSoMc{ z@n}*`4Xc*#h$hE@<~GxbfGEy;&zR--g*$QM&#a|RK4QxbCJx}8M^G}5Ii;F;`G6C2 z5$;@Sy=5+Yz0Q<=(Hn+pn>w2J%JNSbsgvA^fFK4N79GGU&{ouGlR2mWGD{`3f%rq- z)OB8RSUj-Ep=z;CV69vWamp$+Rq5R2wH$*8b34jAUX-(5xs-?ovJNk)li@D5(ZL2# zniop(D(D?7U-C4~aAen{RM_!?o_|6EWEreqnwX)tAtTh;49blPeFvGDmz0ODV%KgI zk45X^3=|j_?GVt5${X?|aRaOGMEp~Vrqw@V?@P2sz=PfwqE4;gJA>OQiYxT+;i8%6gWq`u;P!H9%rclR$UUNU}PR% zBi0fF$Csdvl~fwDFRO#Z7zj_3n8N}vUG5&xB>{}p@7`#2*E1TtN{X&)(qz1Q#6MN> z!1s!;NlN@rA(^LiK`Sgj#2(TJ2D0$ow z!Gn+3F>uj>@}3)S-Un{wufH}A-XbK47`&8JJmNJD;=NR3?GynBA;zlK`^z9uRTrg{ z$81K;QAM`A`R)kfcv8L!M`~-s_vTq#mL{u4RWDMdgykNXJ|oakR%gL|;URpS`yb*4 zv^K?f7JcRM1CPRyJN?7FINXAe3YL!wWnz|}z%sO~9#tNf_pGuk=f4qK)x!`tW?IKZ zY0Vzu5+#}F{{WL7#a7`Ae@4|a|i~;HKp+lnEWvza_GbF3Y4Cn zBS0z6Zec3?24MEx=ImxABi#+YFa@o3p80?dlq!n5Ynf1%{1t!lQxmrsl%5Apd4jm6 zaTdf_(&W?~S%?A_Pjgy@P&1Nm+*YV_m>r})WE7fvWjlUld@f2uzNJQJ@niE)ObGfn z1$i+5L76x)RqYNlcpB6>896@;zpHd7$y`AH05T&etJbc7j#7_1^HCXjV`^UN3`aOA zQ^!(_EOBJq9YGjy+mJS=m^QJjxG^)pLD4(b6>61oqRKgZTbyJ+ zFnA0?pt=@w_?py4liKk{5+edtX8^ua&r6lmEGyB(O(ILBA9HfY{{UJ4>`hi{-?qz22tGD>6M{4+keHh_S z#Cb#}m6dPYKOrcCudTm{UQN*H)}hIXaUO*<)T_KfsJc+Pg3_-g3~W390Jwxz!XxOZ zVL?i>sc!>oxC?o4ABFggEi2Ym$jb#dv8`*&u|=ER(d!bpAi4s@c(J^}4FwJtd5c?i zu+|GuPXWIMphRw}hdfivp)tIG&!k80M60FiU(C=3)KWIeGN?U&kxRUK;thl9DMFcJ z8ir>eM0B&s3(y#p7_h+L?pC*Jv#A3Ji9$Cr%;W$*Z7rJ@e2368aj4iwY$al*xPY{1 z>BK=miM&$*0PZ9ZY9PNJUy=U+A>aUs0ad7Z?eIdJ##(dAzF9&6GM09Fu+Ubyt)7e| z3KUS%`lYP}nNe4(3p32jS5V#|kN_=S2-j`c0Cl{}$)lis#$`#Dw}7a6G0m2O!$Ii~ z3qHafAyzh$oh*5RLyAyXbu&Sxf%3*<$D||GcI4_)pp^NEy%mf$pCXYAZfvx39q+k1#IRBICI*CycVgis&N%3Iin#Ci=LxQ<}DilyTK%Sa7C zcWQ|ls!K+zpS-NPrE7w97sX7OQ#pDi4h0%T!chtj0sO(XrDD(Oqol#4E#T%${)B}+8fUy^kNnPe9hCee*{6W=4>PwVA5T#yLdi+iU zTI`%=0J4JUG+bD(1&MVw=pc;HcFYAoJB9`2#y(=O1mSk-^UNuL_kcDByi%&Gdw1^) zfaT^>bov`Xfd}HZ9nQ`e=r2_(ohk!$@u`-QE^nija1_`aUV7KW7&g}VD+oY1J^ug@ z68Yl|$`32bdBys=AlBlpmlemfQlyUDvkC{HgM@spE;MYYAN7IAXuP=Bu^lcn9IK#! zguVD)gVGjETX#1aCF+6?M#{G3dx)zc1Ko497|Vgw z6YDQ7R`C76N<%DDWfg8>`SDa0$bz^dUBNb>Rr- zSBOGn$9EPUhTr#=0pJP`6A<`I%I;7KUsmI{(1!IK^7)wYKG}|AydRJee?gZ1QtjM-1eYoL<5a11ZhG(X8cSv z-@fC9h^>92W*Yp(nJxf3$h1!CDRvF;Ps}A!@F7t_#}gKrddy|G#~gPaaW7m;%gjVu zbPMi^t$;Y%-H6|ezEyrmlBBTC->kA*AZPxL>HIBxb9ReVI{m(i$|EKAq@&(g}5Wjre~hBfo%(+imeWi2M1eM_y;4{RzD@0kKUZWN6=})v^rj=+r^(DYzV#Gg~ zWUCDqe&y{O);Rg%B2d6Zc(QfszejaU811K#%qSDYpJ{$+Y*B2s%S0x->I2a=Fw{q` z$QLMeRTC*?c*oirQERVAqGum?1hdd*K9HhII_U7O@0f{o7hoqEnNpWBnb1xOvpi}f zU|J#VN~}rG`7khIprV}jEm>h>26>j(Gan>{8xF&&AX|#K6l;95TjBxC^_E>al=Cgz zz4ppkh*#$l&gJNhE?jOHFx?Q(7Zh58C1@g);h4wX6j8@L!qvvFU2%$IL0t((xW!7g z=QoP^s7h0n`G-@DoIwNA++(rlsC7I)Fv`|Fg)5@?<$Ont1L<)MRozp5uyOwYAOe`5 zRp9i96%pij0lSx8W6RV^)L&eBMRD1`5i5wf4Oid9M6?(rH5(qYs^5qgxkW{d7WWud zl7o9F@funwbbgl*Ng}oexCq6XNP!pYMgzr#K{Tbm5DMTeN>2}bN<(Ow^n!&ZN>}fg zm;(DJ4WBV;Gg(p2Ta=T6SWkUHvt9M)Pqb}U*gVT_ky@db-I!w}YVcdNhO48-7HjCD zJBo2MZC!)>{7Ut68Z75`71G%n)^IjDh1(+KQSLAa00NNlYCWc&rmLe`hgIn@ zRjmFc(R{9@obLYsFvUL}uw2~O#v?6+5DmN*BAzJ@lVmY{!tb`hP~$e76y?s=I_!J7ktVt7OOJ=$BAjq$xM0FrdM$u(#<)IZSEBp zpK@cGHJr+2FnnTIV_zhtweLzWE>KIx^%un}o%kW`mfg99?CKd!;p1QkiVp_ZvrYBC${?rdw#_ts z3;adaf#pOT*Q{rCia(dX;uvl(n>@zsI(v;1GeY*i*@mL3fybhH8)G1pjXdS@EFLC+ z0!$=5X5fO#!L71JF5PfuWfG5$st3 zZYB(r@JlBHi|SiS8Rj_xTaKb<)*yg~I>R@Ub$l?jfAm0+OGSx~5HQ{4Sz+2R0M1p% zyai&V<-KF{IlEqEz35+fi5y|Hs8 zt9fcG^B2aL0b(eqtkKSTh2MDMj99h?)+tuP-As}o1BDqNCZ2pd~1d zcM_Vdej$bXLI)y&6_$@P6)$u)yUZhV^{EQ+8_-3RrHOAm=s^I~tPrdja7DwSP%1@q zrxpp_JV0)8Mh16WyOGrUKAni z0J}=y1K>d`)gN?J^puj%Bm2N;8?1Hvh8JRYkbOTyaMXX&p&q2XfNR%?3b)f!K#x1(I?=uH z1v$U%#*uADvCH86#j(3et8uowxBxf-`42PU7$nr)zF0Y1*5%x+9#%G1rP(hAypeCZ zs)aPjmOAd3vqiz;BbXpEUQ^JCmEZ&op`0AGFJV#G^4ca+ytwmzAeHQ;Tw62g4_y{4 zI0K_W<_W67S6IW(zv3JTL4fFn>Ve^;^aNILexOwW>7LUT&sGdjL&z1mV>~~xDahtB z3|+BYnqtA7?`#9+D0FpOg9gQJjKx&+Lg^UuxGua(wMX_;etGRnB)xB@U69IDf1MtA|a1>?5 zl(=;pkW%^+ajHW~{LNlpSxlg|E8!Z<9Y#}O9$U-Un|FqdB|P&ISdeiqgLt`nyv@7~ zl;dy2v_M5Qr27c9hH>}e94ro>aZ3EkEls2Ca*YD48W`o0-^4+5%^0Z0fmg9_`Kh6|#zQqHugu$ybq z$1o0N9O|w#26dFUQqCLAYf}rd>+R_rLk~$+7Oe?I>KhF^6NV&SJzyci7C8YqApOHE z85E+_+qbf0#)FvQgR|xpf+6pIkOMk9;%`|l$^-2Z4X9LH(zN0uRlH%11sE=1{N=m|03Ged5V@YtmL0)ElK^7QjW-m4Vd00+gw4 z^ND(mgJg|jPZnm1iv(=6k;HsPok4PXQ3ews( zwZY7>))54#+P>hCYymE})UhD`PB@kKm{RlnW#YyoZaRoEoLd$|Fj3+wEW9k_xnP(c z+8;-l0T?FUq3GrDDavzDw>~4;7Q(Zn{{Ury77J%EEj3?PDX_BliG=GAPQ4&h8ru}! zMe#7enWCU1FtyDOUSmsvZgMY7v^@h*EC*SDXSbWVOIcTDWpH7wRHa`|u?mzN!5m7g zFSEI91>@dmW#(772?5IEVIY-nY6u$7HjF=U{{U-q_<*OF{{T(2Zo-QL=+P;?;6s}y z?H(vhfKOtuNERBQ3Zih)aVX$yTPpF1kkcMxvv{M@6fX_LQ(gj)izq#nRSM1Q06W() z7|mtw(XW}oapU}^Paps-a9T`$P2c=w>svp(M1unM9t=vEQWtdzmbfF626O)alyI^d z{{YT0WiJ-|#lz%)@>DGjQ&3ecF7>|9Qc1#7$|kT9wj{%*3v%4q!Qt95 z!yID{BH$`ojYnQ_I_Q{P0G9OBEKFV?bJbe@wSg2i2AtgmRBKYr#-_rGDL7@ETBNjM z(imZ_^7(jyTMqK2yluh_RN5=n9LwSXR3)vCWJt7qpzzh!FF)kWeOxeN+^&)~2zyuN z9Vfb9rR|7&HgO0nCMdG5Sh-YHmxvhO%-A_1#|4*FaiC$kgcd6f1L#41kc?0eTH8wm z9FcQ4WY+>J+RM5{u>6;u0Gc;6r<4)z*_#UiNaP-4N4lYmkr~8VWFwisi}4u(vPct$ z5Y|pZmVxNnUFfM!SghbFQs5n=s8vv>>dU~Iu*6G30roa&^QI*%7&$bECkT|C#Jw+7 zp$NKyC! zfYKF093v1B$a9Id;vh0ncf)_|MHwR2e(*a!U=a#SX@a|fjGr(uljc~{<`f#t7oYHD zEk0*K^E(I3STX9Q*w4kzv*vZ5GWMS_ID876>hdS7!o%iupD?V{J(1f$D#U6>%=ee( zBG!gC2|*l7^DYq;7Ku|-gtO?d^Z6yqK8%qD^Is4lt)P(sR-u#-wpw-0xub}t$_k>F z09OZMio%+9v0E(#N!Ct48q)*@vRqsES+HrcSWvCv0g;F!m>MkV!c}Gfa3w8;PDNC` zZUJdg(F@4r3O3Pjdk~VLuthS8xvr+<9^LHLNOpLm5lLjOV95r)ab%HiGQJ9nQjg$? zVCDu5#5S{%wCb*cEagy6h+v+T0UL6NM`eUU$t#WOU}7mu67IQUgR8G-gM;2vsX=}5 z0V+}}k%@3wNY|wIhUbK%Yw$z6nI5csNPNmt3RXhmy2bS?U<+YA^)K+snbcz9l$LQk zP_3rUYFumBw(Se34MiJyuH_Z47Dkd6h$}HdU7HEVVadGSe^ki3SS4>PD;%zU!KjTg z^vUJ{%dX-W0KKLm-O`+51t=bbATb`7Dk#eaA7~Exa%(;&p;q`InvphF7Z=_utZ^3= zR|+ZisJV_mYuYQ3YmteEUbugf*lT$Pe0MC2PCxLDThEW^l(KDqScCH$W6Q%u03B5q-KusjkgQvSg~Un zqpf_v;4MYIe`I1#Y!>5ihO%Y9I>QFw zB3L`FYFyd7&ihscJ8d4yu2Lw!a$82rI*lt_!vRA&y)v@q>kzW+v&1kSc!k{SQzcka0qbkt z;x&5e7SNK)1S;fz*qp05s9~;s80e%~n$92qfJ~(ly8F&iNkb>IGZ6!*sOjoV~DZ{TqZn{yJnF8DoT29yhf_5)4+F*3osf?0PIy5)j2U5;gv&N2N^LV}y4vze;c zAC={eDS#`ega9{hcm7O5jORCx5h;Se*rrV~?{Rr#X1T)z7H*e8OVMNi$v8FY5858h zM74Ed=TKIgFh;WUQTm8bn0kixhD#oOA}L#2&ZA>2435oyVP*>@2gx#QU1_o3-QW}J(vZ3;=h`g%|6VZCL!)kLAENaFX61xHHihMw0{KOEV^fi8L80bj;a6s1A{)M7h!xwZuNH!U9iAt%#ao5q; z_G7)nDO%=Vq_ey81x+;gVBv2$xCXQ15UCJfh7^`F2h~`r-^4dpdgff+8;CUn==6p& z`w+Ux(xnLlLAoXHI=I`h(7uwLtI*f1DHRPNUh#Y{g+n9KX?Mw;!`TS96T0eNvLns& zGBmvW%hfjiCLaExQQj?YgDg=ihN)KdfJR(YBKAb48w+qcx^h6?s<#yz)vH+t7HvNw zU;c-Sgbd0UOUwx)c|-%T0Li>d!nb_9fD)XX$R$~DO1z{U14uB-Mrb4(tU*MPZ!sFi ziuR56;nhXB39ITcDg~4|`^%@HqDt6)OT@uTv3cg?ux{hTeDX|lCvV@VuysnE0BApqYFULOZh=M^5fwMvR|l#Fbh0q!a(Z-IbXh7g=D~?qX3SXmlt;w zPztpkWHjI?s`xp8nL4$E90G@(%i$Yg*x}i06zE*yv}5QX)yT17LGu>VO;z#!@q7jV zdna&}g;$5$EGWzh<$Obdz-Wr_xds8-RKoJx0AZS`eH7F%*$}{Atm6$br4hl$`#;0S z`vSJ#kM>`jLj1mvq#O7Hc)QJ^^HW(Kef z63akIcB{;IE-Nma!ZmAz!!htGr!HRxk262Y@W`zl*ARTLW_N?DXdvDNXM@Hl{;1ME zVXXFAF4W>#s1toU2(*P zN>mMB#89U9q70?4x1_);;tVX7v8aQ7NZ%!Dqe22xU|c&|TA{iDVzrYH5;Up`ol4yt zh0Od6qNl2e5q*~YvfI4G>a$;-B9&lYZx9e|yZgenO<2Qmc&$dgV_$*8ss8|&k3YnW zsQn?(c$)tJ5`W_-AJ|GDSeR9{{z5<9^AG%AcwPShXP7KeYvdL#{OSS7{{Vf@=)ajz zf1lQ132Fc=1#8(czoXtY!}@=;#&G`te8Hx~rWyps#BiTas}N6274o`^Xe!Qehdjrh z;Y$Erq(1WD9OxKvuw{^$KT3b#pmGI*IfWBT7Ii=HQx)U&CpCG8ng0N+PyJGV>XN-$ zZhpg<{?UoYfQQQeHx5HDpNqUcW3uk1;AyD+mFQi;}n7 z%mbFbmLelxL`aa>ETwu7L85|ESeYMaM=0G=(dGzts*K zg^ziN2J+ds`sz{OwpF+=pj75!g1_FQWtwQCyV@C_iFQzDp&PJQ#h<7kByfSBT8iqmN=gL&hXz(1c9!30Q_Op(q6k~Y z0;kc$LJa;t7_y>#XY-UnsUO1~g~hepJxwqGyaPnKb9~$zUMSp6v_hG>uMlq-^SQZ` z)=<~10M&CAfmfVGa$q7VjI)>|$1;#*cS+(YBGznGegs*(Knro5$uu*D?Uj?*Xu)diEXZ(D4-nRz)V1VM(DSz>}uhPw*}8n~?;Rz}PqqL&!e z?t@)5m_V)67rMfdVFaoO+M@^S<&7XzR{^v#kihh%=uC~a!q*n)GYrs#ZJ;O8`}PAbCQ9o@;TNMdiGGEtb4dMwNC?#1|CcqWc0O05pQWigO&Q zWx{&F{d6?~B~_BsJKsqdx(AU@FuKGBld`bV^Tb~vOc*FzWqC`Z3K76fpp0Wf z3Bxd@7^MUp7PKYCK%qMZuIl_l6HBQy22@oF8-vE7k%Cbx`5-#w;g^1x9YnB)oRxNSHn8u=Mk~GWB10bPg%mj6rKuZ+8=JMmHiql*} zfh$s5OiN*e!R=PZ4ax#pDY{vna&rs{&MN!T@U6Yp<1>%`#|VKtKywpcwuX}!VdlNCR zqeiB%sIwQt2(>Lz+BhYpyorT2$Xc~|jie2m22R_&tQ5#P0=?43JLQEU!q$UBGbR8+ zhq5j41Za265#FyJSZccrxi5lY1p$E2n?k;0qL$P#Kv!Y1=}f`#S8+z>(`qB5V_T?o z+gd?r%ns5nq6sFwJ1vF<($J?^^C1N4DGGK!|@2Vy$+@^bC?Z_SH*xn3{g^JjM$<<~DH)3`HC}nYx_r;l#8OBmg~u{E$-vouT|Q_6bW*g0JSM zU#JK0%%DBe!=3qpR<$;Dn0rMym(A2%rQUs+%K4TGW(H;I%Z7@$g;G`1bpo`DR?N3~ zg0m4;4d{a2e$Uz|Y*$Azy1c@}Wn<^kTBi1+tVLX?I0>}giu_cm8a&?+JmPov$57yr z#bsrVQQ!TFlj`-Bl*jhw8*1XQQo%}BKjA2B6kynSjR8wO?<~FZ{=s0P=DVqeoyFh@ z2;Bf#oZ8}vZswJ>O-pkH-SOPLHp;V}-${&M)U1?d3oSMO07V!xJ>j1egA}u9C&LbA z!buLhg_Qh71n32PR3g>{uyYE4fUoNN!}};w)fhWiB~+*M4iEalf4A=qJ84QZYgjhL zKi~5NKcD7gJ^ujv%G?VKJ3!I7YiIO%kJs~ggE-&)W;<(;LMU3YtU+8M$NsQy;rqdy ze}9V44-(~hDL(%2ZRbXynz&YOX};(eS#9vd+&xP zX{}h9aB~Y-<>@VC*P;|_euzP&aAxxjGVSutAvPDN$SaM@O(x}3tG58uZX&iwfk9Kq z17&k4uK>?iNxYjaGQbHSH30ZXoNW*mY10b}=T^~-P7^qFFV&oe7>EN3ZEZ?ItFgp5 zUM{Jqz;bF(%w8ZW)Y8g15{7{^0c7wikz-IhvfeIBvxjhlo}Ma)B9++)TnCq>^?N~A zgvo|7%biT?Ca|~auH*7Q5Yds70rw!_09HaePYh|l#}MS&o*Bt`ja_fjReQnxlm*!y6WrB(JQ%v4+dvlvRFoR6E1dqL4#_z-l9G(G*f1sKsFrfLvhbkvepIKDankTN3EsU z77G~`-U_%dL!}~EQ`wKiY-`Far-Jo3jv%T>xiiF3NhUOm*Z{KgA23_~PctgNq^Smu zf;U_L0Gz^XKfdSof6S?3G%BqcEr10x`Q}^xADEIMTmJysDLSH60AO27#8v!m3D5O; znCJ3(#vflaVZA6NkbC}rFkAk=FdRSMaQ^=QtE~VQar6ov!a<9P_@LOO*xF@-WAq>< z;yF783t%j-0R;5}GLd3^C4hoz;A^l2Rb`p^8UFx~ng0M%0JSO`Xl28IZKSlasK+9h zs^Qf}uTZ(4)G6_+WHFkU)(r|$D`eWXfI6Ehw9kR9SaJgMfI^7{l!DRB8g5yACodL- zLfG7YhdDO%zfd9*mLH&nMFr^Xi_^{ z-5FrIW6}#NvnF7n7l80XC@l-Vh%M=q9*l866FTU#=a}liry{b#Jqb@cJ`e5R-OR6i z8ptuQ&T<%mfRrrkY$yd-D#?ZWBjxZ8wk5XU-yd|g3fhhgO2NSvxuYKOUh@{*+ZF-n z!iIMngUbo~L4NV6KsiO}B8D`Tdpr9@`Czfl_Yf-Fd4s&KnD#JN54nuZtJZD_MnBn$ z60jEDbf^O_#^1bQfh)*bv@=A#_cU5hv{+;P;i$SbatGvMW1DnpyTn1IkDQ>J9QQF= zMfrhsda%FtGdY3vWh)}OF1=ti$>o)n-P>~&KQjWLz2!Q~>cYN$trY|h7Qm(4OT{bV zISsrW#TZfc$ybu7zdjhWLIH7i2eqY$ z599%@DFPJ@o~xxOc?evhK`0v`Gi~wQxRg)@va6s4wp0n;CsQ~G=SX0Lej=t*?b;mN zNyHedISLt0p5Ra$!2^6o5$uaSG4%#|v)yl-9MDbTBahUq}E~ zN9HB6+WnxU2^*!<5iMTkg@?pkq&i=Q4ODMG^dZ&j1p5SP_E>N1u-c#gaZ^)1D@8U# zmXGkANd0q;L85)4cu$bkD<=6K=3;RCxLWMCPqLeTCf+L)y*0(f*H+smf%fPDAn*$0b`s+S!(l8N|N#c!5Iz=okc5Am~Al0J z5MdPz#UQ3pM{a`s5>_Ys&4SQNJAzi_?g?MHzGpJ;)?OGA@n0}1@tj13j-QCYqi+8I z$#?5gg^iq95Fe*^`RIyl*gb?eQpwmZNa&iX$efn4a)NY9+Zf+-!jJrD9}xk8iCo;`KSg;p~tkiZY?I|>kIpr)zsywjwu#JcVa?70UV3Z7cFOEl+KK% z@)~cidQPHF=3>Q&XQa3r2o}yJ3{`3nUESoap#75cCstwZ3&D2*al+yn+>H&+t-0$Q zjFVt7;2cNZhJ&i;!OMJv2nya)PrSG~0$E;oi#q99Fg;3!a>O;XoR>@uS!Gb=vfH(C zun7Iw9*pH_w&%usfFCUnnS=lq-~hn|m6eN(n~-!$#R^_~`G*30qHhiPsry7qYq)uC zK1q(7gxZed1q;Lwt`kc(#_Fd305DhY3ko@n7O}PC{z3tmbHvVd2O0FJA86Nw63wL$ zOF}>bZEgA>6%HH!0G~nKV(~5$90`Ybdn2?^7jA3Bs+^G&KJ!wP+~t5lsI-Hvzfmie zb1uUMr9TtHGc>_Q?-1hz%fYf0oE=42An2iXp`Q_DvTq2sfZQnnP+>1c zV&wrzY`Vs)FtgPS?j^v zPC#5RqnM2yedVja%*B4C?kPu(DreuAcV93kIh@&WqGw!6D>TNsTYQ@Ij5`n!{nS9) z8Z6Ne*AaO>%B*US5qSSb>qy% z(E?DsnIS!L#qqD_gdF6e3%6>XfJm{diChy=Utoy9&Qk~n;mdb!HMg1fAf24P`oo+f;l z(wp%v0;e6rJVO2_0ml&Ca}RH(E6lv+2nGK0FEX}g%u=n?rcuPmxrORSGZK?Jng}A8 zxl#F*lJ9UJKy~i{w?tK2+XT2(Ft2G|V8CVacg^&Sg1kQs>5_#T;eDJW za{$Z9W%ubDMVdQ`!YV9U;OXUMt;+z+9i}w; z#k(hgaWu}3rcIcZ0C>)0rMlWhI;$59*t&li-Zo;ltXNJjkk?Pp;++%wi&GESoJKV zaBII=@0epX8oYc!xP{rSE>LrEDNn?yNTO`aL#`!};b~TlzJvrJ-Cn@G-R>D}cX|8F zUg}b~+}IsLp;c9w_?WLS^PIzJR;!tti_J`xTbeQZ!im8PDvmy8p~;van9S7L5w_1d zkH%OG6~zexO6X_<1v0Rh4UIX%?kG7G+JxHougtd4g4c}s=$GTQd!yzGs18TzapwoS zWTuu0UfGuIsfQ~s5jaRp;@{#>7F&7qG7s{fh!|8jQhYIAq3O49u3#DNRLIOY{Ll(K z0A+d!eS=9wDjX^3)*=e38lrT0zOiQQ;K5WV1?`Mp4Dx2fE;CRwP{{YAq|J*MgTM_X zN`}w@%^?s(_;N=oSo1UmS3(D{Ov*1+)C0r~?#hS~pariI_<|CV3_{{CrUnQavCi4mB!& zRH;w16@nX51{4&^jtB04YsgTvvUTh64ts5O}X{byh z+Eh)@7t>G%b=}oIonRf!i5WfniHwZ&$>cm%<3Q?NqCmU zOs;p#F_}lCCL+3_xE!6oNDQZ4cwDXAt#K2~poQ~i8b~vvwm^-l)wxuUAg2Tcigk%W zb!fFzUpCYL)j%r01mkgREKx<=M`JGSZy9mhDm3gbF6K;f{{Si)t{`R%)C#JpcmlNs z?$k;^fKpOje*#=T5(aOnv%|gtWuy7M<|p%e%HPfNFqAWTs=t<|7xjD3<6oIa`o3a6 zs1*c7uIhLnGr;+t2h7(Vx0&F4&mr?3!{%#EdGS1l%<>;ICeN7Mhp*;%A2Y!DhQQOz z)L!Z2K4*dR1O-ywqLz*sx#T`)kokl-dfsP&^E?lkOT-|fPIHprXu1? zc&U6+A!r$;C@aV&v*<|F0nbpN9;5Jmns*^;xJ;6zx(g9yZ8mWjE9|l!1zI#@QK-F& zRi$B7T4=i{ ze03?6*Y18`FB&rz+U$iwp}Cse3;3I$s1a-gZ-@s)N&w>!A9%vru)qr{*O3((7+BB* zi&8n2OJ2~suBC`pfm%wUG-kmFp{2DIe98+#WrFV^66L{&ZTWvLaS8-EpK=?VwTN{9 zt+p%i20;UE541{*>+S1oQmC6VPZksUuhaw4{xJ{Z{{RpxL@A+XO&K9)_WVNs0O|Od zzn9_ymYf)UfSC%T&Ltg6%O3G4(Ez5y{hm39-5yz#FNt0y7{?imTB2H26MA9Ctfa11 zSIh?LQMxlI?Dd!&1gu85BdQ5ijAl{d7;cQ6L;x~ZtG{S!ms{;;u?)9SU3Vita*+_E zTFe?3gvlRL4J)fOL2WpRmPY}3q%90pG8Y_YOV_1c$QUxBW}@gIohLbF_srSGR*87> z1Edag7djCm56gF{Yzw#nn{0Y96F>|P#1%@+keFh~lvg~!Hu*Zvyn2aP^wktqu;o7X>V&oDr5r=N8UL2dMJw2ah%SrSxQIQfL_8>j1z)p zss{5ISv?tDY@(DRHL-+Vz~64>gUh=O`5<><@cY6>tFj4FyV669SlKKa@jY4bzIAEzwo`3T`II1fY^kss-QRLJ z3el5ClZj=N>orlubJ4(fmB8M2TIKN!C<{???}&&LJno;U1~iLjIK+a26AFwAj&n4? zcla&=gETFxe&+%{?nS)nup<*Ma1StnAyjG&I(L$KnD;JfY69^oLU)qJc8ES(&c>n+!{suP{cJ z<{QjWOxfxS7UqiJDmTtOC#3ZEpE7y%{-w;q>s-gbqX;=G{d+^pCyM~60JKp?*BW0C zimYBns^WDyS>h;>0NRy`^}vYin+(!4snehZKY5bCLe|FQ4h~cx{bk`TSyt%a9mT#J zyPAFp-OFsDQFi6h1)p`S(T@#!ptbpb$RMuE_WJb6y%jvFPjfn#^wmg z`*@kboWMfcFk$_oG#F`_sJ-s}peBbDx1UH+Rn8?a;lB?O#@^r&Dk(X~UXe%9tctdr z@K@qC)ysg`Y50p=jDkff=%!CG!v#w4RRhZVhtb2FBCR^NEC6FoLvfo-+ga=ox`LWAC3Pw9^8g9vphQF)>p9uLRp z<{9*ZA$-s$qCtr}^(Hae$hOf+%Jl~^mQl`LAvk7jULwL(RvJ!dmLqjQED(SYR!oj= z=m>{4kZIwy^mfWvk+n)z6oRbd3+`dot zX8niz6BfXEAvU9}O`og%ls{qq#3=yINFa`q#}EwLTC@F$R-*-<>;k~Nv6bd|Unlzy z`-l5K_K)@gR?Qb*r~$kj--%57@36bVcE%E7%bAxlNuE^%xu_EmYI>7*S&hNDcUZXN&^Utr}{ zMSxrELdcSggej_m>Rpneb|_F5wQ}(C_jRkGI2Pb}iAj7!~0LnrRDxJEg>MHpJ_M(=dFLO%OBPAG5-Lo z-Y{wyv+!Ch7RnLUq`kWpT!a@ZVGRpvwqpHVj2s683_^wJKvMaY$9L)w^dBz7ZbiT?n)Py96Shol%F*C08~(c{-(&?M~UcVE`VmwQbLJN?g2c0{ze(0YoZ( zqz0*oDPBVbh!<+x3qj&4HS_~wy;%{VzxB_w4mj_aZ1C;_Tuf?XxZ+uGTD8sS+)D2o z55(F&%&1@>EOc>}aEH~u%;tMz^#ZukzUx-xSg9QHo z%8rd9)f(&Hm~QYu6b`z2C;kM;Hs1x${8Va*tJM`h@yIcHd=WE02`Q)sEE^a9PiQ3XQXlBGIidwas5(da5 z0FoMpfL6|N4w!OhGdH&p+*0_Fa7l}VOE)0Z{;cmKgw$CMxk}I5@CH`#oy);K~su7w-ynS<&=H`ti6hQu1bb%fvRd>TFtv6+qi>y=lqSmY9;$6N+l{*B{JE3 zPe`B#5dFRgY%5t_SC$4~%;Z`tekI!sx^#c69NU?2;x%}Se8$gyp@2#_L6_zJABd_2 zcW>c@FyEx5qV@j(5C8!?rUKEGaS=mqmscCd3qt<$75laRL7<+=GG<1HY%12(wc5*S z3vpdC<^E#S70_zP`_nPrvu4@~OO!J)H;5v&@C}5iDy3JRBADW@c7~BTG6_`ED-1zI zB!Em=8+Af5+aC^s+ijh*4={f$W_lKq41gWP)BEDDdf3mKoWRv9!4*tm-b-DqE_@I` zLu?chG_uvV;YRdkL0)E5RS8lhD|D(X#JcoE(6zBj?E!R6=V-;uYskc*gl=iaAS7fr z2!2a$Na}+Da9Xh@6&9Fu0AQC=-7}%sHm9^wN~?DBES9qO6!(Jwyxb+rb$ZmsECCY` zSzwsnVjIU2+ApS?E=bxJGFe(e2Ib}glqi9klqw4>Tr%ZJY?E5pQk!m5cF8_XQ60n} z@W=%RscQx7yvCylQ}mtyMh5J;VQToo%&iMd@Jiri8mPSuL0cvn09G&qAOM>3sBM_7 zWvK1JS7R5JNKWWNlxstbs0mmCuz&>{QLbDP+>wO~R)>G`1v9)+zgR{n(e{J%^@w16 z#>!!B0SAYMD&hjzmO2a{WBrs=qrFUl-R(^gz;aP;?*%cSXwYq52z(Uqy!uOelpEq9 zBASPM!Fizz@;zsX?**`@WJ-ufltekWR$S1v6j4&b?@joZ4K=G*oUO3}js>KcELEkL z9xj*wJEx-VE!H5+cLo~LV|LV5*f#EZAXo)uWrg-sFpJ8f^ZS4b1Evc?qngBA-ld+O zN7g%p8pZMOMSZd4?B%ls{H!jS#Yh9G4!5v|(ro z=TNCM4jS?WQVn7X4O^@X9Bxo3`cxlyh*%dzZX9vs7r}5YL~7|P69HWXzJv=QW7-*o zG5}T%a$29JrJ5#g*K3*pj4M*ndU-Q<2csmb0qOps36Mqsv0zeeD5#fLrQ$_xe@aN4 zUdh8UYsx87UsDt42+e$jxvi4Oo)KRDaQQUUE+*wxDq^_frPDC`;Qs(Kg)e~W3zVkr ziT?nPn?KC}y!EmpP#O+-nAGA9R zoMG_+ZktFbS9BM-OuQ#aWiL%SpZK`7`f#fzf~5|?7jQt;VA5_s^AOkiQ18}96U3s? zJteLesDHC88~UJEc^8}vuaa0cXmAjM@dOB6E4I@N050k;InZ@a6{Nox%)f<5>abF! zzOK5A!gv0324@@@J89`l;Qz*z1$u4+b^xafm|UU4#UL+vs)ux5hFhA43=gC^Fi z6AeSy`qu%KSCcKW_4LrUI7-`NENRYC0-&`5-O4Ufh6oa&V!{Qrf;CLIq6HkV^)0x* zT5)h(62V24&{o%?WDr$=O^DJbBa&Wvm()x~j$YE>)HMOs!V6B(t=20KA9w>(bV^3E zBVzM+D44yBSVVVlLKb$_!79q{Ik}E{@~)t;`NH!Ld~8BeG}d*fETO280S0Ek+z^sd z+msvwtJVTm`1b_VtSMzN{{ZCb)Zn`U?YC`AuBEQp25g+^to0J@z?6Xsf?69)G4^3y z&5FS`p`!x8M6KDa%ylKirgo?_1sn#~sg~u5RYZdj=BR@PmNMiJ9#jG<@U3tKB06SC zg}9HU{{T=>Lx3Q3p#tBaDm^YtwUp6dfa4^rMiH6ddAzP6pjZynq*o|V-90pc?^OYa zeI8n5ib{JU>bGE=Pi90axd%nXm=johhY{G8KSrg=FFJKk3s45vf?;M$#6^9(hA8W3 zS2LrGQHWm4i9))0u|Kknx%h$gV2 zDzprujKEhATtaY#b%B_xL8>U&$0YPOeijbZ|Xti!*Z)r-vCZd+u+pY#4mkbmqo?Za4Z(k@Q2@ZVVNkeJsTs)3nCQWsl^>?QAQNqf zmtzP)WC|Kpv^+dGDEcg{%O!N<(ciqz;Nf|J{{XV}23^Il2ahH+;xs@S^qZh$aO~oE zphY19)a?+rg6PU>P<2ehCnJGbR?KGOc(4*Rtx9dYMUMjm3aScrEj-5WcvP;6RPaJt zgbG;N`6h1>cBZJkRv;y91Wtu=2V6ih!?+3PB7|}SJG{Av$Vg&^a)D(EbrJ{s-Ju4l z&MVAUqfopCTolUUa+T(3NEZxSXiX)|IA1XC&T)LqeqPWme3uS;`jZVW?NJKRy;~n7 zZw2LD5OUJDpTrpzn?oOYL=1MpMPkuaSW2kYUCk$%a)byI=qr?<@ZRXn+=bHx}ioOF8A5BE?~p zqmBDsbHM>&xyahvjt(J9SD>66x62U%0)p04tGX?I@~&+6d^2`>n6L*jk;2#u0Ie2a zve+F>R;~=xT@|9{KF}*%Dr#(j+!i}$jQ|R`7eMse!5QWr(=KA& zC(JEfbBS&J1`^??&?ldw(865-YUt&fL++UG9+5CEOj5}Ui?37cyY-r(5oA=}gF)97N6C=9Z=AY^@+ zzK^3TxJ`#pFLqt9yHyJjE}j5z?TDJGtOUj|Gy;G{N|Msf4#cb1aaIZ`!3Sj*0>B%X z8AwvLE!jo%6gPbIwssl0>|;Dzu+#$7z^faWFP#n%UkxldTLEY8RoSa7Yk8oX;73Yr zjaUmTrl8ja4Hzdnjc#r$LV85%30y-o;LJ}lk!^R|45xx1ovJ;fExZc#W{_u}yc~P| zLALlc{{0J?XEOML5MMx!S!&!2%6mn)o{d9*eImGffX^%HC*mEKr}~|R=}hehs+lUj zZVjN!+#JU!X}$FpvKGjD0mN8-F)As*QYh$(kArD;LiMy(Z+Q|>8$BQO6J6IX4t=JT zSB5q?C#h1M&XY;!^{JfdA;Iq~ucK+ECFP9E%raAmYCo7gFU(S1uHohN5ic>PR|=SK z-DTE#W>JWXY&#k>^)dk@Tstn5t(S?sCeQE+!{dg4A&{LXlVPPStIVmO)FV zOEGokT0OdrRpH@z^~@U1_VaFl!YI))m_6$~fPQ6JqOv9Uq_YWa`UMA_C7Qla&GUSiGseI5`Ozo)_(0x!&@ zq4%8C;FlFE)&%bl7Dr>!f2iXguo;n2>PtVGsasx#CN>qx;eo%GRKVZViJWCJG+Jf{ z^blRkXA+YBhuJP|^)E3TGO)C=AS%!nvkdSSRkZ=qu9hv2mOo+GOxT0fKM>1Dsfqg- zU~jY78RT!ctpsupYr>$52mF2J(cg_e+-b`UUD*T4n1B6$vQUFhgTr zVuV}nAukN()1^UG^$($OC8qn8`ZV0os0Nhxma+0o6r<`4w$5O~Z+?=2sD~67FZd^l zI#A^Y%rrym1q-pV%Y`bxqZEL*l*ihBM78;kaL=L%giG0(Y(!&}Qc`UXZv-qDIFzZ2 zX^Wgotv4v_BDM89Mcgq2a>iB1=3NwDNaadP{{V|DIS+LNY+_xsxV5+Mg7O)YC|t+Q z3+@jPTg1Z=@_@ON1R&5jfMK^e23X^K&8+L`NM=3C{{V84GWKxvm~IVjUvO2H4>^i~ zgi{l3{Q?XZsSz*SvK%4zlpDmG5^cEqrNK$+`V6P5=+kr872Igteu7(;YGOAbR=OhI zE)FP)VF%VdD+RcYK_@;QB`cq_HB8oDDpLeqb~g+Rk5PdEyw*?h81FIJX!)9LSQ1~2 zaE251mom!4drCoGeWmMqn%CYtclCqIGWCX&!V%5B@ z?*}`VE-)?2`$~FBRvDq=Q;a=TJA6Y4qWuI0FP82hV&2{&%#Cgr8yx&aGN5kJinjf( zTeIO%M4{}=`usASkEv5Nxo=Ym!sfsH7qqFVXL|81T{GHTxw!KLE#ln5yU)>y?HFs;{&)fOp9XU;xv6O(=&xktzWIIA5GhgN=W( z_a4FH5e|=ud%HmfCDWssj2c%&@QpSvIJE5h@+Xs=KJeeLyL= zqK#a!*)Zn3K(xK#aJtpzp#eu6mOqm8C3AppP}m;e`X1zC19X$D>&uMZq?=(RnIAFMTD^Pm^$JbO_@Yq2|xxb0>r2>sXVa^ zj=%}`ii(_w1JsT1=xR5xzR-sA9<9(tu4-Jo5n*Ce=3kiXv;@!@Nc*;56fRj+S%Zmk zs5Azk(vWGol^-etZ5AN4qFR9mh%JY67*90D?ck})IDo(0atHG*EK5Bh<*26zKWUgS zDD#>XdDMT%iUH=vk@c83{T6Vf9?0dfDLEcQ;X0aq7ItPA+y*Zqs0XVZ$4^GsoyC<^ zP~8PiZCjuwxu`ykGGpxch1P_@%W>+V9<;zILCb%B_pHmKrXfqVI?qDx0jR zR&$(9c}8tKq-k_BHdP|nv zv>!2nbKF*~C8&X?6#O%69_R4}f_jztfG*5)d4?4|AxpE?HkU1^s-?uZyg;3ZQ67q9 zW_?&}GEN3amcwc;staiylEG?L3*?PD;4RJs-*3ys*sC=4;Evd}2l;;}iO zC}2rJidkM`>OcgvFlEVC(+IIOl%SU!JRP$?VdKK@Y{yHCRSTH< z%Oggy0Zk}vt*5L23ot}wrSwG70U8Dx6rr;GL4FW}8tK4qf{!y1K#0(Q=aDhHhXOev z;leUUAfd&vy)_ZCq{8u$4;3jjh{1Mf0N*k07DQIXTQDM9K?CN|H&rgI6|t>A zs+(UF5?}?JVMw~5766v3+i@MSvKKf7TAEuTt5RnqNIF=SpGTll(XrGARzO86Um~|W zM7y|Pa)jBWo+`Hnc~HP?fMUfHu<C< z>;ww3H~Y-h|2sO;>KVo5R4IAc)wd@avdEaX0A~6g0^q*dzJ~_0=Q;N zbOUTFW~;X55^x0%1ff_l9>*#r;~11L%K>7t%#7yZPxj3H02^Fxqi11hYZhKC8#EGy z>`8H#1UejQ;CfY(3Xe5*pza8`u~S->h!-;RF{w#;{skzrnY@o%hMNiKzr4*_c@N=% z)$3Uaf!}iR=`LJIH^fSl(s~$|n46KU-e#+Ja*=lRE^U{<1c|ywI+<{+pEI4o<8sp2 z!B5E8_LR7N5?^nklr~tMwphoGrGvMK9RMK|nwFmdTT3dU`ve*mRvD-S2pU?&VQHgv z;t-xmumEJhHpW1Kl4i&L3`0nL@~g$3|cf6-%?ci@nsGX zSm|8E&NU6QVB36CD?hQ9AP^K_d`BU0JM0OH48l++@C6iV@`8s}jO9EGC>VYh)UXKH zyaMd0OXF_1q6O&rxF~8B9)vQZ4QgAhNoAFVgOK@+)F2?G3cwpPFTZ$sLW8knIb|rC z6{k;8kRB#h%PDBO=?E8~%vw1rZZ{P+o0-Vl3@kJto7BP!?gNJVLwf>mt9G)c8NmUU zMTRP+sLfXzXys%gjIkDX5Eu%;05!ORVTK%7RI#KS?hfcNn`T7opdQBLFby%x0cQ*kLi&l;!i}r7yeO4?L26M$1T12^xLq$q zwE@f*%}Yh5X08q@;6ZhGio7jx6kA=uFoVN0zy8g04%8ZE7r0YnbyZ z6rpf=n5yiR6fi9*2rLD^A;{tZ$QX5EBL$5T;cg)apIPuhm(Pg8_Xh5DFSjtN!GZ}c zT{?zXKvUE66tS6^gcNj633SgFFcRFvM=-7>%V>oY97`_};knG_Dk%4gqFylvxU%|} z+b&$TTK8-m!2}UHnDwDSMb{=M-?rQ2qM&Vi&BE$ls+UBI+`i%Lm#VU*%X1X52U(aP zw^E@N1;!fUV;`dB>p7joAITGzUKIOOTS^3_XVL*xo8mNMmMC*?<^*p)mR&Pm@NO5n z+_ozUa5$Ehmx!|2k`hA#{0cyAaHoQaSJvP+)h~=;*KieXo-7o#QHZR_j#vbxZL(R*D5pG(~Il;5<$b5b2 zKlJ5d&zeF10Hm~jNn_;om;R)`^d(38NdEx2DhtS%%&=qTmM`5S{=~F?S%2(H{{TWy z{fR&JByr&LFa3!>_N05~a#dP>hGl%_Ad88qns0MahvX#)7RRRuCJeq79Y{{S9mkNkOxntvW+ zk+1RQct6LP-fQ^gc>e&$nc@Ec9%d&Gk(kOY9*AJ&>*!Q&_Fx3ASl_(+^kB}8eUI*ki{mn+3j-7 zPGyqGL^fYW4Use-nOEo%v-R!t5@NobUzu2xt7W%$Ur%|7eN0SIE^VAlRJnKv%Z+g^ z8JCZxM%THEf?T`Q1X$8QXnR81b@b;f=6Hou9d!(9Z3EH>Z<8@V!c$=5-g`?WlJOT8 z)TUd!2AY@nyK_1qCeNu-%f$5*=4D9Sa8|7cna>0PX&m`{OG?flD$~*ykp2ko%pw#5 z&-92>QrjyqF2(QGNrXwiCz6MdW;5$@Xkv0iqhKKIDVBo?mLab zI>f0`%lZ^dM=fw}AGvI{TSlhWsI9EFLscJ2=Dfg|S6dazE&l*Wfd;iqVaWp%5XbzY z4p2o=gSoU1NX22X(UqE+t|cjEFDG$^yR1&5Y;J$sKM=z-S+jTQJ%&dI_3-qaE0A{wLyBrq~iNG$7NlZ*OrzHNU*8naf@!N|q1Uqjw60SI~jN>pBHVTM9~w zg8{aLV9;smB-li1rI%55!vp}a+6aOuSG_{^VO3Eu3i42>eGY!L3!3$H6gX!2PC;mE zmE-6^FOdASd6Th!5WXWz5UTwVs#g^pos#=@w&yT{S`TlfXXx=Np!qBUB502h<65I? zg|#3i003Cp!70iLIEw-NbjMYrl+;JjPco%NZrM<2$$ld)*@~9VA@PT=1`du@fXgbO zF3yaufo9ftif?_{fK#s25^_q4Yll@-W~*Y08xI@>oCwCH66XGx`Z`ag7ktV+<>)L| zI9-NBhBuJffy)xBin>-3#sh6BL0;;dB51=(E*GM(v4k08q2~uK1rFk94Y3xz=$QzF z4%x;DL7mFXN&GIS+CLD8#)jcFA-dxGjN%Tk&ruT*)>;1m06v%B(KS^YqUiF=v_)Fm zMGq$Fk%8XW@quqhIN}aF*3l^?s}QzCMY_nvN~*bmasj}>A&A~FnQr~ME}u(>&(^WH z3@WYEa<&KIiU_$$MVCzsJ5$XD~NsKQ>nzJ zaagFzn7A|_UporpI3fcHsM1GcFe>qII~nB%7yzUPnPX*eFvR37L^3x~%~#D)=$$hg zudC@%`aeM23E`Mmj5@_4^@v-t)mv5Cxm>V{WqDR53t73!I>Vys_W%ZgP)eE1BPw2T zvQ~bKvFS0El0n|QTkW^4v&jw?P+$PcP-SX28eePbxE3+31c_2W7idIb5*H8t$CU&_ zl8ITkp|P7Dp}Q@aR4gYc5*Q5U5+&LR3V&2C$O|*6q#mj`-Ja2XC2BB)WXRC;guM8f zf%8|U`v%$o%P-1mo}FpGj|2M`Y|j|ysV0}8?39_4UwrG>Tm^vPfq173L#u}f`x{wGuNtN z2JAo9bIJ;r;sD||png!~FUl}M zq*-egDu%0%g5SX@gIBMaP(Fb@qneB%DeN#i<54;~_fEM}1zCBO(1*q-2;W77P>7&9 zXn=ct2%?Drr9I}D{pMazSWww~At+S-G5C(Uj;$3Vb$V0g)J-6!7t-K zh|A39P*UQj>HctVOC}~G;*(EQD1a5Zgi;jzsxkFNu(S(n*n@AhZXl^qx`Y0XSklJJ z8bZuGKvVr%J7og7RmlA@JtZ;K8SZCMy)(pS3s7b86;R+w@Iovq7Zgq}3fm1gMqr56 z*s7l_5nId#6?1Do2nv46a#C5KeaI!$@2{xKS3g3&jb|yliX7X%%+@Z#R2}CFc`6I> zL2v*=w$=o}&InI{AZ3Y-oA^Oii*pueH%WBf5?+U&uC!mQWK(qpxWz2 zs7?O>0fGgqvv0|v%tyIfU<+V!-ZBmxE387;7!NUg-^{q&zy4UPN3{Jv0otx<*-Rc; z5Y`rK7)mX@Go)flsJ?A25k8mnYF;L4FY4kT;*A;SQuM`bZZ20}N9b?qPjmS~s%z^* zO9@7xkZeh(#4yyw(Hq$(n{ag^{h*P0Ryg|();IKg5oHlu_kA<<`!oV~ zt_tOjHH9qVH&)cv(8{v`USf<36=k?fLvtit-|ESH&&;QPTX>G;fp{sYOwZ<)=^n9h zk?V<(F*<~yARgqZT7kNS?$#vW%%eexWgZCWVR{)>&i?>o=|t!M0E|xOWT)|Jd)iJb z%zmXucQ};yKa?etiCpI19?y0)DeW44{wp)sjoX@as zWqvhNUu6ypc#amp2wqs--_qc8r3mz#%v8c%Ghi`6aJ^sBt{kusGH~;SHL6yW3&UV} zs>T`qQ3e2D(jpcCNbl)wddkGPit{TF+(G~md`)=5Yb+JXI_6)3IK%SB!-b;F#Xr_q zmfx!w3>d>sOO;ae#!zLVD=V8q#I-sc)&y;=t@w+HKsM?$Uhgmi^AG+4{uzhf$?bWlL*u zaLxEnbO#n^#yr4upU*5z8$6Kwq03f9m>We#TQP~w=W2vU*B@jM@rmk1ebAM81W%>>PB8w5iBeCTAuwZ={aKgwsqA66JC^6zJ;BGfF zbrfu7PySH9?Td_|ey}J23;+NDz!(W%{2&#KTJ79v533oop&6?=EI&*NRG@AhmSV z&KS`ak_80^Be-EJu$q+U^iZd6!5pRuU{$~n9fj5riBpg=8dxwS%{i#OkXyM#qHciH zALE9g)upQjrt-VRg%Wf^#01F7ORsnl&5y{yxS|OnONGWTuMIm0OEM#-I}akgtd6P8 z3UhdlUI>$AO2n#$vzSa`RvSQ6oMBN5ur*EmL<=R+zlieMggYoSd2u>Q>glL1z(_p- zUubb__(@%5GR6*W3;`G^E>q_WSyJq`Wv~))#awRv_hVh$wo-XQ@Lu5YQ7hPIELJGJGyO5uJ9! zpsIIqaaFn;LDmt?V22haR)|!j#$YK!?;6c)`_IJ0+GJ^xSg3_$y0cdh!nvRe68nUx zS=`5RBHbOtP=^9l`a!5sbgQpOHXfMc)+iF}1CLm_&D=P<{8Q|a)M~7Lw^JCNVaopi zEhz~@390=*sqw4LO0oIOYu$q-cVe(51jELKW|e0(09cHmfE_G!V$~j0Mj@68fFoAW zEO4zlkf0UCpzPT&JoX4)bu1kggA`jr%EH)LLLu$!afbC$(#i!)sDdgZxR{s=VRK{F zCseko*xliLD48xOq~o4u6jnZnVC_`pEou!CHSvU{iKj+BVJTtbDF8QkwSjpV@4FDZ z>W4X*&*T8WA;X-vzCI8(;kUaLa@e-<2x!2HarIuVNNlU^D0PdRyFh_`NU#M;z^h8+T zWl`&a7OZWGSg*4A3u3Y~*%gwEiEtwgcubI9s8gktiXbv)12G(aPUBEG5NcMgWhlZc zWo(8Vtx(3?*N@f~=3aUefB_3jhBAhi8G+TQe1<~Qu*t1` zDtuXDEzk-&1zU(&0P-W&P%ErqSOi@{esoN9qA0m}COJxq3TWU#!@~f3I_#2P!SqVDk3y3 zbsFI1{6Ys8LF=4(Ji^VC3k&(Q7{$RI?S@jIR4Fagdgeu>h!+iH1|hHL>kd`xs>WGp zrf5$c_#cWv*XxtV)}5^VOiJ2OAf1-VX7wVYODkLs4X6 z^0Lfc$}47#Tobc_o1aL6%xV}^lf>Ks?wU8`<5^&+-j7j%76fd zU{FShffgLV%A`7KR0S(TX30^79Giv8tEq6A$`vFU7Bs7qLy))-8xuCP0XDd<*ozveKAJ8- zHf5X(t(sMY-!&c+6pNL;9Nt{SC`*2aLU_c+H8x&9X>J=UfOeEP;ds~_Mc{351Msv2mb&N0X0xrbO6B+gL5Kj*a|d38zv~|N*f-MmWGtmE*yIFGz3r-Ff|n^Hy=2m zt5I!Ajr;B}umuH)k;xQvme58pYjhUiiF5W}t1Uv>thf=jT1xTB=Ed_WSS;MSlmg4B z(KbCrfUP{hClUUw+A@8?E0GaH@Zf-;t~DP>ld9|FrfUkB7+I1T^YdYwWpX0OB&_VF zuV97B?TbJJLd0;0?0Jd&-{UdCcq4PTJ-}O5G=kF?Q*148g%r6F;ZYNQXx1B>aBSoY z4>WBW_>tmhD)ANW$l%anS`Hjxj8&rKD+7Z2=4ESr(#<)3R*X2sv7(CspUMJ?985)M zyHzBl3etBD8QFSPIYvsH6$^HiViZ+$G*%o-yoe)WXxLU3G~!dwttlvwG@*qQ$B&h$ z_L)nBFxeh1NSj+6;J6A^GjEk{5f=J~Dk7y-RaI40%B!`MhmXxK{o0FM{XOL@m^4hT zew5P>@a+rw25pt}zokXS>K4K1P6LT>Yj9r1E3dK$a3o&dCy}{kl;9^&NEbzuVhgb{ zLTY9%6fML@8=UTIY#Y2wNa>a~Ktia7pb14R2XgU^fT>$$3?qYU4h3nXW;8T)P_TwU zwP|w1flzR}1h-&j<#L6lQZE}tOwpGstJlxh&(MVCBqn0!8v0k!U!h-4n24T66fy!Y zam{e;ih}NG034?xH;Bsp*a~bcTm#s3V5%=*f);11Pyi+nsl^y+ynHIa0V;uT<{^oc zvoS$f!gS^u@4Y}cG!nva;t0<_tvj`_3Z!I8X3RS@p>tkvbX$LCmSIU#dgI(YWO^^vLBnTB{h@jA7VL_D6 z32RXVE$$9>08@PVN_PvH`d^Qsue@e`zB&l!Gr=(3l zU#?=mSLuYbm?VuMt$mAyv97=)kO!NNemie`ozC|O2$p8bd{%$ZNpfRVanx_}8B1kPs zn=mF!(~F5YxEZFB@TQHJny}Is@u>8!RQ51n*^DW98JfK=k;1a@F?XumsM_qWD2vSV zA19+{9>nn%+6AJ!4Oy19<&DhCmUZ+NFn?38rAwA#9yy*qpVQ?5(<}b~mO17CKN8xn zsZ!w6bA@g%{t~E{F)=-+B}E%`0LI(~VR9S8c=Ie{T*Lwr$&E}@vMCtcq?Ggj0Kw@R z_x}LvKl~^P=z-41@iE{301Jjoc$m7 z?F=9NTn>03=jsR1s2G@r{{Z;M(Lh!geY|u;Dp4~P_&5GW4L@EcV#MYSY=>m-2ije; z6kecnQgk1QNp>@c3hL!IQmz-$BY7W))U)X7{{Ykf0E?IOyv%(8GAP3@KU{rR>Ce`p z25=T$h#&3a>7TCIaDC(XkWXjmrpL_izGs2+Ja3uce9j%}ZJsC0@jheJ`GPPN!I)sf zR{{YO4bE#mW_qRXbHw?c2h4gOGW#Dh#QB~F%sO8)HqV*je9sH!cpo#s`GTA$%&XRY z;!#=)k5fa=F&{VG7~R8)c60j>)L&!$pYwnA45}W7`wIU6LH^JDGyRYJWBs4`XZs)d zXZs)c2m3UBBmIy3BmIW&uz#`t0EU0F{{R600B1+Uf3yDp0RI4I{z3lF{Db|Me}VqX zKg|CCV|VI5*zx=a`#u@>9=5O%0~OYm9jPciQw z#Y|OarAC2&X)xU)`2B=BSFs78Teh@7KvZK>!1$SeMBqLNjKdxwq?O5BLZApVR5DPw zHp{>ljFPmc#83Gng1!k{mhr?%bkBl+=1TtnfOrf{Rs2?1pffa zBfvDeMx$>R6)x6{0SUA1FVJLupWl9^zt#4i z-+rLYpVv`8)%KQvex>@D@SdOH6leK7N0hyvJmKc@Xp?Y~lw?)yjhZ^ZuF^*v|$ z;(ty0pTmBq@ZYKYH|i?OMq)acti!cWSLng5`I?y(I-2?lHf~&3oDzX;-xC`1xYu_Y z(q-Gx0aP#=mma>CE?`Ta2tL@CVEaUSmRqrBbFBXG%Chw)OhLu!&Pc$Zs-b|YXxfow zWa7e@Mx8fMz)N(6)ESS#9hP)F#2G2XJz=?c`dL#F=Mu@bqex|9Q!yKhhPP7{OTH(m zFE#YsT9@=U^u%%}robvwqA)a9UKVL=&HS~4$KTbJkJx)vgr8=wAucgf6gj6`V&3FhkHgD2d=2Y`J@J@V1 z`sQPZQd#42{7r5FIIA6)dYyXnL}{An0QCbx@-P_=tA?(OHr0i9wvcbvx>2bPa1zUF(Y*4#| z)e_;etI+cmcIPDp2Nq}2Vv7t2ve*Ge;8vpXE;BOJ%4bILxRl|KBow-8;liI1j^Em6 zv+UFWU0mJ3K&dp5qVSu$BDC-q#1H*NhJ)<|fgcedv0+A~A!xoxRNtg7<;#AHGjPE! zUSP|d{Vn?9rTCYK`pcK~e~@0K#L;Lr{Y!!kv2NRf+gh23+srkXCFXGy;$oR>Y-M16 zmkDy>0$eYcfAG1F)e|jiF(xaX;fz`3AP||E_?cUx{7Y^tnRoSdESE7ZTp>->#l#Ai z7oRZ|7!|8%iuWurBXA*Mm5Jf)2o4H#ht!^~SlaeuLnZAnZ{}@NI+lzwnNuS%FEalC z`fKTld6q{j#CY=v15visZx9L;OT(RgEGn1g6+c!e(e}AS5?on|f_FBTGcSpC^jW0j zAPVS&SU*EaWPkiIFT}Zv`m)ZawCCw@QOD64bSr$uRABMY2XS#)-9sxp2Fi^u+b?ZPMkP1dQMQ7Xaz$)q3As zVyiX#bsXscnDF0-n3Q!AauM>C;=~d#O6W}g0LL9O(&j6{>DO+#=n}lTSA!EB8tJsD zU8SIuh{OpG3d3161V@p{EejrYl_Ef&T!B7GFwg=JMk|@MYXQ0kMkU2z}P4D+;g;=XMXY zbqmgFuhA{69!h+ zh<2I zvMe=A9$!ci7m(gKh=Vj-yQtqA;$2qMYSivR@Gb{5Q7Q20@eY%4CJr0!-{%K zX1zkAj+NyEe&j}t7sN`|6=t;*xn#5c50_6!En4dA9I(D^&DL7n1xRi+_m~dt4^uGV zE^v;1(?PYG(RPrPg8)qW#M_sI4*lUJ%7k5UY%Qj;n%0pcdZg;SvhjS5qM;pS8@lC< z@eOB~!HbT>8@b|5u$SF0lkFPjSpl^!O3^3-DTf4Qa~0aWre(cK@e!8vi@JR=7SSHD z*a=)!JtMHv^QOUPFT^q>uROzgg&~`WnGn;!+6IThnULo{c}I=+ zoDB1+c8NL6;XM*KTsyF+KfAyeVl(8vz5#us}zE2 z>!cp?&2{od}Yi@4UYCa}O&i2Y7+y4$KqER!#xsID#MTCzzDB!@PFo7A7740Je+TV18n6 zQ5;4L)*@M!Sql!>U~j3biL13hBVeZuQC;KIF2;(@;t-faZ9d9Q&`=jF_ZnAts7;jx zX0~^kpa{O>_lt#~rCr!wNGDEfkuh~~%)tV;tF*F=jU;4aH18f4atbKARm8V>cbTA> zKAVKpstZ_|v}JaI*!3W}P+UFXO;P0lY(f73vJaI8*k(oqEhVb5Wy{1?+Z&ewkTL55 zxR=;4-3VD1IVB+OAh;Q!^oFd>8*GCmQe=JL)uNy_Gg@3lRA-4=odHyMJtaCyfg7Ek zjZhY@%hDH9%)i_wzSvTz`BOLH=lWbv=diQrN@VZ zpVYanj)7yW6ek9;fw8y;C=t|4CZZGflqkvchTc9gWyg&*H z3?7qI1jf>yA<~+jZjQqO(H^lsv2aaO(puICxbhG`sy0Cwzn}Pm`|N&T%#S1kqVh&u ztrJ9HWw@27dnO2AC0JJ3U}*{&cN;Y`i`+{(URk;1#=4Y2#%w)djhIh5o${mp2!^RN ze27E&2ucX1iE1T0O%r$wHI^Dc+{;)^c9u7KSagp9EHY$(79tyO-sLOjtiXl47#hrO z=Ml7}*;qy{RgNg?6$XZp)=UO} zQpVb`ZUhpVl@?S64CW6AbAY_F61bjO<(^4NSeI#7zzC3_xV@Ml@jDTs^prG5s|D3L zu>Ik(4%r|N@BQ4-cYN*ksh0!uE9|o^tJt&ZRL*I3Z>7q(`KTU)?I~n>j8|IosN`bQ zuiR*)Ie`LE%m&>v?

Mk*U1VD~p5)DLazN+F2`xqvswHnz)P;Ra9>p;>F8K+P?8y zFu8V9Z>$M9CbokCH+>i@Xg*-Wh4ntuFI0bXC@%BFXb2RAarK@?5OWu4nP@rBLRQ+x zgp|3;E>g9Z-e~Ad8HkS2q9uvA#aqjE_MSphkF37KD&}5VQ+t+g1IY^10_8wBly`#I zwSru^a^TCGA>b=uxS6Y$E-Nazj3^TG(xr3}rsXS1No1wjQ7uHu%I%(-63guyRe9@i zXrd5e=B3Mor<2|kX&aY`eF9qES^>95ze|Gc8|#=%L2Ot#jmns=n@?GC@emDfev9EW z$|e_~9?)Fgr*4?<3^irxoAV&FWSQ;lDTO$l`fuPfD?L{lLMRkP>P$l5wpKLhOKw+W zP{CaWw}z8xnQ=mn5vJg+8C;+|^av?8p>aXi4FqU}%N2s-{(4Ycz*axXP<}KOZz$UQ zr@^3eTiC{5g!uFm=hchC!#$(^dRPov%BrqB<$08|GMunZW8FN`oWV?O*3k_YT*Ye6 zn3N;FD3rBZMJ9S|m)9`sy-(ryjQ4)WS6OFDc0Hk6N)sUf(0UW#A+kNEVeLC-w5Gu* zHW&~NH7Mowo?>LoRb@U3luK@0t_*eXI`yNJnBkb{5E3>ldb97p63KHl9-Wp^vpWoI z;Xtyk!8w16wAF~B#@-7xhxLDG0+XPXp>$(7C-gsvqMej%Yg)wq>+ul}+K+11u2%+A zf~HJV4(OZ@v_`B)hEwGostbmhY~|82OUxIQny{DYGHWxqOmKV3?7{__%6FM#o|6Vq z0^`S9@fMX*+(8J3Obr<2R*DaWNaFrgd^3%||F0 zy3nwol>Y!f(r6q7m=x)-$NBHHYc*x20CwVk4fuvFH4=+Fa!=~N5}&j<0(j)jOK z29>vYTd(|a23ySMu>&>UH-87TNtYI=-E1Sv^_lgZ*a2!<Ix|cTT zm|S@9=bZ3^CFnO(_l(X*y}Mj>80>r$Cgr9_lQ zW>GQBsaTks%IM2WmQ=Z<$4Yp5QxmQF$F-K?3yz^X=!tfn*R*NX?LHx$lhKvkDk-hv zJW6|uMP1#f9I4&iGAE5Wqi zNr{PFJnmFuL2|VOt0jXe#ME!lp1un_2&HXXSOz_1N+uL6X+ zHL3DP>HxbkZf`z#{XsNKqo*EI=a1A)8qX){eDV63V{6vG6TLHQJIu|l)4a~~?l1=t z8?j*hNE*y?1|caQUj@BxS;W9;DJ-}LS#gtDWCNw0Rb#Wy_lMq6cW{4JKg0 zB9_J{C@RYkGP2V2XT&oFq<11u zV=fu#iz=nr=Q86B8nPBdzBD1^?I8UbASY;hE_-#Yy1G_OfU2VmdI36hOy$JXWcZlD-3 zikqWYP{edd2Hw^s5t29K*kYw8)jM9-_ZAB^n=`TPe{nWU8!_oSe#iF~MzDB)bF=M# zaiNe7&hz76+{jY(S~Dh|)>NsWJ)&Elj4uNq`cB`q{l_3%#K>k)=1^O-rD{R!kP*1* zm40((d>Db4FI$#>!xE)RW_sH#m(YtbE?gEVZsqxfE?LxpRW_N8%EwyiQlpFzd=|@> z{{RbRvgP)cOmouSCCfVBgkG5Are(`#k_#>9#H)qNOGC0*FQxQc+FwHDve|68aAtb> z%`}zMGUdybb-tI<<@74EDCSjhF}$g?(p!pzq8%%|uDP4c%5NFzv&^;Nbd}z1sfZ&n z%=MY8l=v&9%jt5+9ny|xr%INYX`-}D`JBefNK7v@>nj2o7;gtMgaJZ@;`gdzHqj}Z zDzjbX7z(*wLh*@*EH*4_ys<}DIIj7WQtK|bz2MlbyyovQLqHW-!}XXI33YCMjLn%{ zmnRfLI#62f#EeDm6VkMRxGJ??F8tw|sKR#+zR`j?y;wZQm=h+YU_0c8K?e101X{|s zdA=%T8tYP@|D*Kzvq|-v=-*|vuJ|cGB)3^4Wm$dD@r^P`E z-eOlNeJi7v*zgIWKlK%&J}YM?X=Kd55(6zvm1Xs}rmrI!tP;Aft@b*gR(7~YESFh# zPQC=BV+Gs1DBIo?0^ffJ)3JpXsYf`LEys=E*ggyG6xIP6LgkBZH!x$;`Z)_+c|{#0 zrD~;h8S*nV3+Jw<^FyV*E~P78a^?!q`@)5~<mS*QVz! zeIk%|9@A@#ctwUObDD`l#dcqu`l1)srekeL;B!9f;MMAu^DXeBpw)qdEHW`74q1j4 zcne#!YDR!{?8O_uqYG$O72x`ID;q4fyHwvB+xp|L3tOx3frF)spEyI>XqPXglFlaW zSf=5EA9pdtYkvm6E8+U6fVHAoQteo|cT8Ne2;FSO4Oo$PiIS|oCG@iy>t{~W+5=E9 z)&iI>rSua-Vk02LI)W8gmR(;Zg;9M!i3 z>+8OgFdbsu$KTF2VFN!|cCxbtqml{)6vWWUjkb-N8{O6m6<9m!W*J0NSz<1xd$4

JwkDs`MW8Sa_@r)pmv}MuuBs zDUWI0Hu_9S%l>-fffdt*dO;=fnaniyhA7hUE?NvtmDg!|A{m&1jz^SPd71Z%Lf=#F zzmE%V=l=lPM5>36>;C``3ir!=r}1+C04aZzAIe|lKdYDdOMK_`a{mA+f0X{NU*#|J zm-$QlrT$a;xo?!e%70fso0Z-B{{WEW`~Luwz4!kBCwuSyPVf2UJKyJ&?|+_Cy8d}i z{{Z>rJO2RZl<)rlo>Ra6c~1WT`Q00;pC0RcY{ z=sH3cu8aBx@iLIkMee|Pk3}UQlJhx~O86*^uCKgN5K`$&OMn$cRCU5>6jdp24Q5X) zy6W5n7nxk8?;(Z8s;Hdn?JRlrnM!4A-GaAWxG{`GOe7NYiL^v}rgnmJSHkP!9rCW^ zsc;t*U_b?1jdstsL>k0mpp@4$zZ<#hiH@s8Z+TrYQxb}|(g34Y0W08IE&*$#1zD>C z#>&MBqylx+=^dkepamhH-EJ3O+kn=xyCAc{=4=u)nkS^cs{lfeHFFi1R8kJ69}m}~ zSX4}0x@j>jgLTznr=%rH=mzn`ZEgaHy9A`#W?AAo>GOd^$49M<0TA)8fnox)LX=-nOpo6N|n*ZV%yUFptzK+eI=Rs$|x3? z7PYR0&Sui3K#6!7g4c+-?FNu2GWuB5ua2f=GNn!BYhZfc;-P&jr>=Tg74;Bqt~N|r zGwl8CV7qvfz}pf)fLx%i-@^~s`r&$12HLv z16s2OQf*T437FKjncgM9g%by)MzwLoX}tX4V6Y8O_tw-y{ z2k6B@6{cM(CY3GXXeoxboAFY}Cus93+ktEflwH@tt&3s>K$R8@?sW%`GiU{yKRqb; zYqTm>%9MELybMBiM7azetMSZ3Z%EiUBW+@ik-Wt7d&RR|nWV2=sMTDD>oxCJ@TerX zZ&rO)7u$b`oeAOjl-YR?+Tn+mg(LH+T>LD7;46jLC#i^tB4d*B-jM;4RzlR<1j`yux0NHUE!4bgqyUn%TCQPc0UO3; zQIzOeZ0tnELXBm^m~L{*37%(>l<(~`LuCN%46p|l;dL)Bj7Qx)L9BZ&7_H6^xr~8U zw?CQ$q`_(fUaVU{;ke8LTv#F@XS6$dUCC#|QS>W%XBE!yF)dmhHN>cZXl}e6s$KM@-}aWn<>A#F1)2&LUXjg7&0?**d`g{FNXpi@n#^&>Q-XSe$=lV(1M zEL!X1KUnvDm>wQkxCDvT0Iv7x*o+l9Fkdy(2FfjP(?iUn53^v|3okjC80;g{vESzt zjMoX!r5k=d8kN(E1YYgJ_S#kX=>RIwl%fmM>)BHjpA&aV+i&k&$%AQ|f za`%)nGE?WCg?r3CqP*DE8syJ>L=|N!+~+;nv{LGAbSut}lmm7}9x9e?Ino4>takSl zbKW=7`X;wZC26$CsRth^{qGiBh_*%sl8gpJX#3H@KpjP0xHPHT5)hS>I9**MH4X}O zS8zP$TXwfF$}YlXIF^l=QdHn@Yj?yB1-YycDBau95VnnP%YC7OX=CE3CoMAQ5$*esflN-{62}=sxkmVSqlxHa?s2IpfI2boLRZ zkHi=HP1s98XS{USsaxC6iE1U(JimzZkiD|ynVALcF*dy=M9%;fd!Xs8BoxozI05^k zyA++;kC70}&z$*Aw*LUpgi4xAplj)$ySc)~tN9T_7^e_9R(alC>%&EDx~eW8;+EdD13@;~f#7bO6#_lRrg zI~7N(1&Guu&fl0zqTWv^>VWJ^EAx?=)rWHI@hV#xT4n&dk79P^&6tw|zLrsmosOzHD;t3P*J_@y!%57w_6bH z%nVubs8nI^7#LpS6T(X!GokBSqiElDyVm_uz-Z7AYi8KEkmqKuA8he&=3E^8!#_z% zTjTwN=v3FPxq&nuTQn4;na=A9s@bE8%mZ6Uk8Ne<7tjV|M^)?@xH++7ct?f@I_*T7 z(DowIMlTh-BALaD`t*WWP!4zdu!yG5wU#B_xgaF~FA7`f1FVW}vz5W-B{U`BLCX!5 zr=E92M$y0{!Z9)qM8wr5!{mUOVloL}nKbSAfd>yJJrOWzG^M*%d51t%rlreu1x5|= z_=vereu`=nw@{*mVXizt9VOz}pb?u<2Gq8{!HSysZ2FVs#Qy+^LIgU6rggAgU?9*T zq|wu9o8xODc2L2NqKfG5w(}C4Yem0JX0C>@SRTy3r=b2N<<4Te?+z52=M6RXAZagp z&z~&5JXLW3YN-^>lIUw45k2El*ju({Wu_zDaZ&t0fh^gp%uRsuKu|7&yTo~4nan&? zTo)cQ0K$oQ`6qOVk8&neyZh-YVY!BK&C7%ZfWEX2H8qSatJwV@3aGrFqHuoSnh7YB zLz8+8YqS!8-uz0|qsa!EzL6WJh>i~r`x={me`#|J@_!=VP=8{&`v~qM$Kb<%q87*G zKgnh4UV)etR`~7X(hNeP%H5QeU|8AVoh9hHR&L*j%!*sx7uo=h;a+!PnZvUMXyg&? z5u{jcrB^9#S7mG)JZ+;2fC+ZkZu73tbb>OTc*%Eyw*bv3)|^V9Tp_@rUc>;SY13X< zB|&VcQk6Ap=h1>dq89fDbQL`|_tyRkxC4}R+ekHrbWi5Qf7jgPbeS;H=;fgkVk;eh@ zL|v3y?J?r~Hy%IIb{?c~we&K}ww=bG)M11wjQ@vrXfW&g+Pl zf;>zBXO;fJ%r~5UNuXQ6{K51+3jSk7QRn#t&E24aS$g-Eb6^TTNtjSlxGQEX0;5bD ztG8)b3KUlG)252``^T)ZuIbD(rWmWHQ^m$a3wF(YnD)OT@i!FtKNS*IC6#vvR9iqq z$yBDY(QnE8n=%@v_a?O;uJr}>>H1An^Ee;4P8;=!y8RfAp^n4#BKxmMV4yn?PGRbC z`IqLZ=2u5()S_T}myeXsR_r*xG2l?Gy}#7G)9o8<;PCWfLqZ8)7FBm{cy4(6{rH=5N>h^{$X+6K$m9-a3oG3UlNyVTGdnM-2~o-(hQN9A8)lf%TRtMcS?d0>03W8d>y3K`Dbp>t%aDXa(Ld zeBjh9Xc^3~V>VO^($OzWM(w-EKIpPn+WUJj!D#;gTnKfjIzLEI<)PhE+$vnfj#Ryw zmtOQo@MTV%rPO*);l}KvqXuduw*=HGafsFRu74E-i8rKrSbaYbrzvn{ zk8)~Y*CqYog&}UB`G}B169GVMmgZ{82Q2)2lxcHaTAaBFc|tL?Jz=D4j(S0RvKF0 z?@_2U^*=ELM>h%pFcUo-%y}jSj`wQ|vqT-MFUFDXiPAXwEuG|2fuysc3UM4S^_DKM zyT((%i_#<+Gdtp9g7UIsdx8(+Io|yVeKo+d3`$2o7?EWPaP04bu*kg?E ztbzFufxYe`swggU53I5S96R~ke$XjRU5{$UBAhnGAFLIeD|22t>8773VyfeESljIW zB@(3?xQn7C9V!B4zOvc@cf{5X`b%{^3_xBB ztPX*e{h(M|S|e(FYL`u6^ofFmTH4nz8o-)#2~?`NgOV0CdWl`)mv!=%w}9K=h^17o zZK8MrBnYPDtkzf36@z`I0`VNTQ8dA)V)@df&)zLiGx_yCetX8tii0JqZAWPn`J87Rl$tZZn3PZf6Jp;O~PE&LL+6?1&Hn@ zMmi~Q9h0*L(F(IzU@8S@sg(`DK^BWYtevqLZhetJxJ(v^Eu~xEWd8t0h>Z(NKj?u! zeHNDyO0qKdpV>l^mMZTqd`jq=s)DZ3LidAFDU#(mjT#^=i-G`b?3W4XCM)q0?y+&H zSSxYjVT!HG#0A56!6_|Djy8k_dI{F^K6r@&EE`^%9pGo}>wiiN-X$$6D66X~W+|yM z{vsV;cn0Y74*as|uigu*ezKEab1kb1@6wdk-fnt*=93Ys;1F_Z#1fLSny~>iV%Y78 zTfm=Vcvjt$fRM084rKnl8wT$KV@+GCj4 zXt3b5S^(x_{U3N0l`W>DmoT&Ued7^8v^W}DoKMw$@Ib8=DKAURe|h@Bm7v3=>2(YmKe85#)4p&@DUEl@p8(mLYb1QeyfkPm=rCbB> zKQQxcnnhYSuV^WsV-`ND)x{4clFz_^BH7&v%WLl+@$dqYz2eJ-*5agrLj#NYz)(|c zohv;TiE`J=SKMGlTXCPXhNEY3A5_sqSX-6e)VNq;>=UgU2-PJnuFP$w&=$SLWPM0B zIs)3BkUO-Y6LzsJ1gdJ?%G8F(UEvCKNQu0(>Oxs@O>Ci7-Rgd^ z1)6;#a2eLkq8f9BFTEly0|X7=65!MkNZY`HR~x`=sPH;aVWV&t7F1nx3us|YeHH;>sxk~ zIH}#sm>7ZZR0(Jq*AvoKU~;I)-XLMEWJ>=4u!~D@^buKQ9H3p6;_)HI9-cn|3p#J?81~S%ibVhk%Uxn@OPKdJ9JBzOjJPyMh#P%TIw%s zPU9^tH)XkJag9}d)42Q1470xXh77a1_ljz-TRtELka5INaVf;?%#~9H2}{#?b<$L* zMTDpn7fHhqW>qZ|O%&lxU^hbzK1d3t$_rTs8Aq8@+^ls4Cbt`J0iCyqAtO)phabW< zT>!cJC*ER@Ee_DN!?0UFP5Z&e#skn=>!52b2le~Mf-FsNEzXwCf86gCSVifSvz!*s z**@_gP+&&XE$>tJPrMK*f+z|XdbG}O-0uP^rZG?oUFuvvRrZkB2NL7)o-s_1lU zD7-dO0FeUAPFOTN;2^93*cmq~Nkx@aC=khq659k9FrMtH-5@to6T(FNu)`h^WnRHDD16Gr zT)YnQ_GJ;c#Q_2aW)El{hr(E0W;ZGWDV6Z&iJllsAu%y3H`CHAV1j3;B_sd_ktS^x ztG#$&cn7>fsoH4F?=?XrAn15 zQ7TtON2M{oE?;I3Xo0H5hV*r)=*Ng93J&bQRS=Q*eSobPZ2E z5WtlHH&;Rm2~~?(T-+oGVK$7x}U z>0cE}i988!65XaMd6e%PLi4(f)~pOv`%$L_X{=VvG?+joLUMyl+H)J6qKb%6xI-$p z7quC^XPA>$2x-$T;2mMGa5jpxYRz_Lbbuo0F7?*1w&c5tE3GStU5y?t8<2Zth)PQ_ z14!Hi0);TQ8FwI!i1N{b1?K@Ys1K!vE!=S1By!0A05WN!na0?}7&{f70E4Aok)j39 zn$dOAgj>)hFPN6y&arfoj?7q#!68`5S*4@E1LKI0$2fCrINWrxP`!u3xgTfRJg&WVWHC!qCwFK z1PVlT7$MX(08jz35S1vEDpAm+?Mm}4%%Fdfh6?gj&g9QS#6YYub|A0hqoEXbl@qik zu^j_JrPS6}TrXp$Ifw`?whSP_YYu;t`zigD{)#9zd#Co(`lW+pZ9lf3+fVB!_nG}>AMQaZZ&n6rdZsVB&+IU}?l80NF#iBWhx?5Fn?J0> z{YHOEe@T`8S$kz#`I@Ei=(&H{yVH0Jp_q|sJe?e}y40ysyY!+3%@CeRh!UkhB^*Ir z1l8Er9Wm1#Rd6iDbk{X1S3MP^53w+5N$Qu=L&xg$%(e$ZhVp~kWm^MDT^3%&{h;xy z`ram^V*pAEq@rV`Jp^G?3ft2$pcK$$QA##Sljpae~@zXOh*_lQoMJ|fU z6Mjs@YhDkWvJAMf0ngjNuEN@zPwEEYBz z`amKSw5Q?>AUP{YdFi}n9RxPP&=@v1r0+7n0r#80>XFN^#x7mScX;1{HcM3frfyT! z(ouFfTbP=@52T_|D1#nEuF{-zsrsGz2@4|BqS%lj#P^w669lZvl`*I`r_3!~ipjJ< zFm=fs19hd0#Ikl8A*{f$#`g+o#{B&uYe-enLr;SuEatT!H$!|34sEaCr185aCC(L1OdE5w`C4maD9ELaa-f z;fPh5kY*G+GMXL8nP{1)&@|I2mAQ^8X!1JQb<_7d#CcL`YZllI`Db5wX<%0MF~F>2 z&fbx)R?j`WPW&*@OUK?QQ?AfdGUwjny1Cw%yP1G$+AC%)vcB5GfYK(L;+ax}0~Paw zsx47!Q7u)bE60dcR0rY@6jALcShhIYRw*1t4Z=mSTj#!$YXf%T=PU_^k*Nkv=xE|B zLJe1?RKk}`XbTG8pTuy22DEmCE(1z-%u6r`cbY=29Cnlgn@;*iwMuVct`aHkD{X5; z(YUt9kK2Btx_;+)z=cZBN|lLA&@U0Sqa@F1wBaw_<{!~>AlRVO>EbR}H~#<~J$Ggp z7s}$yEu)t`dDqO%HLUyt4WXNYb$-v?@cyTHVJwZt zZ#U^gqEx9?aRO@G49X=+{{X{Z2kkk26AMu^mHs6*`6ua8zs&urSNN6wC4Y%u;#Zfn zukkC(+E@61{w05jU*c2vl>Q|@h>l*;pU3+@N{RhHGTeV&W3Yc-XK(uRKWX`&wEWN7 zerNWdnfedR{paR?dHJ8-erNZenfp)7{g38X%&TkgQ#I3|N8ry|>Rz(>l?o%TTI*d$ zN;=fUsF!5vnVFuM>P*H~AW9{4qEQpED|Trz&FTYvF)=9r0D)1|_-o+IwqI#y5t+Gh abc8kdD29`IjZ`%0Z$qiqfBY`JfB)H>{<9n>zymM<3ji3IxH!tIN~i%~kro#vbpb2A z;D5{2GyrZ1045lvlt@YcUH`vA=q8TNt^fd10&BCGnz@*O@nB53sXqZ@EMuD& z3<33moxudb81DsJ{1Y?$L+77Z_ywEV*_(oOUN}3N+L^xKE-(&qcQXTHNI5VLbhk3| z0OLt8rnGglvjXEAFvhYoGjag{D5RHqS2Gh!Fn$BZNX}|1qF~Gq0B}eaf5OIp!meiT z!8`##)WOly*~-GwmGrdzflnTM^Jt1F|Dk%^6wvni>lgPo(1y(a+t^PFF- z0E`#kl7gMg$-=|Q$;iqCcK;vpKOX!;>wg9>WBX5ybLD@G83ggT0I2%{0C@BNuA}@00H~hF*EUk&2m_8@buKlD;_A#KG3V&6(82(a6M%l=1ID{QqqDCt82v z!JuMhZsu%e5AI3>9A#Ga7U1EwH??xLa!O_2d@FV%sfq!oqxtX7=w@h_go~90=}Wb! ziW;ejo3r~12G5C?H)sF>Kn1V>e1I6B0A2%(04u-+@BzYrI3NQk0&0LZ@D4BmECD;f z8SnsnfR8{R5DG*A@jwcY3FH6;Kq*iO)B(*vJJ16R0>6MMU;$VKwt#)$1h@k3!3!BI z2pNP4!UvIns6g}}RuDHx5F`$g1F3+tL53g;kUhu^83s0ullV0tIh$M(Ch+>FZ zh<1oUh$)Cwh<%7lNB|NM5(knDk`a;{QWR1VQU}r;(izeZG6XUKG7GX4vJtWuasqM{ z@&NJ{3I+-jiWG_wiVsQ(N*&4s$_dI3Dhw(GDj%vAstalYY7OcH>IoVdnh=^EnipCc zS_|3&+5<|oV;%m&OQ zEG#TOEIq6MtRk!ttSf9FY%**yY#Z!2>=x_|93mVE94njzoDQ5l+$XpMxI(yAxN*20 zxO;dscq({actvf zh&+hOh*pRn5R(wg5&IC=5O0w%km!&^k@S$ zAa^1!Bj2E4qA;OIqnM)jqoktLqKu;)p~9n5p}s|Zhw6ozfLet*ih6(sk4B9qie`l7 zhn9-gfHs46iH?cRg06^ehaQGrh~AIBivf#4jUkR16r0}~RH0#g*z1Tz3L z2eTV<3kwE|21^>t8Y>j51ZxEA1RDdJ9a{tYJ$5Q~3-&4wBn~x>G>$D!Bu*vHG|n9^ z5$;=DGu&X@QrvOeYdiuxVLUUu5WF(HDZD#;QhafI8~kYeI{c+qP_O7-DZlb~mGP?k z)d2w(0Uv=0K?p%5!8{=ZAswL#p*LYR;Sk{^5iyY@kt0zuQ76#>F%GdXu{CiVaVzm2 z2_}gki4{p4NgK&;Qf$(_nQ^8YlQ(00aQuR_@Q`1muQh%kcqu!;#qmicZqA8+Te2x5C z=(W@9tk;vYFtpsXHni!qzvv+7IOr_tQt3wNA?P{jt?1L~#~7d)co^&%vKVF}H zx-%9rt})>-$uWIms$)80rexM(j%My>}Kp4?6Vx09P%7rIXXBVIk`BUIZHYBxG1>{xzf01xUsmExWl;n zc%XSic>H;qd2V?*d0lxcd5`%R`E2+K`F8nf_|5op_%{T|1&jo~3#M{ z6EYIY5?U9g5H=Og72bJE`_}qx@!KPjHzLj=H6qudyrRCMKgA%$B*j9+M#M41)x}f9 zmnFz0EF_8~P9!-by(NE2K}*R>MN7>{6G@v$7f7GTaLM?}bjc#gs>-IwuFKKMIm$I34%P$}3e)F}dr(u%Q)OG-3KPD)M6Fv?2Gsmj|bEGj-Ky{ee12C9XsS85_^ zk!lO-uhreuJ2X%=^fU@It~JFpV>DN_n6-Sh2DM*lTWQzp!0Kq|*f*vlz1-a{==h^IZ!8i&%?2OCiey%L6M>s}!qKYbonY>uVcDn>?FmTTRPAAT?&bcli7k!s{S1j<&)R5b2w=ZsM?t<>A z?l&G99#!wr-`l?*@}%<&_T2H3@cQ8mXRvxqmmy|EK{aZMN-Ss2-AYouG3A^$1{X8N;8Qv zLo@HbS$&)RF8RGSi#jVI8z$R5dpk!Xr}qcj$`6~Hc1zZIMg@lEX zMG!@9MSI11#lK3#O6p4)OTU-ll!cZ9(m=Xt!wJ=rHJ5 z=+x?*>{9L;>6Y#8>yhZ`?0wtY)+f-{+|S$JFu*-fH^@0yJH#$uQ(`-Ip;&!qI^;FQAD*tGie?2O*b>a6MP?wsx1>Ad^={lbSu=*5sF zw55b)!sVU{cq7Iuz*o_E21(Q&DCxqM}Jb$=algMX8M z%YEB>r+K$?@9_Zpkn~9V*!U#-wD@fI{QSHCdL7N{42fq{mGfq@5Ks9<5? zQQ#5a!9OTSs7Q$5UmSE)RCFACY%FYiVgdqUYD#KWR#DLZ-v*vL0CYGg1&Dk|5IF#W z4uV7nJ$C^-;M*B6v6rWye+dj6EIbGb8Ug`a3xJ^idc5QtH=m&PL9}(GOu@P`)WzN-5!V0F29_{fyK{4_wC-$sewJ>>sM^5t9urS) z0e03C>+pZHMAp7p+MO}Eb+JCscWv<5S#ZM7>|Mq!ccyrGBKq%TDl>dO>`Ew+vtwX7 zly>Ct$FA)6b3$fg1b5;8Xawp8248)>U=q5Z1qz6n%9scHIU*MiZ+rtxTAc09GZ!x$ ze~1n@g%f=^BNy}yDaomgUlOEm*crO0L3Uua^=tiF=U+2nqu6yUVRBwMGZ!*!$a7q^ z8S@}C!u-SRigHlnIxWPV4&?98A3rzTiWB84<6sZdVTtRCJvXmdChk+;P|^BSa)zbQ z_4o??2={m&cMAdhAoo`h3Zx&jxhnixV7`DP;Ji~LJoK|nwK!qMLS3&dX6E#?Ek04h ze*NJ4APLp@QAOoLo03FPGqVKOtlvAG1sa`$I-aXUKLhl{HE%f8O3293x?PI%84rEs z3cXxJ2??Rak)&&U=MmFh=Qad3TA`BY`?#rxLmbp$=Q%;!pZHH7#6J9$4`_3yF%*9I z6#3^f;4heN;^pppwoeipzfJJ!gKBdmfvhr7cB}ld_1*g#o4z#UkaIBydy?Wa5r)eu z_tyjG7V6O}8bUKqX7f#{atxz9SCboeT~s&k+WNxE1^szfvdTu(ht1obfy~GUyMxE@ z4C^Y(L`OEl0Ag>p#JKzV>>8xt$*&6E-HQD<`qlK{{z?u2l@;zZ5VJN{y>m|O%C^Xp z3$K3XaF+73)sxYtU{c_FuWy)%p1S*=qKmR3)pJj-%}r% zC?0Y-TU>+=jS8_D7t^yibGF>ZKQbyCWYI?bjUvm4#CMYUM&^(&>z$T213zT5?ENpN zGc#GLMk1%w9#c@gkNH-?}Kl@3H*M`f!7PBmb8osJ$Sld9dripV{^@ zx};VzA8q=zop5uALg+?`BBo#{wB0jr|$ z{9XT#^5kb7hcz(Kt51jHd~b&zEBNn%WgQEfcoiNh z|A5kY4ly>@*l*tO3{*bi=P=oP*B>rKm>)~nqj-8p>`kaX-Sjov=fx6o# zrD9{br^RPVS9S1GFDVq#B2kNmcd;(NuWN*796T9PIkZbxc&@4iZ5}+kF3S#X@ABSY zv;SyZdMzv0TI;gkiEKbOVObcuBowmAySwZ0h$`ab?ZR)iB_Td`&0?=o^ZxJ51YMUJ z1Ou;ii}>TqpMkUoWY~qrMBhUWUZ1%@b!(T436~?T=?O&@FD}d-{d9FZ3lg35-dA<= ziiqM_!hV-fn3Jqis9{Y~sRnutYH#d9Do@7KmiZQ^hLMh~P=YGu!iEsCYLTlzK{R}!4e9YPNRKMg(>>E5-(`4;pTq^&jShcTvSOz1rw zw;8hf?4!J|^&+tN(auL$ln~MT%~zv{{)5xK54!tr_5PM2Yp(X|EMMHtgsVY~)VxvO z>~MU^rtsaQJo?jN0>eC$^V{=B7(Y*&X|-Z~(g@YW;H%TZ$Lz(53^EMVW1hIG+qu#j z4#Of}U|4O1f!}yFG-{AW zk!sc#45_qCQiQSp46rZ}b>!7XX50%ZA9v&?`8Dsa|Mju&yS;rY!H}zFU+|w9006Ak!3kDsg{v2bsyszv zTVqJ{OkMi>!sK3uQA{j_DN}ZNnYh_@JzI~H0}uwx_Xnl}@W6F9aQc<$F!>+&D>%WX zuH7AzhnJHGC6`Tb=IoH1-#?tgM&jdbnBKU+YMPj2EXshm*uE|Xwu=;doP*j>_r=N`qesYpe$pv$Kt)8Il2M-g&pn+(EFoGGrrSHN>P!1^RV8K8mt+5yEIuUq#Zv4@AyhLZetzoY9wlXo`Kor>JD6v&dc(D zUN7)AB<=^s8Rt2kf#3I@7t2pBJv_WApZ*qoSRqH#MAM}a#zo$d0$g8ei0uW2`7^E} zcFLH%$6c@+uh+c!3P!V*SMp3f(ypja&U@pFX4ji)KC!iNOuCfnhim!}wUErq+tn=C zQKx<%-+e6mz<9Zyt%;a^FCzI!_6)pV4xqhUok($itI!2LRV1$bk`1fILl)*OYkFkY zLkI4T+**3Lzg^fJU3&QmKirZiz>*3|PDBU;6NH>jB>Qb_j7yFA8ao;H6cb6E)bBH@ z`tn|G^7cGjSM3FYoKK3}W4lgwQrjhBkwrT(NFE~d{yzgL>k}!0diul!~ zMY^rqP8UUD-!5aoB{ligx}cKlGgzR>_Y1^ z5P9{T)5~Ubc|vfJ>74iTS5vrS$y4b1+IXgE@Um`n@8ToUb0OE-)nFdJL!KT`Hao-P zl9icE+Elekt4z_Q-RlYg zEecAQsw<;nE31{vjisO`zS^;;<5KbDV7ct6jrK)$KgR|(jovKEYgu>R#X#Y!KXa|wV!E2#mYWs4(YI@InS7%c}6Z46>lMcB#Pvdv} zCDXjxr-eyAH}Rspj=lTwh3XBu8DC@9soT)#tBR#2mBZfM9Xr-X7zE}I|KbXCH^{<} zYi}DeeQ}*1a{0vPf`g+RVB*9@+^9g?@4XRU$KBQ6GH>=z?6b zqrQm!t1F?FVxlV5CT~Jr`;%60M&i3AXSeYZ&PUSZrv}@{ zC5eW}D17q~wY5Ud*SkU)JUxs5qHFF#GJenSr`T3yoNb}=u=u)>#QrE0dp@-wTCpr_)E4iRi zV*!WlF9R*r3TG~DRvwQ+sEgf~3Sy=odm_2MX8VLIGzo$ug>!Dl>Q(b>`lDTIxY&lq zl}aWZN#r*50$~rn;N(ZO6SIS2F4~xpq80P}q4zFrKuGmec;yI{HFxWU%+2&8aNf&( z|9`ztvBYE99gB})Ofi#+xh=81LGm~%!5Jeh6>>XKEoW18ge3kZA^L$uLyrb=gc?4~ z>R=YHhIR-b}e?i=h%XA}JUA%yb-==_2N zwfw~ZHL?PXNeusH{8D@+72$mnQFpF#W{Yc}shNJyY4b=PQ*5BRDWUZr)c>dg*<4(tmQQfo_fM?1dO8*I1(Q)i`G_DNGPB|C+__g!Yel+~OiqJrP zQ@IALP9MR~6k0To?kO%+$VPMZ&~7rY_h_YXX;+a?@-%MmO*KgU% z^{QS?*k#Y+29)h1XV2^0sB;Hzt**3j*4^T=l=*WIFP!=MQ+apHX(`af7q^&5D`zTT zwmfXMq+-tKkM8)5^eu{P*SF@NCxHF+sd8?h(_$dnuHqTc>R02uRo;)=wMHcSNV}-9 zS)*Tr{nq~5U&%muiFUg_dAeg(pq5S~Ol+3fkkETY&Gu;7RMtQ`GnVlY>Fe(5a<&Op zXfN|j+uqK=^iFuFG>OO5z8a>G5WwS<+!;Qvcild8SuyIpO_VM6s840Yvj3DGnO?Z` z#m`7~Z)VD(*e``|N|7hF|A^}8OL%X^Tt%{F&E9nPfE(GGUZlttA8vih$*gbVrzPRP zvV%k&p*FNJVbJLYw=CeSYdTbh~K``;QOXe_)0Y7E~>Qd zT;pc(PT$S*87TLju>9PHJ0%kS4KMTT@h;^diG*bO4Od>q<$mUv`P06IM2q}n%9`A< z#0s;qZB=`5*xc*tcnQKGv%lw;AUBR-raqS0+$yskd3;_)^=OJ^KC4N&Yd;Xk=+(kp zOi!zP*a5vy7@#%DDe)#NttB7zxYV_c_v<|GN+w*%f@#(u6f5FtXz} z*zf;7^!KP+!fn@_ad;+qdYH#q;$7rJef;^aC&95AUCB_^Mry%r-pj&CE!u60A*>_T zUcwXA!C<-4KkxYd!(T9DgZW$S{Pmp^_`$!9#m+XmC2LOwa?X0^VBP}k4)AeecPqm- zqaK!*D?6=S7u0Bb5zGZ&_((~G5*4RU5FYxkiXd1bMK%BFH91mCUVqo$w25dHpx$8eA7Jk{%@ zn#@t6p~A_zCT!heXab*=FC5WQ)_G=?$R5vt+CgM?u-60*@%V2=W3;-Cls_}WW|}wQ z2_n>8zSvIEjE^$I#1oNac!IwuPcI2nW%1FCp{$V%-{{Xh>F`kypp`oAVT*Kj(a&v!&x|!K$!jz#EB(uXP(pRO zWE`qqt@#E@v#29&tmuh5Q;m@Hn==mQ;+x6)js2oRCcizG;`JClQT{~+2|JyN;uH)U2(mn z-b}m_$~JvLP@7jEHLB(E-gA%@=jPs|n4Xd4sFl&P1erz#f>I@sM_&(wBsR4MWu zFU%`C77Y!pj5Dt4&2EJ*y>($w*lO5F)%@2P0Nk5|&HyC%Hj{gk+nL)LaOzv@+lT@j zE$yLW*IOL6Yv!8OTnrzs=ZMut`z|YdC8HI7qU3GTTtQ9?;T!lDX1+4W4EFoQ`IhC! zW6jnV){W?I!}5MpmwfD&62pGQ&wwBuMH6|Qwz0jB5&v@Tw?8`m6M!W=u{8c?cP(?X z?#)Nnd{=UVlb?qxT12B2{*jUZv)lZW#h)M~c&zC`1L(wc=kJc+g|K;hu2kHs+~iad zOhTjw{Ymk^K<=FY5heaqqQ<|ksn=5&5t{CHQR8Cvsx;X}J`>Q*q-#OK%*}BDB(3`h=E8N0Dub?$FCGw}6Y zgg-c2@y-Y-#l$PPm)-8=uA@auM`Y>)v~b;J(olVAmpbb-0NcA<9UlLvOh5k@4zRDx z78g~X0p#4~qVlj#|Igznnsd13+u0fmyw|?;`hMxf;lr_;j_SDW&BXEX@xV| z*Kdz|PqH0y538k`>O4!}yB?eUfB6`cH+4%oFbiECXT%O4dT^&Q@YJ*-xbwT#*zHdd zFx}?RWfR|H_ziWh-(|HabLHJD+fHE`(rslIT*#Ldai&z@c<<~Ru(pxtq-;03hZZr- z%tdiB7y6miWc1{%mM@WTSdTB{|A{{uhEI>nq{nRDY}{=~#XQ3xiNDyW5=ks6sqgr^ z4*XWimudEnV&CMb?%cu{w>9u!H0@rHi0$^S=i+BrIR_c{6E=0DJL)5CCYM$7;{eg6 z+|tULY+FwESpWR)tT>z5Z?mfW+M+s+tifsHVH;gD-d}|*5Y4CVp^E!zBuP5;k8U#E z7v&@@e0)tDUccsw{~!l?7~Q?y+(za49cS!oBUC(5Dx_$rr;fdVu(C{B7(B>?U}At1 z%lr&T8Qa3U!57pH-aG@A&KMif-?=kOBE43IOM;f~2)rAP%LSx!sO`dkgCr)AmHkmM z4D@;M?wS+{`|eMIeD7MceRjf#lJZl@RPEx8YxL8KHQY-RBJ~&0r>T^~#-@H#`YW2# z^xZuv=g6}3);y?|rz*=ZwS@fqgDLoF6i6yvRu4azlGi>jagCwQ@}8FMW9dO}Q3?)& zhO23v`@kRe3>=G1JuRh$4|!^-%zBRTuFgkL4H~MdMo4@%dRi9R_vfr7^34}N-tp_Y zqWaa4%awOVI|nMJ3pdHCnSkG)UACXl^()RaEPj}`Z&&A(4mgm#x*oN>9u19O9)nhY`7p11a%)S~MQWMkGk@5bD=(-U519GR?6k3x?Ul}R^VZY$&N+nTZ^WjD&3Kv4~aU-mVYl~?~E-|sXE6JQuqFR6Q5 zQ!cwN!d%98Me>6sQ10}R`}I61zZg5VsKj;4i{2>za@fL{gfc-HUlPf@zRCf%D#_-x zIM=m((gNiesa3W{TW;BqzMSuT-;-@sS}E1eOyT*4D!!@7jt~j4Dd)A#bZN{|k?Y5 z0?hc7d0bJ{YxJ!tE@Fi`wG)CN(w@AyS_*~<@PrTz{igJKYrZD%W;D6l@ zdg%b>D_3vUis&Z&R8iqo_OhSrLImkBx?27sWzJLAyMa4%cw;CB8|0$|WFFtK3Kuu0i* z$XM8v$SEk_uyVXLB;m{GXYeaouJl+Y1mNiOMO z8+t~HQnW`l$m%a@H$0$-DTeOB2~8NUhWqNe5eiEFz?R{+gDKM7`j5hSwx+jDm}@^; zJ-P3_dIYpi58h@d!1?Fn|K2$oZ{rSIv$xHhlu_HKSvlZhuN$QyQGr}6b>-*~rNJ_o zM81r@wlYYQ;KxY2rW0m3?QeQ&^Daa^4J!O?B#ptDeN^(T47Axtl+hq4m}9em`2FIh zO4`7%XDm=!lS}mt3=R~ItsC#FLm@9^u|^EkYTDYUAl_Mp!I_>L28j3v^lJ>M6R}D; zT4S^k?l&34mA*HxGKuKV`+H}c1oWf648(?x7P+~u62Ot=HdU^BTlm#hs9!4<6`O|Z zqNGxfc;>LW&x)VgAV<5DWZvx8_GFB1eW@6{I5hHLG*e`y3vK^U$~ZLU^+WE9BuzEd z_7u!bR@o#mh$z*L(LzYNlVJ>NZ>ucq>}Q~L0dxdCEk^RsHIW;mZwhfzIrDMGBWyI2 ziosV#9kf}+0!u$GeGU2cE_f#Da$t+zE=;EG(|{ew9~PacXTNn~umkq5F4N`8+gjg~rU=4IV!hYy#K8(zrCCX=ebCX| ziH&5hZRrb$=Z{?TPu0Dvs(ejCF5s*zqZX`m6a4XTJpyoJracep)q&_O(g&@}J;6Q9Z!KUsZ%k8K)8}p$ zVFo(AuO~o;y~#eKQYXq!=ezFM9gRvRA-tG&K(mY~%wHRSXRACAx#YV3grS%lqjVxt zDVNe38fqJU;H`YvUPdoP6OCN5`%S86V1^=ThOG8m&~~j~7I9|g$GOj{X|qx_2=L>y z{D%H$d;DAEw4aUHo`FX2>806rxoEC!&lFWp;}73B4B5K~48{pQQa=!_xDKs%1#`-6 zahdjJadB74F|SeG**7wYmk0UaJu-!xI*Z(7Vv-OSH*WThi7Ikq)6M2hFX!9(UIv?q zaJXkd7{G-epBg-xm2XkTAlhL_p>8-V(WTwa`O|-wm35M}kx|%3B!dbkdZSsBQ-<{3 zqBs+KL~lHkKg?I%WVzG_d-dlNx6jfypN-S|nl!D@&_=K`9~Epr-is~W4v*Nlq$Cgh zH1VlCjCZ6|F7)NnQI2O1V}cAVue8iAPp*OX{)pt_>fO(z^5%~9TZI(HU2zZv0#2fm zn{9R!J4R(kMc>*!qNnYb`7~Ikb_N|iE(!k1ws_|12knBa_-@IL(ed>8+U5chqyw0c zu0-#muJ;?9TsTWZ6zCxhKm0s-s8lm4(lbyVPCVAt1h8=j=MkRB+u7`o{j9p5fyunS zm21X@;M=D2mC!hqu2{3u{1#b3d4mb}XF#m`!S<$-ZaeO_YvVyT{5|O@vBk=5lkB*L zAm29#s2ro^l~&rBbYh7;1HI~zKhx}wg{X(0pWvGiRD@?5CvUT#acJvz`r6rL?CeuQrLizMNT^YXV zfjg$PQ-2d4UD)tL(3AUo+h#Es6eCT8*!)2>QS0A9h3s|xnF88K0~Kih`eJ}4?50e-`3>tl10q_R@xGNJ`9z3 zhN4@d7*DqmA6Cv-<0xQG%@@iZ#7dzPa+*MZAzxJHy;Ys`X*IkW$IAtLw zH;8ltl@RSwHZLG`xVIfKy=$u&TQnzTI90pmT=L7$#^m5Z+1!~Mt$OfRVq72)WC*Tnl72XIx>P^*PTQsb z^htrcEuUZ??r7YfKP?Jl@tOw)D`<1w{}Lj-BF6$#)weoxl!nr`?bQj=K2_}TGw_G9 z=L54^AJVqa*Slba*>SFWT-W&_mrQi zqFLeB#TRssE(X>5(CT@e#o`;qmb2n|(r*x&^F;qXq<3x%p-%}Ea?hI>np6`R9-ziB zN}=w@%$TlG*UsNfXJ)L$G5UfaBfKg8=5!bzCKP6I(_1~i0Q70Njn23yc-S`Bm|1he zbL29|d_P4NycE}bjC4`+hRcop(rQ1|;;VqBU#84T>4Zz+H$U?XT)(aQG%sQ1s^ZM$ zus(rdHL?DcMUW+J#xEh68j*{Y(ja%177iW}Cc!?@)$FF%BJV^WgHV&>&FrVOA5&OZ z98-2%bKeEKHP06cysT5kpc;|(F7BEuN@~YL9wv^WbfvVepV(9mzYH^Io(Xc7G8ofV zBrZAm>T6@_shj5(a4q5BOsYzCMQ*glfMW>LB{;cfahq#!zOAfqc*6F2{V;{%de6DW zA2oHIg6+#nXRl40fjsP~LP$W_MC4>6v4};C9j=zD6zjT^+X`z~)h5F4MsG#HyFMm&(X z&^Q^@nPxvFv|w$mJxVBE)>a|@w3w8JW0$2>H_uh|_w&46Y6i^K%dJJ|WNYHi`QAeC zTfFb<*=ZV|)CMXgHR#!noVbM|khc0Cd~*ie?!Wr-7=F=o8`0%l;9=QeOtnj+t(^_G z_TeUIy~z(f6%!l5Ic}v_9WwD?50jcZI*pTnLB8Ut`p#63VK(V1`K3o8Csk zDhO>HJS91o@=1*g_zmnj`R|Dll56&`2`1VUXG7hJt51`0ma?v(w1u0^OTmR$YBPA~ ze6W7PsrR+R=nEFO`j&)GCY9}XS~KVH{sXVTbPqGiK5OY6o0-phvwboiXos-T4I+}X z9=a5XzV3f`*ppN0n!+$`M!LGy&gnOUODD3}J4y_RytV-L#G5hc00wJ1x&i{``gBRW z^RxJr5Gs6gWrvR$3NY-sblaKUx0U3N%=#>?7~R7RuVeRm*uzC^abP;Ad<{bw-=8qm zyq&zMXWXtz(BgemDR26wl_HHZjn=V0U#~0Oi5pz@v6>&9MBfH7Cr6xaTZGV6rQe^y zX%rs&E1Ri-hx@nYC?>ddL@k*JvDYF!d2h2OiF7(xnCBzIzC^uh@vjBj=uHa=}Q zz^IFz?K^0=3vZJ*dEOE-xjXTU*c?`CxHW2C?0?;y6UQ@%XA)QL_B1TTP#-mhym{ zMTrbAU8j4U9l~ycEDoM<;s$}y;0dS1%QP_e-T7dJvq3*tz-i*}l^sJBFS}d@tX%lU zIKSWsUJ}zIFZJso^^O9V3Ra{`=i2W~KY@ ziY|U0hBFSFE*TOSWoV+iX+otnSk#pSzRro!ZA|J7@n{`r@5aRIv<67t@v!zgY4wpO zTQnDZso<4`yu}_*=(IBl0j&^(5LH#;^6s3zJ!{VM8t1G23Z6=u1j{>ytE~9k6T|bc zBjvq?j`l(IP5!S0JSOrC`z}7>a_5YgRHZZww-XJemki9l8cy8H)kr1dZ$E%++B+2c zSjt2sCz~xpphXE6hZ3&K;SyJPc%TrY{IiMhP1ajF1~NcF2(iT|oJprVg~JxojDyxB zwUaZeFrzyvWD;wSK&kXB;W2`Odp@X{R}>sB;&weppk(7Y!DnE29%OQp9@NmaxWwi< zOvL_fbT${6(gwo(V8nziKN73nx$&1P3;2&YvW9Fqq;mt2#;;k{ogGoIBEj z);Nn4=d?x%$=j;z^cHO?r?dxX<1Th>63~NE5+Eo)>DX~5IQ5er9-JxeJOjj%9rfnH z^@zzvMC$vtwicAbH21)YbY+Q`7M5;kU5fDSr7?F5voYh^)ug1@%=X>|vR1s@8^GX_*xfIbGCE5$`ApQs>cLt~O)0fP`&1oqNOImk!rhkfdS>lbr4y-m zHM+z`Cun8&OOe+)*P4mPFvUPBK=H^$7nTC8GRjDUja4k!TYOtKt z6TgnoPJCodsmWC7r=PT$?YNhak4|`{&JV60qcnoO=U4ubqtUz5$1&PxzUTMC#7~IvdP!rB)r3}LCUaudeY@jzo}toGfF*pUSGOnJx06FojfVu z6fHJt()q;w7N<(e@x~~qk@OXM^={tJhs;}_%(1(5^M{<~xplX_#d0T)Xp|KsnU*<_U$9?)^OK$`LU8R-5EpVzULpnFRZp#@jQ zi$Z+pQlJQ<+=UaXIbUU(#zsL675|lEz=@AS-R~9GPJFslUlX$iwcDp1HLe|NsAnMD zYb)*7Q3JGh4u*E7mZ*lrP_?sD$K{+CWN@I%ek^ktJ*uJvG|g*ur;5=ZAJ?3wmmu47p4xIR!^3 z&^#F`yD)GtUa;dD&rfxk63tJHYhJ78&R3rD_oQ%xb-&j&$*XI!uZUE~-L!iLkcOL} zwb&L#Zt#LjGfBr2y6F`8Eq`Z&Y6O&sMSHDbdgbRYlqUAV@_I=$Q zR6BTZt)AjO+aT|%8gFb{XUUI=J1}Xl4GZ4;5({q`A0!}X%FduAX!bPP4?Y^p2Hx-f62I)-CKyW$-}R8v7j%< z(n8M2zjlc1+VBnU>l0TSw#H-)8dF+J*EQr1n?P$6$))NN?yn)p^4%>DG2vl&q+Ke$ zeOQ|S_8UL%(cc{=CKxJ;YMx809~OPpPnObSWBd&KMS;%PFl(P^Ip@qO`mwFhA1SIM5fA zC-qIcg!1tnaj*AQ1W5a2(yD$$?sK3s+4@d|E2%2n=3JIx!U!P7$^UGyxt=Ac|Xzz7u`r>e-uemdKzV1_q@vsyQ8m5r3eZe zV~;*fl9-E4#t1<%K5&8a( z>X@-#;j(N4P9q~NZ^p(>dc(A_#MdVZTl52*7B=EperI;Q%VIi|JZ_!{I}%@;2}$pz zbF18RK4?9%4Gr#195{?lVz3!!(F|n#vEb0E-^BemqWEn&!gVS}g3=u#kY^Cy9W|uO zD2i`CPaV7+;HDhuvK2gyQ&rMIS6tq!&TnoF-^)zVOy5leH8r2p;l(pPtr={Ho~%hR zz}?AWA9m`G*o%y$X)HpM&^Z&kl=bAPb@%<)#uX~T zP76-?H~POW_gHKSbTZlIb*A*=nLr*t$qnP`Qx=7e-F~PEOcxDIT~uD{#sgQV+a-@) z7S)da6TPwqV@3QvgCx9!hL5MpHg~ESGiN^WL8_=N0C|!!g7`Bxl}Q#i*&vFM1(u~G zF*o_i8zBuu5$pL9vyDY}P(FML%x zIS~@bi~%|G4qR5p8XY3vJ~awYTS#gOaU2fgRC)`CxhELh+*bCEVaAI|SLj-ek9xAP zY9$6g-4{vi|IVeIH?9<>{T8Ulu7!Z&^kW=G=Jym-fS_%1K~8iyt_=)B_RO)tuDD$7 zqmg;OcC)hvt8hwTmrVy1uw!Aa!ZU=f|FpHpkQf&u4!sX$ffhf_qKQ)a1`(xsPOVWj zh8}LCyo6N|XO-IqcV66Z;O7#uh-g?rX2+*M`tMBCzm27g>G)J`nmK3M>5L>*WZz8C zEvaJZeeK08%%T0vpQ16BbAFyseN1%9|Ft+{3XW~Sn!^@ee9Nx!A47cAS#e|?X@Yd- z$Td7~?37bHinLWzqWQMzCOt>gmFr-Af?*aP6COpHEQUW+S{^|$-jxcLJ;Je~g~qxx zA+D(tyT@Z6#aA`qhSx1cN0_j-S~V@oG(~;9hfj}NAp&nh);|eFZ-zZ}?hJi-rfAG& z`O0~sD#3XPQD}Z${vl*LueYJprf!aKnM&b^`ZlFRZHez%{$X0E9y4Tz$+9d%gO-B) zpg0A$bm-hY{5X}T@Z0O7aHjk6N2zgOMpHx`jU)be;GXlY1V|g&!uL0hMVN{Gy@;)Jj3f z5{noUM$u%7GGA11V#afqVAoyE^xEcAKtWUbCI4LUXvoBe^tUz~woX{Fkv9V( zKhDy++&*eWGq?F-|3>HraOsM&(X>{&Nm8qs(?gmXLW2sEf2clrAx%`W0PYO4drlLk zsC3ev#rgGRMWSM0x23rFxMwi*wy6oPia(jP?m4P#EOc!%**DpxAa0l4 zMZ&2wv1-ViuXeI1)!5g8WFTpfl*WPb}V=#V`a^-Xi9}rXbws&3fR zhd0Xj^$2RcZ|i0^GebkLl7?rb4`j;fM3Y*r%(&6)wWAW$M6Z-ceTXq)i2OMWR=JO^ zucx#zTu99;s9z@{>`_AQ&8Y(N$;kMb@GwSNVhUHRCWXH8fO1)~uK1fk)S_9DraXNS z9g8{$r;|0_LarPKYn->tJ_99Wm@A{^|A(lz0E%O2+lH}(1Shz=ySuwPEFN5zh2Ri8 z32wnPxVtVEB)IG1?(VMV-<xksy~&732Y9;FF|L~AVq#+PYx%vE`4AT;)dO}PY_ru(L^tTy_L_m1HVNOvju2Zkdy@uK&hBkvvvggl z`r9Kq&W~_ebc8ddb^dR3S>w5$AO>9Ui*tawzzZ++7BuTPRQl_;+S{Z3@;Xdh2B`0P z(SJkDBkcCw_IBg8C(KEWg6Q*8(8Ojf9sjmH8yfV%P6*+A3x6Vu>0 z3x`e9uzj$CPPTE~Ygg7O<`L3>;au$*FsBa5Tfo`hcs%Dz0lP$6=}G9bE;}a5BpA?E z$!tR$|A1uaNNdxou?e6vn!fA9+Z3KCY#9UU=o-5hQ6=dom_T}rLOYkE*_%xYsz||9 zHJtg>{PJdZfj{OLnB!uiscm^1cgugeR7jD^$}t*<7nk_EW`>)q{sZFyF`6RH`F-#2 zm<_aKg#6Z)QAy_aC7rFXalhux9HsHUeWZND&z!Wo1I{0YAPG<@Al$osRV|BmwEkAQ zr>-(*&!^{gu9#jbeg|NU5s_63nVZ)&oJ)NbyrK5-Yluu>(EMB}yC?Uss=ROJMA7<9 zRZ0zv-MpaZkpuao!zpT|TU)_q-Hx}KY}$;qn)~MMO(S9y>$)cL8AD+JeOKfZs53qt z(ar$!Fr05#dK@s&S~CV*cknj_+56YJLdkdE~E^pS1}T;8I6HJ-8B40zYNwjht$@sx%%_93YA5| zl8q3Xg---lXq)k2{aC6?U;eai%wq2cYANwJSx>~U#Fz~W4IMYJ5;khIv1tLr$z>ZU zP#8}2C#QAc(FnT1=d5WPG@Bl>H~qFZv8$pSokiH+b&NIU7MaU-A<1|sX0`JBZT+kN zz5MS~1;`La4C|yevN(H?Tol)ITVq055X_gb+fO*`pUR1yka)c@l7$@kaK#{l5XRW3|PdrGT%0i#F zVtJ0DxRf{E8LgL~xU>-VEF9bq8madM2Q*`4RM|SInWq zWf9((n35?tQ9>P#j@}a!n>>5(X}ZS$ugh1+O){9?g>p~Qhw%7Q!Y8s=+|b*1`^c`r z9Tp1m?~)xL6%HvfZGvVz z-6g8r&8dW@!X}tLMQ(khYv`mQ7Y#u}CRA>1;ECC-FAo043V1r4Q}Qw}tUn|UUo?&; zxOU=q(a$xl{K5(^3xU`Rb6;TjNV>Vwuh{6)Iy(2;Pnl7^pAYWxF7dEAWC%Hh*j5z! zd{VY^+asoI*MvE9g>YW zwmTh&G3wV{LwRTHfBJ%~Q|o03SuGb?x;Pf3v0lK6rIxCKdW@iSJP2N_dnZvdxqB?v z`Ab1}d@ME4n_yf2r|_yn^D-Xgu4ri-(`S;ODP)1Qezq-QL4tvmco7q$t}R=|8b;RAEjMoLou4Wcr&!KT>+<83ovZta`{S=Cpo=C zBPQB6oGe`?Xr;Z(%{IYCW@j+KWDMIi`u5>>@#z$1vTZDtja$t&LZn9(D$}Q!T3k*} zJRXllt<8>fUH7Bt#wB=oAtC7&7yR!vN`s5YhE%Nmo=1e!OG+OQ37rE!b^A+&>)f}1 zqGCq`1&tF6`EI;cJnPo?PvPo67 z=@wV+WY}z}E;zn-{;>k^r!Up>X*&i6`xOyT z*QX6iuyz;t3`K^$Z@E&AnmS#ui}U{hpzY8TC9}>om;NbHydbPoNy;MlbNn{Qj&e`_ z#SdPal`EsGqKfwgv zG`mimlMA;^d=}U;hxc4-;k{lMNvT#6*nL; zK_$fF(x%y4ZqpjCNR1OGDBCJ4yO18OLR&gaA-3fA^Q1P6#%!{AQC2!GvSWxD*g=(E z+RAh4;`n2&2NO&3+rkI&T1>30{ui$V&_(?wDgKV}j9-0p8{>Wi+E~2TL~!5Odx3+w zvJKBMnx7r~l~R5-rjeh8BqR$$9`uy3$of~4oY7I0zAO-2j8n-goWO_3>$7oW%CBrW zK3mRR$hyG`jaWx+(RkXLs+$N~%pO&KgIlD%@>aaLvdUP8aGV_(zJNa`4fSqO-+iqj zw!xKTE(@!cZ}u>^dtVO1^F5`4ScGpU8Jz*~KsQR;9;Lwm*IBe|Duyw~!Npml@Smy| z%tv`@cMd_6AU%`23?mmc$AxJM6Uj=TTNevqbee^(vc{4mS{g~a2AAZflQGD0W3)Vw z_dQejF|mOrMNy#EJ4*Uo)Iq8_yaRXfm8}>$e*}SZJoltO=9Yu`% z%E0%$o0{(~R2dS7A4PeMQ{i@llez-w&HMS^WTdqhZMk8Smb#_VAIyC`0_+W}0jF}z zf{YJ8D!y?)?G~RwNk=Tpg#KHLj?VX(zSV39y6!`q{2Bg2M0u`=gx6Dv$*l*vDKV#W z(^K&OjfO&gCQ-gG5(I~|*8%D^8-|o|D@Bbs#yPJNUWX@`N6{e`#IJ>KxpvQS`W?1n z(BTkkkui-Ea%lJ%8bPT68e3{IN?q#xeZ+u4c~Y5-$2#^8j8u3_tM%dSvD!++UzM8E z;q7&_G~Z(M5cHnzQs!}Qd?9zsBM)*?k`xEcU5eYaKTm9JWs)Cs{gIK*toiEEm#HhW zZRXkOhj@fCFn1|3J_xrn)b|$rR4tQUKifpw@iJrI!C<~p_S#@t)TElC1|#_O|o zFFp1% z>*?dwTezI3BSQ#cx$oKs*E$9SpNXYT_*9@-hN(XMc zo1yQxGHb?a1>1GF_ygH$-$mr4=xX^C5aojp`BxQCy><`7YzpyZiZT93$$wB`Xe`!9 z;qkK_GuPI=kz%$_Qd6?xVg?#1PqqtH9voNXIaul1E#>%KSY;$J4;#6SL$xSg2^*OM zGU;Bk4<;?tQk>}2BS)^CIpuV^uOvtql9yUO`x5y8=xDPZU6x&Cf;}Pr|+EdXWlUzyQVgb z&!3paW&)_ff<;B-A0ZOKV9rXZnz*YQgG?oAg}iY${V^N=ob^6>tv2a^X!MmTX_fhs zP=Sk0xoDW_(Tm4PZDora>57lhu)owFA+h1ys>T^NROPUo+-7ig!)ApF=G_cTHZ*jJ zOJA>6<}r)`)cyU+ zCAl&ALYNz02dhru|Jqj^v91OjKZfW~vP>W>`}k&|!)da_^qaBOp@I)wl|&d1T;+Iz zwH!$3zPS_=lKE#4vi8H?vnkWZbJ2)=C zyjEG_-}6PDoVE0}$Q?2JR72Zb&G;?x-ASvSsy&}MW$d5_@$I=v4y_5E4zKg|co?|y zo!q~;h~*gSvtuNCN_wlrD4=<>bIR8C*dqz-IjBGMX%b8`-@A{xUGk*Np-7mRM$Nka zV)g1X)tlbo!_iF4m!pYg9mgcY3FYiJGu#rtYDwGLs|hoZOP;@{Y->O)VdHaj%yOJ& zQj3G*BzOM;ipCRZg#UYit0zFf>t%JWWpNIkU;cKf5j(2Vj{$FTMQshCr!K`F;HbDU zyTw!b$5ZyjQ~v*5;(z~P%_o(}VznLK>dpmoKN6u6sb`hALVL2 zqeD^0D1^)WX9U$~H0Io@Bxwrn=i)m*;orZ*l;}@92-D+-@w-sUH>@+My>4<9`6KEd zBs#>lTHu+j8zfb(76dwIHHB;!B3g3%BvPNg4w3Hv{yOb)J$3&YTA*+deHMbH|hs8`tH7L`pn zauzkKS6IsyE6Gj2MZ-VSc(Zf@+}qYOx3Hqf@uA6joFcVg-rdvxDGV*#(rA)yGy?qnsJ&j zvFj6`iuR}UY-oBWOG2BDKeVHgQYJvC|Ji6w@PwlKxkXsNFC?Et(Ojs0{j&KVm=$nE zx*=^`+#=Xa2K1$Ofk1@#;W%=U*fJj@tZ-rHoK?n#xtz$8SbckCgnLQ3c=!S$1^gfb z7AO?IVPH;BUGHQ@uM5nPh<0#?PeB)Cz-_3CY*TWaW-~XMw^g6R%*dLF{Ch!=|GQ?8v!;>b zP5zK;qNfWsevzBbDZ%KJX9O;P?|N zizhHjCNRq;K9%>@R!(46_bVSs};+MMbx)1qwBXR6)CjQZa>w0s8r{b6rE*bU=TU-a~}})J%O|C z#>S8zflM7O=|Wk9F!4RTFR~jP_V=BTSOQEb%9Y`*z%OrxxU~)=GV&g)#yKJqX*7L? zqbDeIalqc4)*)DdjcDnpHJFfSZ-xP-Ctj>SCc5cN(r{Gswkux1=N8bt+qCgS1)>- zZG=)X^|>tE2};f;0{XZ9fl+=^EqmcCq*6I&2~{EId#@TFx3TW5Kx%M!74AI|kp-5I zNKGrq-3JhH7wM#ssbJ_}hjcZ@WWEYIL^9V7NNWyIU0qPo;#8xi+uN#O)+*?j4|?Tc zGfWTG6_mqily2idl3c=JoGTz&t^3g|U5Pml6q!CfY4|$}x<{nxD-!BlTTON-{=aH% zq__-~9WdajKk2S`#gFpl7E_M%{}>PHmz`x^Gc;Wp?sJ9WQs{EkyINj*q^SE&AvtiY zqYg!n#SB`|d|r^&^?lUEQv?R+D6R7RK=sT22WIEv5Rz_7Nfgal(pYa|5s1Fugl5bZ z<~stW6f$KjYuR>fIXT}lkYQumHUEL+6EzUhnYy<_?cC&^bDsqnc=!Pv3EnlNWYxUw zO&ey9lwXpL)&Z0CSO&TInTbzHeI(PYH5VNH?Z9-tHA$K?>L=p5w%>|0nUfI1#%4cP zD9-<_&!ibG9iWvtY53a;fhom-<+SJ4z5AW&0-@#(0;XhQyRUHd~o~; zqn-WN2R9w4Al=-hI@0ZINs5U(%6f%`BJm#q5$A$RadbH#)r{*VsD1Sz)Dm^yiRqy)@6Xf5A0sMPauRz zDlbc@f#>=D*K1#M0vmFIK=uogj8={^m1CarM)Z;|#M35wTf zqgOBl2h#4>OlIsV3bX&x0PAoq{K&4 z%}zqIst6CdLzaSgCc<@1zE($1} zxzWkfvddpRDm6GJ7_ZmMv&WP48RA$9<5juuXx!i@Na_cO!*(iYX@Gg>Ew3jhq3<5! z?oArr%1|y3AsZY$;U?K%ul6fScKc*iK^ml_7}o)VY2=|@yg!dx<`g2pd=f}roW7H+cE-*QE7x_5p{F~jyh2iAUnD^@i;C3^ z>oc;lX*jc=W3w?`*%Q39NI5ZOSRoF}f&A%ngEX&Lwg_VFOt&G_o zCe=ekt(rV^&a6o%o+oF>Ck~08kArxjIq`*Fg^hQ5d>kY%O$(Ny(4zLcipM9t^Sr`m zrvElXYqNV@DYw(loV|0kX&Vs5cMp1iJOBe=Uwny9WjV|c?|Jo)`4;o}N}2Xa|48-@ z7d+XUkXmtmotupa63cbS zlXB~IX}YDgHJwMny5gfIC^YRYqjXe>Xs_c+g|~+CNBq(Oi`J>+L(yE#L1~O}m2Yy< zuuc^!FR+#xl09Odz&cUil+5FPKzU1;cLVFF+W5w*#^E#e+3GXeb5+Mvw*o%+N^W)Y z9~fZuBV2C0I(h=F;>1mq%PU3g$*sEAd5^8Z@7vt&Xzv@g{QJqR2H?cgKQR9-fT|;U zx?S|?q^~F$Q}H9*kMyG-M9A7~&tuvBC5zZjDD!uESxHlal=Y-^2AJPT9ac_xDt;du z^xrU5Jb`7TiB*)>GD9GaADV^Z_x(K4BJ>0je+e;#m2&P8+Nq2VrN1W8nztRE>@67< zCDreb_!Cuc-d10_ct@_;Mo{&m_KzJ=_>4z{+${qCGMCq-3f2)gbsJ%?S0$x#GQUn4yf=36kVs9QhPmTJtd= zr%1NF&SdS0jV=5pO^vL(ek`7E|DCYGYlHC(VNgr!2Vw>!8_kLWM;@%m_V8hlyc!=x zO~)yufGY#}21#}VybcmJkafxv3O>${BS_L?0E0`0*)o^3D_MRQRsFZo7S2qr&Fqa9 zmjSl^II(@NxevNR*a4~jq-g)Zyy&C0@luAe0UBm}=tm^gKumsRWZUJY57koW^*zJk zv@;_Xou<@i+0{?~vG%oZ)AVDxMe>@;`T51gwF)V<>z%z(IV%4bZkn(g!KCxNv#;3J zXBCHshMth$ivYoxWMX>E#s1>h(}*$3wZ#;T(~^R_*#3MAN0@JZDHUkU;+0l=(Q2@r z(Q4i{Hr~41sVjI*ifbB9x7M5_B@TtI-o~Wah}dCAu;dr*f~|tzDvF@tXP0If1bZL5 zZkDc=LqRl!MCCU|XHmTWiM<-F#+b{L%L?Y&!}iL1vO$q}PILd!r|IU9(b7r};ZI(r?I3n9#U45kAV)aW6!jqjU(1+qU#IlJH!G z;GsVLqEQ~`UH3g!Bd6YC-f~57aadcdhxPM>=1|r0=S)SZ_U&K}#ToIh1GVdCS^_@~9Q5mK|4FtxC2VIxt>pOE|LYwI_(_$KzC2d zY7Ox_NC?SYhI2HYPaSM-x>sMSS3@O(YEJYmW4*!M%MS%+&^8nDcl82|$1;{7H0y{* zd=3QDDfv(QbHk$b(XNkk^ULxDLBKer)KWcGQubM7ZNZ-f7_ zJCKC)nZ#YF?~wXphaiq-NKtaODk$m=SyhNcitIop*)s-ijoIvnXTH zLCo^&{zJLJU$sh0-s3f z9rW`C^HBYnbmsX=<TQ>Im2xkCufiD4Y*DkxJA$rZu zRe_j|*F1lK5Z#J|e)b$_YkRGR77=bmUJx&rK`}wF`64A{VApo^;!jF49cbhI4C zhwbpr;$rt4XhU>(RSIlFH3}9Loi^wrbPhj${9up3|o&LZ5r3}lXk3}4d4{ygBdX+WN#qN4KBKOlt3kVJ? zw%&JsYTKz;2;94eu{mIQYYe4F;vHfEJ!PQ9z}2*Pa5B=5<+8QzcVv#v6KH@^-nv^# zuX9?LgB8+`>UgtQo!W{j964LpoezqjeJ5C)WK*DM!O~^DwUJY#dR^M-xxDzT3a}(C zJ@`jvaPGcQ(n3w3uYLJQ*2mfYI2#J}uzo`fYUj1opU0%md2r8WHXiFdXEN43t+0Mu z%`Z!C?Y$C}KP5skVlE&?K1UMAIQ62fQb#$!@uwEtSKb{BCmF_P2D$p5>csgyVpR$M zg2x#Z*C{3>&b7IH`LXrQV`7423D9B_51G4=hP@5-^#`IsM{E}l9?0{-_hanD%=kFj zms9llSGQ~^Ui`IJ8&|e2QP;T+NQ?tD%cY!OEQDFaa<8Ho2304pV|{NP24EiHTsaLX zEMR9n_4uYC)zq?Yb`LrBZz@=XHaJH*j$WZ>}2V_zR@KNZ?^EztN+E zOST3_oaH~&56!*;a%vJuR2ph?a>11i1pVdu>fq~N z_J)Hk_1CABH-g$hg&%^>i^}^W0y7mzx)V8j(3FxJVJcuoo51;D+<_u>jnU^49%i=! z&Fb%xH;zH{FlS4bg+wfs=K-sY^yD;+yt}^fwCQJ!3fcF15{lTUU3&j5bt&GmYVrK$ z#iOyYYnu|9pqpBA_`@F)hLPi2sR!Hy2AJCE`wfiC8+UmgU7^ z#ZSt>{S!ZpUN~|GWcGEhWelf9vCEor#$>u1qM-2Qa$X9WI!r$$*lkxY!tU}Y!`heXBcizv$t{KI_Myd0kNa+C##`XIIO17ZZ9C8`qYvPI2@*!wb<42xaCDsX+ zR7Yf>z1@dk-uVbx*h$IXR1?(QqkCrTs9v5yE)56XC+bQP51)QIJ zE04zu$tevP9M;NbJDk3crV4piS9SJmMLcnj{VKjnVcqEL8>q_xjFUPQ=v<0_(92ld zbf5N>OBhv!8lRHu;udu0rFmB1T_wLaqF1&z>iFe*4{x8G2iZtdR~1u@vbENPxGSA@qdeidGKu@QVP$hA?AS z;+&vmQ(D|N0<3e&d@luYYU4-W9Jh9JTsw8Rqb!wIp75UvL_5y)f<#NH!O>Uo8__;Y zm}E6`^rjECn?~YkU{61nI|w|qu>X7TUIlOm=`bMbRqK1t_O@*o{XjNJ$Zkin(1Ui} zj?pK@xC({D_l8w2J9Z09IF$Jt6e(6#;9`#>1!K#sG2AgYM(dG$lgH%1nO$ESx1?}e z*N{1{+q9mKeQp--ctnz1j)BvD6kv!u3+WKHB9 zz(Hn&`Fj(Xqltl4Mt|a$mLGzBb4A7lDST+pGnexUG7g}bN^$10Hq5=wH8tP{St4NQ zul>Dm{?UmjZKpmn)f4a8sE9kuF0Ypx-EQWmQ65on_eEZojjlbjhT{cxy&Kcs1^u?X z4)E+=1t)9?XPJAZyMFPVE8=T>(G>azh5~+smEc8(FcI|J$~Q+wD_$$zrGgNc#t_|&)LHOp0Sq6TKhsiZ6$M?umr`+tREn{ybHdMaVVZ% z|G)%S->cWj=Ai4%@@soI+q|A{9ab=dMnAZ%gS$Cg-uRKqrrlNl3{7h(kO&UU(k_(%WZ?;j5^=dsaqToU z1+W|u+s9oZacZqO^3WUfidw!sEr~`-3o4dz!|_|OwJW4d0T0aQ)TLCw7Do5VJn_a{-=BB zSm9p=p6LVTxG(PwJ#`uF+*TGrXJk3v%&6`b31ucv*8}tI|IK`Qvu<4}xt*B+w3FcT z7PM%rdF3p9Ud`{P6Bsuq+^OIL@9ZC;8MZA=n6Wlj9l!h7enLI=mV7_e3N4%T+zA|& z*cUlLRI5t@q`@68>%Iph#a3t=ijRTr8f^=?wDmt2o|jzL-<=g2wF~=-wyK3)x!bJ) z--QE7Hjq8%aJ_EUHVkjjhGBQ$DJ17+3UpBdycndFLR8H|5bFJLCZSm(WvvI#hha{$ zhLJ1Jl>l*e#r#9g>$+#Zo4%H@tgV&jW0jk0c&Am9bX#Zs(xGM7>O?~c&5Gn+a);lj zP1+d<+R+5nz#6i%Sr=_jy5qGz?3|GlQuR0tKJD$r) zU=XE^%{FKbuV}gY+}1DeJIq&^|H(tmVsN1vNHJ?ENu)EGcUYoe%)QH$!K|y>6I1%P&qj_`J#_a*iA{y0}Ze+x`Hr z)Yw}sYZ(W_q(aRkL{PuIaLI zLoCUCJm*sr#I$SX(AP0SInn5EQ+fl)W4o*fqlc2PSQ(UzpALB7>3kDbaUi7k||}%uxxY zD=Qv!ODw72h2Bw^^y&3`fE959)sImj)u&zo!?JvCSV?rXW~wR)HClZn)WwtCs}*A}|Ap3i0cznBPM-keS8&E95x3lYJ^ zxKt_(kR(YNqbS3MY146#N_ztcdn_Hp=UrcQXGU>(%CjNjSpqcrj(Y#_epYZj2e_)~ zaG}xc-D4yad7LsSa#P>G@ZJJu#4LT$yC<(Ok*D#As-rg7k5NXR7~bL*{+$jU^%Ulx zj9~$%B_Ii5)s*YdwrjOtcZa5ef)kFL=r2^2apqxktmGKmoj`2Sh=Ef=HSV+f`KU>v zXIlX+;NHDyUE|)Kscz%esVlm|bm&i_Ic}aVpJgo*CY9>N+(hg#$0=jtl*L^!`}$Kc zk2;W;M-%8j5%{n31O$W)yVr%sJgY#XTHR<-pN4kr?NM|w6cb!?N6h&XNR72CmI6u8Rmq^(-X9G1c|DpYK;-_j;!)3j+S?MI6^K92yG3OsdI)7RaFGv}I(Syp92 zjQaxS!YS`t)>R*`t-;Bw_MQkV4NZ(p)e?9mvxwrjJO7fmF4XE_|Hc=!RUADb{@GVF z<*b@{uSVETWG}%e)Zj37Ggl8Af*2#fzulI2<@_kf^(HF${>WlgcV>PFqO>aYtIp7F zQ6tt$mg%YK)zknT$^?XSzoGi!lMe$n=^v=Etj3t&yCJuAqaD9aF;Sf4$8uCLUvF~5 zU)&>^ID0%noatOgR*y`o#3)P~&f3kpKQyLU3Mxxhd z_NDXCafYK-`wdKKdniZG*(D)PbiSn0g?c!diRW(4_gXoZAN%bm4 zxiS|ecj^9cvm*;Ja-RuP1_fa4kTTY~^%TKj22mcSa&s7ezg5}1o|i9$#t_QRWFrIW z1#d5_N;5Bi41UbF^^QKBnOF9Z0JB#k%Wd-&qyz32>-RTn4x4^;ueD}iUzZbbP>-JE zaqWLED()l2gKAoD!G?40>7%dx`81~>qpW{m(7x0$w|Mv(8~U{q9TGp45%?umanIFY z3C9OR00)9TKy<;c>X0-wiRnU95POTGL;=43{tXG%`OYdgAS||qeTTx8o=MXrKdv1a zz##Hf8th3|=zL&W5&=lg*0A#^8-lBm3n$`qk~C^)FbME%vT34u$=xOT`a9 z$?w2Ohs0+;B;h2oTezm*ZOY!IRSyxiMAy^wZ_lX9o!}sqpLLq; z@BzR8otvD|wUw1``|wc_7EZj6YJNoDjW%K=;Xw?DWtH|K5Mev?YQ;8s7nx@jwvLn+ z9j?U!uLx5m?6G_Q40sjp#fTCL2Rv`;*_wh{Lm_ncGOLj=-;y4U)_-8!&CMm>SeE8X zzWdH2Bs{F~ns={n7Rksj;yBD(WE6a<&{iONs4(c78s%J9>=KmVRrPSEaXo9UP?j`& zNNb!cBDi=HtGg8pQ)HlN0E65slnt2|UH7JUmS(A0(7NP_MO(9CVwQUQ$kp&e+RNNh zXkUu%+LhBh()bp3qogF8XRO_i3-H@VQKP<|9o@FHmdrh-#9f9avK7!p0+e=ekvL$^)wX zoe*$OEs!zmI><&`TgQH4W-m7V1+^xni7jF+1ZR#%ex!VDTn6sG+wT@q>Ajae&pnt^ z&TA(66_=pvIgtd*KZoHd^`8OfeI*5@cpY)?#zX}=ZUT+ZZRuUuFC*x z7QA5>WsAMN!QEEwPQjXoaLRt!OvvJjzDuG5bdhDxh<1F1G2QElGov@sYFSGd$7L@h0=FzuXZZslVxE~vBg97zXN$OoLSwAu`A9lu)VNX=~qHVtGF=madBJ?id| z)XQ06EuiNcOJOC~0Q%oTsbx8*sy;tMtZvl(Vzd|2B*WPTdN%<9`O8)dc7BUcO781< z0KVhL7?dU99{$Z6YP`Q9%=#brv!k252#;pYSGvw;6nP`KtkrnIt`)NC@F6;W(B`*( zld`8yM(u`p4y%DPQI2Gupm7Sn0#veaplP&x3;|0a8f66Zpvem9u(-87eRx+(r_Igf z4MV}42(R#(B!#-{Edx+KH(xCPH+LP41C`~6*!wE^-&L@VFrIAz9QTtM$rXgY+TxP_B#I<)?cii5vwfX6MddCX{V$IOk#X%hhBM z3GI1n6&o)7IK4EJZr)q&RMqnM4(U3WK`nEOi1OE?RPEStXCRk+6fxZ|N7AeaqXNk$ z+{SjD){wVx)z;{i8@uS^XGO6qXzR#Wpf4KjVK)6`f(cKkwp;h+RcQj}N-dt4p9*oe zk#I!;t!6cTXQjOn2ejdQ3f*3~(LLdH#XHM*z+Mp5PuApYrKFSl>G~WQ%hbNQd1p=0 zr>>E3r@WzL%DcS_DtB{20S_16(O&BmR!3`#0BYN>wtbkrG7PCn?O^LAq(Pg<`?0&S zACXoQ8FVUC`Wy>J@%VS%LC!q|8gPg%@uc76xSuQKBg3))G1vhoW6fE!Fl&YQ0WWLX z4q*bzw>-icK_NY>XlU06mSLZm>0E0*SC?afzP6yXtJMdkpZwC)|pj2T*ADpfp{Mcw1CeI(hV(9^eu zS<1yWjaKu_sckS%QInMb=*IF3p8P{pK)KJG8eu@_>LzY(J$4sZ_N0->U-xgRsh}2k z*KwO@uryca$67foV_drysIc-nfDSHVp=v+c&K_!JK``SzGog+r@P)A0@%kGhe8$k8 z2&P}TGi9n@nUkMbN0m0=FPcTLK4->atMEr${uyr(Vfqz?@lihFr9%~!^Zaujr&sZ9 zsgWv#EVWa7fAlG=Lkn3M$6%0}yEGYyRDrF;ikRiNq|x@uIJI`z3;7JYGnFs4K3%UF zA_3l%PT5Xzf4^_An_4?FBlU}>o-{*~_}~KyerfF*_l7;jHw3FFbZXwGADCSGPFsg3 zB|}6q3A)sK#{GNwpJd4E8MZZ|D;RZ%atLG7r%(BQx@M7I6wbzJXRJ%Ft}9u>&E3qc zd z3YfX~LL#zbL^tbP)s!KnMe~q#u5j8)4=<+j3RnK&moW#A_u88sENFeu(I7W9lwF^p z{yUbb{@^1o?cGdXjVtU@6a&u8!5j=D+ynr>h9V!BS6PYfsRx0-S=x>J;QSxY$f5M zlkzUqwGJ7?84cq+l$h|(i-tx$Q}#ynN+2P;;x6^+YC(3Ds*#>~fQ`JF?noo4aBMGp zGa7b8N6=sdZ*5Y0`OdBmu5n4N4qqemhfX#3ZXwfMlpqHfwdFZ2>Pc?}CmhYy}8fslaQA5`Nr5?_S5iQ&UN~gd~k<~SN<`cx(N4XT<{-a@XPFg zg`pokO-wO35w7%$?1htxYdw+FK2JvlFMPE5wMQ8T=_C_|sG~eA1b4j{sW1C1`=a7X zh6$!n779mjN-*mBtJpdQ3|xZlT@}vq-I;vuv|H+;-KaXUMxPt#T9dACE-vmtI}g!7 zD9u8XB_^V5Uo~94xx2PW|9DC9{R30(d371{Hf78+`+B>4YmOKrQ_m*P1H-)WgL+NY zu}1?j!mcN;W+t8Q8HmQ->_t6%5uMu7NjelY(dSY>so1hv4>m$)a9)IS2K=yrhbG-p#8+NmJL-RxbXHlEw zGkc~7VO9cThcaM)LmZ>8Po(sN8*HdaRgl?up#G_H6SV!9Nr#8!3Ddn-&kFR~P}2X%GT`5tFaj}%jz3|4$#6A_#%DW;*{i_z_Pa6i-h zUDJ}>!4_XRLEo4Lf6F|H;9$yLT1v9K^-=9CpM#SR?=&-dT@EL0F{Z^xo-{K|{n{85 z=FfMHbE7#qog2@cm1<1Zi5B&04s)L#MX3z_l11&Jgdoay#Yed}Ky{+py?KXv=L^RM z5o2U}x9k<`Wp>{QFQUOCFZwyrMRmeO&-B=X<{xhfAkg8rNMmT^Ax34-%^XTb3>p)B z7-^5<(a4|RQXLIvfl0J*S&Q>d@@De)q;Y@)PMcvaD%1I8Q+jdSO_RZSY;X+Chx{5p zpZ~3)1LwNZ8dx8+v-XCkX?w{B?+--&TJ|>FS)-xx`ibTLBkCQaBznO&1|3Ip_4RE>N^vi*)qFA0&b(lx z`jbXGg=KQ?qUD2D+aBp_DA{uAutS#`Q5;FKK@$E(B_`1+Hl|c3i=EMv=@0ASt5p4W zE1>dE%~1C$j)j@lmVEJ=I#=a0h^^ETnS|k7)o$*n!SH5M$HE<*P4NQ%&#kMEErRuE zrAY^)o&xnH*uSG!6H!y1U{i-ziC9 zBe{K1X79X^&4P*cP2Q2|S$BC}3fChwq619jT!ka~*hq#+W2y<&eF5$PY=T8@8;|xX z(b{Q@ys*lH9eWzZbyf@|cSO#W!yw9X$I=K$Aa2N#ILgqh!ug&yX+L%GmRjrl*!+-! zuFTfzUKsXSy4ugCp;IgZZpSia&Yn*HvZjZ`+fsxkKYakiDg_7#b7;IoJ{hP&Wc0Sz zqU}TWr)7p^B+qlRq=(~PujTFHwH{TRmVFd!RkS2)QW4DO7+qPczV{w}&Dx*M?;QsC zxf~_+5(>T_Y~5<*>ZF>HrtDLrG0EZ4J_tL((gfxP6GMqT4Pxi{8nzHiihp2r9Ppb? z4b^+TtSQS(x^L#p1E*HmOJp)-wtDEwZu#n8{rC%n^X2>Bb4&k=!}SZ46t1eDG-&scwuA^buoaesnkpaVi85WD zR^x16y1pbblpkd~3znNpD_hNjNQIxEsqec2yFb*%E}agiNF38cQf9!req><^vKR+S z0`+t*;nU4*aYOmw5*LyUeQ8qisdHBL1I3RD0T*$fh{HNeo@@ADhpn?U^eSw+15Y0Dww^eYKTV+&w1?%);IJqXKt!w8U~w(a6=q2c$^dx4aGWNS10_K zryC{<68G(}D;NrUh!>@9P}nlXe({!W)1X?HqIFVD1sE%mtCF=I16g=R^@mu4SYt?% z!r+_;aCuj+^j74afJiX6{}MB?jq{>p>yakq$z9<;on2dco)_S6A3whQ?Amd&v4M$_ z)@OUrC(-Ay`K15fLlHWRoo8SL$9T~T77^BSWJq=8l)2(@{c!0CSt)=jUXSD0Z?%a*OedUtp3b^{nFGQZm4S-7U}m7#j%)4^=FfIJ-v4-yv)|P`{jCn!dF-~ z3d~l0?kz6MjNouKq;;n|Wq)Y0u1(yuobQV-IqfsP$|fATD{}};%;qgt9b7ygdlg+FmmG-KkC2U|Wy zP2>}x`*mnNo%&YIw{uC|g#p=?STJDiEil)lAS(yXH#(yGgKd)T3SR13OQTU!gSiwN z6YbmYrbT^MIbL9VKH{Bw%hYfULnjl{znjBR_sKA6Ilu`dis5347q+X?W7^Nc^W>WQYTcIH-wdWwCeSrJMPHY$(+$=#E4qho zd|eMTLdE(Go~c(LnJw}^*dm<6OV+LLiIy_!z#{)-B)`2b57}>5U~EUzAQN{O?jXe) z6!Klu%^O(`bpd?vYMF3ZfUP(8@|$_cohQ?@4qCNF#)${ketW2@w1U{oYoyWyr;Xzr zDRv>x@XSUl_Y5L8anW*>2s;^Rw7v}yrCP*$jBQIQ7t74dohybdN|NZ=EvT!f3QPPIr2pam zuV~1(`j;xSvVE zNqdWTQs3yQQxyGJ>GZM`gUtv54qW_!M^ z7jDQwxg~{Jr}o+Ro$OOp&l_2iuHf%={&pbhRFYz|wKOREI4H%f*llpfjAfHmiD&$y*k<(_#nY%yh#7UR+u>AVuc7PS*F>!rP>1ODsIgG^^) zga;PcH^aK_@*!be10g4Zhx6X_#9Z{8D}Oyx%vdHrR=fmo3#m?3!8L~JjOXhb%gmcg z_HtD%(+U6V4mS1|Xa)#*W7X4~G!JlO_v3-8Y#H3LJG}OFLGzVQcM*_Fy(xV)Fw0 z`nW=jh2Eky4$3#(=9H3$S|cf$eS5{k%%j^RyH){>Z5Zf1aW2?>+1`K62K-j#M`dc> zB04fjkr22RVhaM`;9>{jarSb^FbvWIvuzd?C296F5^-P~3t`bgcYcb;;*IkY%UV}; zOz?neXaF|7ws~}a()JvtDdW{7wp|>6**z!G`491d6WopqiHAn zyM<-{evW3;2YifgZ>s?R2QK;yUsailWEKy>HCPZf| zPKcy|jCJT=Ai2I#)JhHG6GjD}DmRRW)7)dR9Zf~5%Lhd zAJ2JqSeR)tK3w+IHEL=z352fx+mZj3X;_Iy1LVX7+0NVZ$pn9aU?Vb=@#4O4gT7x^ zbk*sv(QPb;f;dJjp~-E7aS+>7#GryUjJ2}{V=6o9I9<%U#Ku?<_2~&DZ>KF#>8d(3 zc3R@oYn(xj1BB4SpJucCVjI>=?A^UsP{+ z0IG-`tEHc=Rv0=fus+N8mVbe~Eqv|B(ckX2-|Y?b zv_PNEzPx*ptN&wohYdw%cAt1}N{+2!=Qul71rIkjzEqbP+?LCsLs%XgIui4?MZ+Fp zx>NnP<$*PzT6pQ9UpDo63k?ZGr+~TxzNyp2%t_2#8zSSCgqUrZ+wVf#R<2Tv&Ubz? zI&L|h2|-(#ww;yxhS@I`l!)_%d}IF4h0Z;+lm!-M}fb0R$?-ZZ7lS{y}qyEXr zBo(RT%1e`nM^;9RF5{s`ZhGJooCQCJl5`d0#QH{KE{;^NND4CivKV+3tzu=G##K6ytw<;^R!BRaswCrLvm=35hoa|^a! z+3LbdW$NOXgHuI}*&XM9;fgx?KK!?k=6kQNe0_@Eb##BfCIPwynv7WM>TNz%;tz8l zXf6^v&bw#z%qL^T_A3SR;ZQ0fLr1&gcpE;}2w>HAAzQ~c)%)5<07W5po=Pvtl4{^R zk_K&mSEdQH&+%btK(CKpZNp8ix_0Gs*jlr+rm3~N2w}KNUWD;rF>nbmsn@tk9sXr4 zUQ=-5F+IbZ4fwnM?X7vMpkp=+04x)~^A4HQTJAhuR@dld9@pAaPc~!Icc!Gj1X(Hd z0AS&d{vY!453#X3g|{9Q-cYQY08plj1qDOKEx96_l*m|jS=Z=ous*-e`6vbqd?R0d zynC_#-Yv6mTJo@)vW9DU{J zvNNwwD|U^AscPh>*0Ivi6Cbmkk+u14qxrHk(dq(dnvgQF4`S3qtA*}S)7eD0SkF9z zTJwByQ%)e&hRq?)Zh&kF4YbQIkoLP>k_m_o=>9)~9dUK?f8+rUu)aW%|HLS)n=7q{ zMaI*(CMMem9Uo@I#|^GTq@e_&&(K=NkW?U4owV5~cLW%@4XoT( zz+PM7JM;PwhZ&H%32$_%9VhI%X4A<1s{cA#=>6@MfvL=2_-3w=)>&DY@WESprRGz5 z{q>Y+F-qrh|7rRkz*QUsc*`>~5uf2@Lq8x&1~*<2gNS2wC34MG!mrSb*ZUxpqCjG} zgBC@seH9_#L|dUD!?rtIo)>Fd(!4y}4>CVX4lgMF0Hzn!p>`2uUWo^B)moXd* z298(vCUh#j)?aSQJoak6vLDkMvZ)-aZxp}Ct+r2m&tsWDHr^C<>t>vPchMl|DtOJN&0h}iRAjW*gY?eE3Gt2a8F7F9G}j2!D^4~Hse)(PanGW z_j1p8r4L}#K!gIy7npwH`(y4Q2ZesvUm&h_+|vZYUEjN&chEl;;<L2E_oJhA$+^ z3!b5E#f4KTSeG8l)Jl6^HoaytGaS_A!?$s(HT8h4=O4yMo_8_L`eLQ;aO+QU=FB$7 z)k_Oh|4JhC{9TOY~6lg6Nd z9z(T-$t;~q<+F-`9vNzrNk7Zj4Y)?5tYx)DW__m+AR^T=@cm`rYx@_-gy`LTE&f&4 zt(rWpAk}Z%j=WUb#?|YybAzFzj-2y2k+{W$^v5W2&&@g$L@?4 z)hdDktY2CDrb^N+7uw@hSkWqiANGT0CR{Zg+sBEhwDM6N!X!f^jgnb<2aGg|{;%zL z|Ed(Oc@GMqC3O~38+fon@^nOft^a`*vCHw_KwSS~ss4IWl%%ojEYSHZ# zTMWHj0g*3=i{cJZ3ga;QCg#gQ0vuh~{~fX#=9Box%OC*2kN|BK4b_Y}=`Kcha9)wv zpWX>JK^{lrdz#kIG@gH&+9yNggSGtGLj6)1C0+_d-zTh>B9ZsxTM;iuegZ4tn_m1K zJzSpwWGMT4BAkC(^v7CR;RhRw?Cuym#v@$>Ln3?&4)(I9(s^-Pe%xCcZcMTuq+uXm&qs_$pxe5QM%~R;Ttp zPVs8|84{8~SQ&FW*284I|H;fT57iRYj!V_k8L&_fkDLliA`#KGFvtKZFCPvSJQX^}L>I}Zjnk-Q%|6eP@qX5BsT&#+1;UIyR66O#Gqfya1gcM`09?|SMX%!D z;TOaJ`#)eTidiJw4@<}>;QLO&136}`S^$(Gs=rS8!#vNY39%)hEXt2Fj=B7uQTx-@g3c#7xgWD7oX+I8Fe$8cO0Dt z-L#qyQ;ycNc&97tzGU{(g}N~evAL}5g>=5p86Xi-7v5*?1`DlWy~8V^u_ zD8ixUJv!mWSECHn+JdKLe@Ch~s4%H8E+MVp;0z32SCR7f>(3t!nw$*h6Gd0~o_kNb zVzL`n#d{d%1hOtpzM z{a4xc?TR$8uyvWfa^*RpmB-_=0~#tdf|6$85CaJL86LVx*xPPsq;`8Fs2QQCBRe#F z-~){SYr!r}A%M(b0OCE{Rp?${`?$Md!`JGz1i{w@O%4l5oeQ^r3E!gX9)g<@saF?(NE?&#oPBjY1Flu#tdeuuiJH(*WuXAPQ__hccEKMT>L03{8 zy+j(ZD$*z`3$#CFPuFFUQjXCH4)IMe3>q50>CcM`9EV|XVK?C!Mv9IN94iz3tiCHTaQLQ5)RS5|-A1(DQr5i7dp^(4xY>4w(_Vty=U zWH+DRXAH4jAZ_<+1YMVl$w*i|k3pn7sqNC6YxXD%b^Qez-!JZ_W*Fb+X~EDJ=_su@ zh#yW~XKl?0S*ChX8T~`8HZNIsSx$m&^ELw8lM5xVuT*JeIJTA=FZ4q^|C{>4_~r|N zvnY_3c1*STgiDF_Nl6%H8jOf_k=I%~3lb&-ie1A(@n?_YEMdzBEal6R!v;8U0yj{2 zYUTy2qD*W^0>6XKG<0{kuIRfZMD#kFpf<__3Pg|Ed4{uO0}x4iq9CnZ%JPp#jRTrS z&26;6I%x>Om2SI~s)7NgYHJx31I+mnEXSrEpnBc}HIKJ?!GlLmp;MNWkCp%s% z3R`1MXoYSUwsm^w8qhmpJOA%pn7du%b^rCDO27zzgpjGI)b6(a$QmE~YN4Mw)8`p& z{9{_v@kF`M8RtSP)z1dlKtKC;IA$Z!wima>#N>UFW^w(AFx2PXH$7-e5;bwKDy~0X zDE+*%9a~7ncA>c0eMaxJCTF#n0tApZ&V@0$Jon_<;h^$F_3h zeUf42+7ACVK6IO+sRG7AHNqVipjuZ$ZWi2)3zm04*w)hem#twGU6hyIH&=JPDzn%qo_GLFNq$s-eDNbz#pXlg4TT}T@&_J+#-A~wa{D4KgK+>6-Ey9>hg@}zp`UUR}fgkQaS zp9MtE{|Fn6Hx+$Xl}{Q>(t>R&7@jU7dnFsbSL@!+iqvY(Vw3Xe**iry1; zm&J;Yk%z1QI;c)oH9X`6*a`)@*vefyB@`Ri*J?Okv7#gKA`smB;?Ch#W-mpi_jeLcstt+})R_~ec1}DWRx99aK z<;e+&{!q<1b=?INsYdUm1189O?`cd1rJ#)NM>#V9~75rSLk_8wt{NiWK$zYMM>R(#4Q*n?^MxN z5jz30LsMdlfcmTkU3vM9mXBN4sJl639@C(46)$Cn`hj*m!xOeXZ_DktU_?u^P zIkuAK2}0g!pNL#Df#IU0kt6ei73O`);t74%)CLd4V(`xr%Hy^56LV{84K*HQr07&* zq+CY)Ws)In1mi>ow#Bf8X76f-+Je$`i5?~Z|0-_A@D$GT#`|=0h*cOevGxox zo7vh>Y!OxU`BpnU+4B^tOf_`rxFavY797ftWg2(FPSQ}=Vht+km1y9zQph4g+SJK! zopRaDx+t+2HX!4o#(geJC}|{ORX!JJNjn8b;(NaiqpDxv$lTn&rR@ZvoM~vi)(ewr z9&^c`=s^;Y4?S*GW9#;=rW+^9e)(z1lpx;nZGR=8Rm*l;56;IWt>2rZ5ti~qTi=79 z9v}B-E4UJww;C+!EW7pqu1RZn?diJA z5BH&cFOZ?)`hdkj@$IHDeuQhmktmQgYbR=!S+Y8UrRXLeWRC~Yal--6W zo%c`wfA?tK3pMVENKm0_E7WR<(j82to1Nm^&JbhXU}@BCs?4ra*qQ7oO5Re5anhGc zQ6bdMSgE>*kA#4qX)h-Ok;jAB5gi1A2zAG2y$@ElPoL2@Td50 zCc`ZujzR;CE(kyd0q80sz%GUs2^a_jU>NhyDF!g49`FGMLMCDoQZzsUSi}%2Yv}cV-)1LqpsSI@f&{!M1+Z z+;<1|*^In?k-UA^{sgI<~gc?#T%-cgHZ zk$eU*mob5vQsBw9ZUok}F^uFDzLRD=h(~3s?UM4~1fF}|XX2T}q$g7-h0h0vs8OVQ zK?JYPeb2BENCnvv2abJ7o_ci9$PCu4xkkhCc-uDXw@g{%!wcc4%qSkOj5&eVm~nA; zgaxa;t0x21s{kasR@U-WZ=kTBRs=iwvp(+_^GXr2PZ!Hr_($(8-d&QE(jS+f0_xF|EfF=@I~ed7;@WIJ-VnTA z&X$46$CCyO=saYXQdp#gTRk+Yv+iYK4_y_5D4|Ffbs8#Gb(e#oE zYA@&3oq>x9Bec5s(DM;nZrOiqnwdtZ?%Yv!PCiyT-l^%Dc)7P3u7$3+_Kx}R0$sU( z%>kQB?WRkZLjbz@rI5RsM&w6sU1HopMncKHRr0f?A!M{}?>$ny&xV|w_}&0cidnOy zT6f=ZOXX}5j=z#&N*6Sbzx`f)%Sv`2(~bdS{VXi3)+-@%hx)=grSFIxrGI<5?i!ju zW&&a1*X)n|IAlo+!mT+LEHhZJaWR!PtOus;wfd=`f5N{*x5=az7DeUtrNROVDlrVo z{D&3|kh00${VZBqK@|l1n1r?-+Y+HANR8gC@kf>nFQC-85i4D=pFDuC$=wm1E~7v( zp>cbQw=_%emj9g-X^%&plTG0*Ku=!z_82otjzjtqO#V_c4jHPh~_)+46p>R53i^8|~vP&mxgB@q+Ge}xX_woat!|vjY zF7k$M0x~_mRe`-;QMIj-GdE*5RGXD{sU8Bid8Nnss(W>YU41oA)cx684u`Lo<6Y2~ ziVDmQ;l2}Ray%#$|BlQk-o^*CPPZBg^YlrybYxt%7zet8wfMmeitVkK`KS zY*E{)!6ArR7ema~lwKUx8=IRtO2V_46n3K}nS^Lpx>V(u>Y3e$t{}6XYAhV5bV3l( zb2St&r7Y|0Gq9Rji&kN-9Hw9080aC_d@J{a(f>X2>dehTPb4n<^%p2Wn;T1a1P4Ja zt~FNxa&8zzY4VRHC?Tex_tgDK>|0*ZF1W@1A0m7iU~0%Tsg1s8EP&P0aL{7WD$c>o z8LMDlzSba8Hk6>+68EOsE@6P4Jx~EX5DIV!%L=7EH$}V;Ir0^&L!F!Fr+l9NiHLc- zBewT_aP9)Jz(Z3*HG}`;L%N=P*A%NlhxhhQkgYVD_Jd@{1UH&m#-pcM=_r(6{ z_LvQxerpCLIa9uIunK>yEFaV--DOx}LNY%GT)#kHV``C8S;?BYwOQnc8{gOd0+F)+ zCK$SmBOH}@WdkKz40v*BdsPc_E8&qb0&QVId+J7<<10XP25LI!-+NdCk*ApujZdj9 zRzBDpwT77ckosv8UL(a@!q$t4wS+0`qp6v!rw_YuaRRAiOkDbahfmFb8=;FQtj|ev zjRb8gp(j4M42k(@5Ug8e%tH#)*Q^DF+|cM|>;#FX$yV;WhpxuXI(UwGNK-@_hRi1O z^u4UJ0?EpN6>czpeCG8E*s;rK>#s7#EybYo(5~H?gFK&>-?n3^J;i}u%)9EhSP?fT zQJmlsDjEZmon*D2zk8efiascIs>RQ?=U$c!yPAI5zk7EmLQFtoRXr3Okeut;!luT^ z*MR(}j!sTgGk0|WA93*XC=oCwi&FItr+bW0CSD}ns|KKV`QZx-*NSZ)mJGa@c@wuT z_|-4*s=ck_FZx9bXHQFl&H-v5l><8w@R9_z9S8`TddvHb6EC~?K_B4(+|V*kEGOH! zS4iJ~axZ=$9&yKm>Z&=Qf7LXCR*Od7H~3f+0UJL`C|)Y4A-4O@(Rs%`|F->EH`+R> z7VQ6uuK^4*VSrgvpi0~q0Ck0f>s`2QDX5O!w7(!#(KroHWh8XJ ziml4pBU;}1>p^%S6&>$8nYJ$uZ_!VgJ-}MeC7>IQ>oPR3>V0Ilka7oQ8+)?5B9Xh? z#qJHoS5Ddd6{<0MczTc699C8Hb|>RB$;4wFL6}QU^>v6iCy#ZKmJSFaS~cP12d9u< z195KWuWbI&8-Xm^@Vaj7G4D2$`XXCJg$tO4#LvT1`2_o5wYH48dukWqY9UH!usjfZ z*b7CvymxO6Tm81^&S7_N>gATmIcy6WMi?)O1KDAjmSP^mZbMm~W3HZ|I*XT~Hv5V; zR*3E2(-}JO1iMtZy_Tq6081 z+?g`0Zgzag^a-BdEbd3@ERYtf-Tc9gOf0o`rzoRt2PYx};kL_6Seug#CiWd%LrAIv z#}je~LnBO9t6#|Fv)!e$*=FId|4sk0)PG^LRDyX%&^rt^n+CTINjEfd8J22(| z@koJZTS?|HS~~6K@sk4&XuGv!o;gtBauj%N7E*oJu4`zqVy(P}k?EoZ4s-Uxv@sZf zP&Z?o-$Y4mYYSKKM6rXva>iWvRNmYVoJ?AzBcCq8u=LD{jBnU7>2UYKMZEY+7Rs7k zTrplB=sZ|BP7bKusO4?3kN{ynIAN_I*tkm{ZaRhRzu6NpmQ4H7N_&cCR=kr|VystK zEH*i`?`kqi+I!|;W{cvoT4CoXsKl!6an#81P{5)1!l;3C(Gud5NuK`x)P4^5=2!r? z6*}?shI8sf3KwSEwA9v=lpE)*T|-}|&@MQS`J5f$3I&hB`Q7nOE|@!x8A(!TVr_`WJcR!#;|c0&z|u>(YLbHY?5x5o?;d3kIZt5%O}s_2BMd zm61qj%?pL5;nM<0vik*?g_daXmRk@;NK`ss1=6MhAt;2=sfTR`GQ_ZQ!l1}40T2op z@xnA4jKQ{@>L#aXfDjFUc!_6)y?xE&cF=TV_&GZ?3PaaKr;Iw#(QYaP;WR}_-OSU| zRSc&Tsrndy*g$YUZaolYzE6$RHZqF6Pig2(J)30j?i!x`>gyXL0L}nY>kEMutyQoV zQmrDE8@^Ov3Y$c?nmEp1VMvW&^wcJCLw;&iIALtlr7~SU01bs@|MF&;g@;jSTRv|~ zAxJ0X!K<*rF*uk~!BPTfbV(#22)tt~2UWtXGS#{~^;~WbC6r~ao(h?AV$8`G#dPi@ zP7vKR$(fuiA5W!`rqOO`a-w#7MbKivpdV7LJZ_1p=;{-D50YgXFa8v@7i6i0gjdlO z<_*+bGi;2R9XjWZk6y2-@MJPFI#$Vlk^91rOSqJXyr0unyq-|1n&|LuB3!9ZU>4gG zd-Ja{C?Fm73Z)+k&wm_^@0a$Y5S&nOVo!}^a-0a#e8ZYb0vIoPTiFw{r#)a8#ZL3CW%!5sy!; zNkW5i2j@f7@%L)T?Zc>teSx36&}Ffk6&uZ`}BpdtkoRHK=)V2QbqI+BodrmRe6kSs|sKxM;S;2;u8&74fIH*Wf- z5tQr@-CbB7&dA!578S$EwWpV2Ytk&q+RG+x>ABO@F$Gb+{9fflb$~;6g!&5z3RvlV z6X4@{|0cntiKSUl`@0`fA=${({|{+R>BO<_hUZq_&&oXAL2Nq+b5n6TS%j2y%d(TEm;tU?i8~6Az=$k}1d!QC()`0!_8qAuOgT|@ z>->J~9%3)Glbv9+jf|kVeo{o@&LEU*s0Jx(i-t4?_wg1<{&Zhy4R1C#bM(aK=pI42 z1?k39>3ZE1-|- zpBbJ)@>IB8b#o~Pqq_S@`Od0ZlcTt&5w6Z&B9BuMSPnO8A*q7r3Z=}5KJ1}tpc-+w z(-Y8vLI6SS+Mx-dydCH_JuouGmqr9ENQpSt%&eS%hN=rTp)g7?r}dKVSiw~K7<LK=%vD8~t?y>LYneUYIi%dwK9}Fl+aLFqb@p90u zIPqN+t1u8PTtRAr63@7cg@kLY@G`xpROC&&DDhS21`L(RKx`+GipH z!VaGhG}ywyAP^(^c_+q!U<&sMC(B=;ATm{s5&?IsiDQeizd#-|0x7;;O5}_`S0gU= z%1z+2#J$DybW@qGxwJ))(o}8sPPm{n4uE5?a(=oftQu)8ucD_G^mfrt>}{h98ld zpQaUpIjD(;yscP*56d5hRZI!}bZRFM%*Qok#V;cCkx~$ao%JtJ^CB9LK-Y3W(j_ly z8oFrQP4@g12p58=UHb{Vi zzTdB@*pS_%TA#UP#WH4w56^qxFVJP!0c&|Q&2Gfr91MOsxx{U)zK+0!-pZAF;C)aH z;f^G5x1I1XQOw3TyXPyCPH!aXujXfj8zf{Z0rJ@jtZDD4625Aq44#_!E8O~FOSZc9 zvgZuOq?gF_&HVFW@gu>8$jfLYYA(nQmouhP+A_WoM9wQX{{S};y2BXYmI4Kw7&&v# z3AzQntFH$z+8HO9ZrRx^**Ai005U5&G7QVfeKYW257>R6;-HS+aV8J%0nBt0lbhF2a_dL% z+b5#SAAy0P)Jsyi#||N;(1L~Jhi&%z`ED*b>!GSLrhn(~SFu=?#~ zP^9G05f2>*(5WcV;L%aKUV`<6DokD|C02W~ss|VN{7`2tRx?MVj7MGc&shV$6_33d zG*Z+ubD0iPx0gdJouGv~uE`7TKltjqfAE}#H&^HQ_mh&=@6k0ny8 z)2~nUtS#;=fi)G^4t2N`vS>(A1(jHagZyCB@b984 zCGrSZK^zal%vhoBb1>@_>6Vcwko|zwNNh>$8{WAOIX3FTB}R*De`j_UzrM{-88{Ia zyDV>4vDH?Pheil~70XP9IPvA?$wM6l?poAi<~-+Hsrg34sw=a(cW>r;ZuBBFuT-Wh z+j()LgU2NQiAV!Zox1ZPdIUwc5woUV8Q0M!jBR1go_$o7IdAlD8$HBNIPnk=o%1b# z?ZmIZR%JhDR>klPk~&lBvb`2YVOwn`eSL{<^WPw1s#HeKqE=Ln16R^a6fKY=cW%D% z>*0%`2(5VM9PFS!LvO?3{jh=<_;-ku5q#UHp~bI-cQFJq?r&jHMRNSMcBSKHH(*|T zr9-$GxXF5*ch-rLDrsiJ){!VT_r{Uhke00NiVe}K_vR6**oSp7dgE%1aySTzg$B&+ zjEz+rL$;kfO9{dgTdDN5R#~Oz+E0(Ezu1|iI194z1~cpyASL=Kjn&Pn2$v&do0%;S z9bKJ%v`2#?wt6>7m!i~IT~%gN<6N*n*h#_KCDfgy7{w)f;GRmma<+Soa)Nsi%Wg{N zfmIoOGskOzI*E88kY!vBKCB5~X*QuNsS>=Hb5tWcL+r!tmFO3k^{F2D487+vG*1At z2itY6jS1~4@UiUHf|{NeUJHO#OmFplS==IZv5c2=l^|q?m|8yk*NAT^@f|1dt*T?P$z8EBqluR3361g0WPo_f? zO{s<|@1dQ>KcuVPU`9XlgS5=B;*W_#Jrm_o&VXcWK^T;l5=P3gIA49<3Y!) zPIaj`#?Lm{0QI_InwiuG%HPsnZM`9?!A{eozW{P!nQkj-re%f<1J}-rF9n$sXqSe_ z;mILT+Ck4o{Icg;6Cl|v#AMx|Gz<#TQW<1%P(7FQ@CTAtB54V`*iOz~3J+7HI^6}D zS0Ub*$feTo^KWuNjWgErbwzd0)$e&QC6pZ8s9=nVBx~PAwe@E)@}86pE2d>TxhPv#PW>zb^GEN!wrg|fB> z9fWbJ>fqCN+<`;pM_#Neslk}02fw@Vgo#R|Q!L5{BLU z+EFI#!AA*?Rm>x3AS-0zQoFGCgU)WBcz3B6f>Hg9^{Ded#m?0FGl!o?kBWe5R?*`Ijt(44DwEU{5gz$G zxy#l5Q<2ykWwL>FhEl`ssNWS+!3~$jsj|R9Ju@YAm0~aQMe6z_W^;3_`3~ch^AITu zrOkj#St;Q3cN@VEd(E|rOp}aF2|H9`0s4+84?C=>fKOP z8NJI@39dP@WO)y1qK`!y0&$s{PBJNVhv)xaER9bF-f#Nh>7zAKgi$B4VF~FNs zN7f`wI3$N8ghf*m-d}%g%h(!f?pyaCTEDW^`=JEepze+XNj83vjM&XGO^+05VdEg}Z4;GaGrZcSIPkH(2BCUQiYER12O^k)icNso{M7@)VkmP%6 zk-ZBNMrttFuZg(!Z^Z^mVQ+LHLTx~aiA}U*Lc&YsfyX8r88L+w&?$>ayEaWu8@>ch zcRD!Cc;Lef4x+nwqzbA|(>7o8j>5`uMY_|^GOG)5Y~rd-xh7K+nMZH6&1(LtUD;0l z<#>VInLI#DFU^GKW_gNhTsdiPDc^vuPUGMuq+PwA_{Xz(-VOhb4qG(FWFygjH60J# z;fV~%^ANd4`iQmx;H|9w!)7(C2u@*)B~P|#nu^s1yu~+)CCo9S>MHPK)Cs)H-I5Z< zdYfS%s6RW)IYK0@S_@V)k)AS|*V{v22G5gV7&vr>ch0QbL4YMpTu#sQEv?ssz}&{m z@CuvO1p`?$z{VSlbJAHe|9m&udb86z@G!aA&wb|#!HHT_UZGcG2%KQt5M2R(>}=wG zwu?V0r1vh;^pri0PZ3MT*bzn=J;}yICeevwj6zDDB>mhGRq@b7zEC|pwv_eY=lcAD zO7hkws~COj+{lV9ct#{AoP`>~pWkmSHKGb0=)WVSX!Yv~XjH=oRp2;~wU?I3^+`}r z&e^*FoZ~oY=Hn6lMc}4iSx^;AkdUNV)`cJflJ9T*Rfs`D=J#q%3)ZILGDW1JL=b;a z=>#Y>uV86#h7dJgullVxhIE4eCFs4118 z;zRRLqAQ3HatpS3Il+^5RcfMZCkOpbsGgoV=mpUHOLBYNf`V(5|$=%!=r znz#{x3g;ed{L#>)vfO@->yy8)g99uJY|(uU6dR>G4tA@^RH5ntqq3$S{roGsrNfP~ zw!mMJ2El9=>5YTyfxvAVavWD&-Y;2_XGtk5gUa?&w7XBQaj2)&vuZO4GfA|QJlvTp z2Mg9#(wkTx_$UDmp9E0EWKlpsd4L|6=_Ju8{yqgPM7RdJmc|D)A(vSiZp&Xt8C5Jl zUx;VS3|QSD&rn1T72|s$B$^+U{7Yy40!b7Hjtqi_fJJ`KQBQpl$tsVYVW?+GBvWnl zrO2wTfKH-jA&pNyhB=Qs-hw?YgA;8PHR|KiL{&b8orzM zzFJO(%xrb`<+No^X{0?}2QELyG6q%q`rAk>D#F_}RaRob5t#YC+fvBSHFXcc`my_1 z-O$gK)bm<%S4AyZ!gr?7c`&#FQUA_^5f32_x11=(_^b;8S@tIu&Hv*of!dBE=m>MF zs5@yM zw$_hZW2AxpEDf;CENr!LE+}mh#2}Y=(QRr>XyfA^%*D-mY3UpCES6rkH`A@G{w)l@n&5Vw>`5-ea%FL>K z9xE+otr6;Tau~17*NXi4_~vQRU+A9><9?$zxkELVBTKFGw5*Js0a?IT(|=`_OCK&PIO z`lf!!uqu!ETo3A1VX$#GW%L#uv8o^R{N18xdk~Ds>fu z!i6GU>8T`}p04s^;$mTO^k}Xb;Ia`myC+3}m$#N8F7EMn`wjUuOG7GL$?r5{S^sE$?8O;?e9O6P zB0<QgqPChl;TF-uvh5n@Y&48C7p{}PsWZQbPMD2B^299n2CiQgqBMPeQP@o* zj&9i12Uz=7GGk{bHrNrMi^e=#tIeC)QrX{ShRN8d_};xl7Bg_?kU>gP7tN-VKK9lpDg3?nLe}*sn6ad` zg&vlA`fID9>}1py1WTG-j8Oc-tA9=tf;d{QVf2K%yG~!8AxWURsIl3;__(MIk(eL2 zi^n&NFb{M3rZ5ljYst(7|+zk2NUt~TW;qJfKB1K?Hk4zbk zrOOy-(Q?|}u93Eq##wMU5Mmc^qV5KT!fj;l8lti=9~d1vaILgiOhrxR3gjHaW_LUQ zZn;T=EKWzc&qk1ztiw&gwqxi`fu-Br+cm5Cyn(q`qjc({bdyC){^A!1{RedTun;aw z3He)n5?4htG@=Pwuh@O7P6aaiE^w%)*d%D~E$h2I zYdTUi&Cl6@@y&4yIo)#giwdD(lJb>>eIbu)^z~k#d0?ARQ(gCD#7*B!7LCjt+=OW! znj}F%!HbWQ%RkvvfYSf*M$XT0#-m1P{Fis@3lkc-D_m<{2l263zdgEC*8ti}q^f+e z;RlrLvqk!R+obKtVDqJSUQraNNQW5kS$Gf%JYzmJBWPY4J#zdP>VFI~L&^ppKoZ@X z>ndt%1Q-|8AwVBnatT6~AA9ZD*fuP{`+u!6w^CFX02@gnm(-RpXKe{>yIc^&rNAJw zs*Qp}g}kNsy6YRN8ttfIiCQnfek2@nTKu0(xY>;LjY@7{tuNirrZcNWGCxZEE^sTI zPw)6Z&I4`}A=C|uEzQL~tXJpE=+lIS*Wx*Y2zSf2Dpb$pl6Y=5ONd%VVAP$C)s-$~ zW!#!}cdv~2P*0zm(6nGKx~l!Y^HF)q#vAn1&Lvk)M^3@T+MCS&st7KSnS>7u@LS+= z{7bZX8UyWG+Wp$0L6}FHVT@vLta$aGbeP}>TS=b$qhFi zas)UJZc8ldQD@m7D2|LIHo$z`dm}Wm8!=h&s*`k;)vVE!Yl}@av)#PtI?2% z!^uKZz{oNb%|(XXOqLp%-Qo3aw8mbs_=<(8YzSaN4|J`FM{Adw#gn!bE-w2R~Ukqtt+s#x0USqOkNEs<=Obd+AN!o>zg|HJ{x0U@IkTY7G0Vp za??Y&e8&J9&ny8i(cV;_DWl1BKx^^x;xfV>e&&gpt8zRoUVLT1GrmUEQ8+$ zEhi*@lOL3&Fs&c)hsZdgEm9Yf<8-Qvj)qBM1a@#Ouwkx`Y)`?Lp&mU%nq$;zkA@~$ z>yuK@bMx#iSJ>YzYbxk8Kuja6^^6wH&hF&~xXsnkG5sjyz)$Q1ACA9=}C_Nw^hELQi;*&e+-|=RHZ847}yk=B1 zb9Mhi888UDfWg$_phWPh07UD!kL@GhTDM|ky_ZZ2?SS5t3dz*6qNf(yrXPXF(mIpc zK(ZYNeE2tz`n*^xgFr;IdSRf`i?E`@Xxy1j#8!151O;8UahpUBO6H_;y)m{Q4Alqe zkt@YWI-{9}+s?sq3SuD+nzjM&DefY@K?~J;M%GLCN6|OSfEk>+2z4p= zr6@AnB0C_X9|XN!spM2vI_Ts?o9;Ugjvw{h8|6MrE8K0(qvfP~dGJ>Y2Jz3ptx5}R+b{+MvRg#LPczVGT`}<$G_$hve zQ;WF&fGAY7=e~3$O{q{x;fKuE<47ikS?s8^e7?z-9Xl>8szj{dp4EdzY z5_S;pm<2Tj&lcJvia_gE5!pdM7kkqm;JsoP1XaDN4Jb5c-j3-udAFtxmOdfPE0i9k zi4(lZ`&ps_xtZ%X(zc*`Mlsuvz05IkJ@IWdY=nNsmYV4W3s_}wNGfboo6KXr&g7DM zHNwq{G>k~F3W8Wrch76_4X`71JA*QgOI?wxj-3#{s#oCDl6Rxd`Rpn@MuF2h^fed; zkHBPO)K9JEM__1=&g577^Sj4LHKNIBo%o7qsA1d@#2z14$on8CHS5&J&KWzYqv{nF zDVXH7j3K3d&19ds2k{0DH(`vJ=cfGwk~Z&d);+SucglpC@)))I5XG=>)fGB$oQ$z< zijv{2GTqO@>(n@>nmoSC`L>hBEJ9^83NUFGkgN?HpoS@=31b#qn2_?O(*yr~mrK!o zo80aDev+d`viCmwT%^&x+@`3uMDWH^kUGyhC3jArC0FA@)jK_G-BGqiQqL7fb3yj? zk{etkIZxbEvAt+R=!IHm*_WLK;GYRVucc@`ZTV!mfNE$i<=&mMr0ms7sa!*k>=yKi zb7M#`v(-enBKhnpb=4ow2*R2T2rRFc+#1RXYMIyJW+#@`N{Y3#`H0~=sjJ2%pRV~! z4qfde)jyz?IbEQ%qbp8nxwdp5iXgR0f=`f>1=Zx5zRHcK0F`8c`4BZALOD<8IIWs>ETb?5SyrPKg5#4H)qp0|p-1W7ueyxB zJ6*f8=|IgdX|4+9`h#I=PcNAf`tTQR46V$>yNGcjzt;JOYF-z6tM}jz)Y)NoJoSgv zvxL6}b&IZW;tu}-fvEQmf~#lqg{r9c5U$dRiK$r!ddkistI-#n1i}bxIJ_(=2qvtbNg?)J&MxirzVF)~3eu1f(8#c`H1QhuEtmqih#|Egxo+aE5qw*?d z_>)FLlWLdw$v{>kkRnTL-`W1gs%Jw6U=J9^!Wa1utA~c2eB?%C%{j7fjxAz4vOsYJ zKy=shmDwE3PIn@^mfOs+_{o-j$j{V-8ffb7RNzfM4qIKPVprvNBLfv->~-FI|DF)N z9Sywmj!Z4UKx=fQOFhtwjw-z}xG)549@A9wi>f8+m0qhzwj!^x&iTC69m83crY-3( zl>sBu8uwP{Z`w^k@Y52%L!1ciO7|ewW=QXlEHV&~cRW)b5k8bDibK&~Z-i|~i`o-k z&TMN@ODpP{oyKKgnM^AB=ZzDDPTmkZ3pn%BDY%d+Tj6Z_+4GyG%wA7GNU2-x5=4h} z)+m&DGS8xx8FEb#TvBKxEJsh|5A@ zWA5SZkV!`Pgyjsq(`JI1TUHnq+;WtaLScZi8?=BRvCy+6c^oZ4l0b9cJs+lVef6T> zTCZOP$#)pY{wN+kGfm5eIQk-RzHt7cx>C|FlZ;JQZlFs0c=zvz1R+M9n;)xz6THVLSn_Gz@!zJK5cK6LThl z!~;X~SM*DM=Fd{|SC^b>Y7|qoMv}_ysB&|6?AL7TwJRNVeTnq+iMTq((ls6XHTA%W z$6Km3Ee7{~ticq@j@d{5yg_m|9jk;LrTil-TvyI5m}Vd7z|+vP?=LBXnm$c7FWy)Q z1bBS{eXq==Y|nbC(>zNBpc>^F&Qxy$!VP075T_l`BomgP=&le2%HkG!@xw`NrXl_U z6}Ck-h%T#zjjVIvI5ZREnLJ0#DVmFYnP@hItr^;-jjTw#9XFe99?obTm=yr9v1r8N zTu>M_0S%qM@z1v|vwY5@XI3YbMpo8>2llaC+b%twMSNc{!`u%aSngOJo7w~-^D{#} zfOHxRxr~IEYi-(~H4yxTLbj2*CJk~YPt7}TUdzM zYt_3nBx|i)68g$o;4lzg;BX&OwJszC;bbyOQ?|etnGztPBI>4h=*=!5wkXsX+Cp zw}&63_zJA=?Twed8ct+#xr%+XJ`XW!1%ON3#x?hlcFC|p+2ng`aA3~)abbHL{f!%?E2d2yXtM38OFS7=W2&zl00@25b=`52XEj&@%c!i; z6b(4cOpF2qE7nrln;jEkWGQS1teta@8R}@u!+lu7-(^gR4zuZ~lj$9E37$)~II-@OKOeZPqK-Q&bgB8s3_7X_Db$+_*7x#a zCyTwsYJh%VUxrJvu-}Xv4yUCbH%3AbyHy;&`KdQnb>emrd z*nM{T`CT{JFEzKlFPc2JpC3FdiG(lY%Y+7sWq2o^K0rTla{DKR+iTqAE$G8%|JNTg zYmh3jD(-vO!(2~edHLTjN=-UOcqv+&M&-!{vU4T2QPpZI%BAQbaXeW8NYEilGAOb^ zjuS^VlTN5814!gSnj=bQTF56X>n2^OF$dZa+@)u>Jl^1iG zk?z(R)#7c3hxZN!z$*qq%CGb+XYf-K$p;X6_8_5Q&UVpy5aQYXVg2b_UU~TkRPj(> z{)}%>`lav~X>o^gyBAH2sUgp(%h!6`5Z!(iC7zzx_hp?udR9ZyZ4Lev)Fy~D7t?;F zc#|Ngq@)>YOnWh(Tpc`!0QX0A3S3KeF$ppZkFhk2$T-|9tBcwDn^3}6u1@$)O#^J0 z1)MkP2}`e^3^RrlS$JelCLpm*cRD6cR%Wa{^KcYG*9B(AAwnYmdC(efM=1SDLwMMm zMM+{>^D;BBh{3!-|Cgc(@Uf1OT-`Qq40@i1MuQuPqBG7`^;uFA$C0S;CHkBqE99SV z4QaS({9oS2XB)u{v?1W8GVFn+p-8eYlz+JY%(w;}6XkegyZVzF;VA;E{vsn=W^(4j zRw>k+!TVA#l%+Ln{#|9mJ_(&$57QH4k2kdOJz+|kGC!qOJDIiB-*BuSBO`OduxZrP zsEoPD8Q;Ri4WT&|j6f&1PM{GaKZxaMddA-t{8kI6gMMi@;PKX7IP51G0WS$-*I~Q~ zz6LWY*_1-RTKr^gBX|`~BDQQ@#)O7r`@ojSV7MrUrbrtCLDYPvB~i~IvP#~I3yC`I*32BH z<*Eo+yzaKRe$2#@AGHh75;WlDt-?vLRvZCsqCE-~3nkIOc?P3bhJ}*uv@V>i$8sn6 zCH-Vx-j)rO`)bTxH@NZ#8Him&SL9DpaKPTvi{L|AQP6Pb)U<1;nP34W&|MX-o^^!> zQSNd~LxSwJb)n9rQ5KFpctlvM6DNob{P(f$gh8jAH@K;E$MmdvTPU@aRk2-MBvND6 znj1c2izE!FQ(JQF1*S`WW|r~zWR)0`JRIHe%q@o{ojCzV+wgGe7?6TqIU@uhR2dT* zpo3);go|;DEw$c%Eza<5*j|75(xq}T$d2RbgEs`iZtGUJHJODka?)zH4U03=avR0K zcq-4{(=O=4<)Lytiz*JvdbG*iFfX179A^C-{|>)NuW0yOOgm(3qE}tZY51l}!tCgZ zw`Lr0wF`2DlY~bt++-IlP-X>$A2TGlr0Rb><^8Kc0=JlwpQtiVQ4d%!Ld#$?y!eW$ z5wFr#=3P1!8IpwdUReBLA!hfBild&hjYVCy%I8aE-2ettYc4vjQY?Ot0~Jka`Ofzb;u%U{$T#I|LzXwAT~u6xleF-gU)sPazBagM z-#7~CV9<1%(AQLL+cMq58I5?ha}AN2)1$Lprb^Khn^NA^jw%_P<*d(15zvk*?viPx z+fkQ3s3joQcPfQr-f5#QZV9ep0$m}ORLgqZ3Xv~(#YnsVm6vlz-Mo4bKxgq3bJ@70C1Wb9X;j<@5Ydaxw2C$+r%%o_jBcKu=h}J zMBgXyyXHJW$Tjr6pM!ZrbYUQ22&oT@#Ek6Y7BjIz*N7HwDf47{56`*MFQK<%_uVa2 z>p2_~Ff6gBcFES-;U@7$R|6Idn%ZU*>GeYS%6C7%W?ZcV&RA2$McJble#{vGU^jr% zu>yc@Z2@E;U@#ysPzW$EFmMpa|8;AFfFgsT5HTU43V{R4(MnFtEQ&^GB#gr7&Vh-_ zhJ_6S5TwRI!AV66`~NlpC*MJUfdzm+E{zhRfsy=E{)SN1=UgZLJ*Rb=L|d74E7s#r z8uJv+KIPGt_T-7K?-=ntog#pZa}G&n;eh%M2nV$SUc~-c#pLfZS?E`Ishxn;{n-l%BPe z?$LCIaMt_mhK0x0C$ZEXB9Lc@Zx8jpbgFechS?B&kNEeTi*`eJ>~E$T-QPl$O4OdIQth zQ4b2VQ|?^U2+QZG&ge!GH^%ly1l&v=Aa7cA1Y0h9-x5wuI(C>iDpF4q9Noh|FqY(z z@1`aheo(Sj09~4KE8fAqE2^G0bW##N#ca6gyXzxPZ#K%Zkm4s`OEW7+mUB?JD80_% zX+WCZX2~)p4*Ly{5THEzl7C==2gs|K>bUd~ub-&(cYN+Sy}VROAQ}6jo+w{R51g3O ze9xwUdQ#r%%n1-Nw2vWeF3k*`;s+0OSOnRYcHHA_jG0{VKsDKc8F?s`zfP@%>G|-K zNM9j-tZM1G=~eS0K;*zDlP(gh$b-f&$Xj*WK3sbbSI_dfqZT@;bn!;WF$_d%mkL1xUn>P$jd7Z1w61?G{{=LbqnhMm!ooAi&(I)X_7*qg zPXZfxf^U?Pj)~m%cj>C(t(|#<9vyI2Udn|#`8Vc{RBS)H`S4gA9JT7hn{0!D#8NK?*s|kaDKsM<3b?d)P zr#m33v`;$Mf^TA7Z-eS@;`3uT2v=kt^=e6OPY*EXHLC38EaBy|$XOoQ(zE+9&)2J!uwN9G&z|K>FJzc7Ln^0#3`F57Tdrbv@ujq$*m_ zUa)Mw5g*h<>towoR2k>mDsWYk_M2zllk0_K0&jG&Iq6w(K8u+ zATW9R@@R`V&VQkhb#3+QwfDMOW4pzdVP-6!u&zqbt8Q@t;-$W1R4)OX&PC61O`&A; z6at)L#=YX3oFk#X1Tch!zt-PC%@R{E4L)uP11}c)0!Xu-CZ_OQfCkB9`Kufxf0%4O z`F*d5Dgj3h`K!^f$Qb#nm?UlZK75_O8ypQ16ll7Kc^sVLe9jlDda2@G1e@M_S}xzY!LQ^?R*i=4+KJBZ0{E=tdg56!Da9f!lLS(8yHSFuUc&Sk>4|9Rubg6u>s2 zHpFj%79@YOZPAWhey!hS7w$vqY=5#bpC-tZsKTij61uL&46H^%fR|>a^&yP5C7&)xkbUY0Z z&LgR0|4Ho3jbA#I4xL(UNFJ?H!Q$-fw_X^4$I|U>AJ%#YfSVCrcRXO4*6g ziyCSc)`GAtS&LXxxn01+lR$@%bR1@*34Yjta36Y?8&A)Qd_oNW_opP!kU9FnQGGoP*u{t%w@}5??w4SZ$I~3IrWrfJ0!~vX4jJ z<`w@3R9^(}FWUcU%6`#;)pq2}aqDQ6^a=O3QeBQPrQWLqvS~o4S9>&l@OtVQ1AUT?spapRt=7n9|X)ZV-J`;Ke)@vV-L zhqq_>P`e;o!tQ=QH~@CpgW&NmwNG(?oynd)2)>ym?is$B^EwjYd;z`)`XpX&0GI=2m$}<_@?R{h1c-$} zK*7MEU?3qtp#B#NgMb2oA%ml!5^3F|N zJ0U5>3KAoH>s-=VUa3lYtOd4KR&5z{`&bJO2Gm|3CQ2PTHSj^2r5=NeN7>We+~;Xa z%S>(ts-R}lUFWtWwIx1L5u&>|H7VuJMf&*2|E}2qToa{Si;-N@%HNb}eO%|GM4b{= zfi*Da!H}LohkaCNRQ<{fP!|NFU89MoY%UeJ7it;^v*pP?KNsL3de!Vnw5KTBNUM&> z4vmC`E~h`hbscK#A0+2ip>=vkl>3b-Cf=%+MiZGWjoX9jURv|Ga+dTlA(C>_oQK!E zDWT2cH$$4uV#n_QR*UyMW6w9z_^ ztq@BmPWXefE4P%nu>zfvE>pN%76sjDu2zMJblW2+EkEX?r=|96_eiu>|M|*Y|=`NSD6h$fl|B1D@Jzt`}Gj`n|~6U z!O9(x+JoaLuH_Lda{Nljai6oTk0vi2L6BXt#9lL{k%P`}N(dose83&mFq3x?9Zl2b z)s!os0NNBP*^yH%8WlK49vm?hjO!Q?O0ZKQV2Q{vXE>g%zP#sS99SA1%3)w zb|p-Y?5q#*?7~Y)o-gb9!7YVWa7Mi*<7n_in}yuuA&P;r+-FDG&G?;BpvA^wrE4JN zhh8m5#N1{A^XVyQsJLxG%98tDwDFYne1fyu2wJG(vI~+821d+;R;o5yOM9Vk zk-rj`KKpH*i5RY#HXS*h-AMGTy+*5dVKuv$RUK~S4UOjeaCb4B1{~hYis+Z;FYE8= zb2lUX8}Onkp{xA#)Kwbvs1f5ooEA2t|EXHiVlHNK&A5ry^s~zvUq!02>W;|%6+paR zWgfQ<-hc{B-`;Q;3R1Dx%(32i-XYwf?lDSAUP)Gb!2dI*I>eww&%gr)t{0EXULRzN z(BO%1pnCb|-_-)FvwqjNx}y>8DVE*21~S^S=2aGT-UnJna?9N5F1rLTkFw|AwSX(a zP2QNO!ZtA+xVo!*ShkIFbaIMNl9!W}?(nU01zLJ8GZu6a!H@2lD!t~K`t%OhBYA1* z6);l2k1zfK>H8aIWvj@u2cXvKE?Y83YBhe<5i2uTq&ipJhSPDCy-i|--L}r$izuBj zJ>{OerG-8hR!?57RWHG|CK04a$|*kxDP8n5;m{LJhBjZFn|P$ zkqL*0#1TPJYX=FQGA>^Dm!XbX620KXAY(~?VYV9yMwqs_N&1u(=u!@N(bqyvYV#`8?9(4#~q#N z!IR}~+S60$W@Nkk+e^7r%)p7A)lg9`tV9Eh=NidMp_Qdmnwm3m%W-|yn2KtQ&$=@X zuKC2clEYF~`9`suNTay4s7$LXfa(*%$jmb9U?s)echK&uvAuYoiz&#*-2o)c)Sd9q za~lZfY$2Q3u-TF{k|ZPzIy5V&ER9JIqeiE~Iv{O5O#6IMraPH3uL%p1dMMTmrp%EY z=UQ4Sj2}1bRBDR3y%B1)7UafyL2tu;Y_=9PL^H&ViYNGNYNIFvMe_1A*$?*=R{vAU z3d6JRJbE^OK6$3@3fvsXvSJ_ITN&&c)IXmN9;VwLYgZut23Zjf+*A`F_SaW)U_NXW zow6&b6vGB?rNC{L%OxWw#fKVj_%+<7X38O|!|QB6?yQ#0wU;)e;b2$F)iumxt{o?( z9g6Zu4=KZ;df}y}N0LQbO>8B+l-i7?g;h-(y+25e07=s;c^IhQnYXKxU=AxZj3Mjj>_;Y-tT|rP;P*l})v8 zk!L{dw%D=M%WBj^E@N>{Mt;mDG&AQJx#`r_2DEa@oEs2K}B5%nfGfq9UDLdQ!b=$nhP4o2QUuOinHO| zRmGd8Ov%EpQEI0QIe z0lI^&aO4JhPvz%le{j9(EvEWc{Y80awPL*C;Ftbi+ zJ`Xp7=oFaIS#(l8Jj&jEH(Y&~vzkB-c=3wyCIYOwNAGYWl9m=H!mEgKYEF4(D1Bbm~OQGAN+M+YI z0GnyX{5GkEENHWBq~d(;RDvEod*d;94XxVY{Nfpi%PldS*Ym$;#n6=iru!97yzv#7 zk7OB6sv@D@W*Al4LFw6c`n6!L(GFKZtn$C$1 z#;)BZnDC**tiDiVCkuf`uBZ>HiEMdzddr9!USDoRS8ZZbvK%3yFBiorvj*TesvnenpRsJJ~;=XPU1f-5HA*++P|}0t9&P zVV>1-eCe{I(WMmPrk8Z_Sr02ynlF_om6A5(j4nG<$HyP)ty|Ixco{NNa;uqks#To_ z%O7fZdSkh6lGaL`>kg$5-+nF8##=)Rmk)6{vh39vG}3CbJ_qi0QjO*7+GW85wAFf7 zLNY^402tP6>G_tcE*bd#SrjkwCBxPjO096M<((#WJYRB=?gT;)9}1z z{U$Pt`ic%Vo08_#iX9+T;IkUb>srfcIc*e|!Wu2H5`Ft-BK>?(owUrRt2Ogr%}~~r zr!4U}E8<$lf=aPgmBr2Y-?|E@WB5~LCgSQLXTzzdIW}5e1sVXGVX>4Z!jze^_Ad11GNwO17q!0HA`shHalChb7X_=P zD{v9<<})q~ZOjza)xr$dBkJOpLY2-G5u&e9lEyngHrA3%bJt@Yhv&9#ejaGNdYJAK zOW8J(Qn9*90r-D2oD8p*Eoi3;W11GZgpyJzDn+ng1%pT-q-0dkpoYl2Rr1|b0At`a z8R(ED4zTXreU4#^^+@S5*uPJYo~L@kvh9#_Ex|uDNZ99B$cOO7eoMY6xg2_%w(PR2 z7cUt+zHidkGOO`EP=k_DmEjcb>hNt>KR|WAFFgi}m)h%1D#~*@$ODFNPsbHrYLEi+ zMsRFHiqhv%1$xRSs*KsYQ+->yz;gpE*0BKfpU!!Jeiv^b3{D}rrT+)S5ao&5&BsKhLPU#VHO}^7?C31#!T*MY)w7l8t9(_%#j&+nMJ9L}{*?md zGc4yqxt@6&v1lxy;>V22p*VGIsU9WXfnhQucvZ@&Zlue;kXaV<$=vrpEI5p)d&{|6 zI+^vPS+4P(k&29sc5Smatg#Zl-xIw!B|)HwjrJI@0%;il7vBr0?|TD(7@oP@y{4PBWIJYvWfWHkOjP2$D&Z zxQ`SBS>#XOW-PSM*Wx6>AmXjPSW}(j7XeI3&#Klud0XG*>p)+t)yB2mW>Y)$qxvup z_-L+si;imKrrcgF6Dkqq|6!j9KASpp4R?R647?(9n5EEeyI8n1|ygv6ZTf$OWrWLb_|hg)syJqCni zEe#6X=HlF(Yzz7GNb%J+VJfHmU%_zNPqk0>`H>{g8Ggm0ra3XVfN1iOEQv*BmzY#) zBZy=j2UXjf5}C8>cGET1LmO1)DpMJX4gyO3IJsft`&X>u8WY^lJd-Ot~j{Wq7BX25`i zDaQi)&H{VX7c^{v=5Q{6+nm*aU|@omJ)x-bO@-XHL3{WVn^fqf{O>N2Jot%iGlXBZ zDOQVoqhz=Hm+WbC%5oA@GwjiosJFq|f0>Gf`XG*O51!f>+~dv3>WnT9lzVtqe(G5_ z=?NA15p73fjNiB@oR&Fyy0f0*J;Rt7pSPvww8bFjX4s>$4{z5jwPJB?8N`pO>C@X9 z)tFcLoTvlRDzIg=ZlY8G!O1ZyVqu!5qwRw%(Ls#jNN!N8T42e^ zy!C_}ua(}VacCV;^{`^j+-%Y2&Rj+EoCOQ*E4ieUQYpnvuAX}=kMI0i|Tf^ni1ONvPl8u434Vvs!)>%>3!y%9rY9#mQ$qdE=jjB6tv~l08wqyv}G^T!Uit~Qtb87?m7NF+`;xSMk;=D zldbZMxotvTLOOIkjxf4+SKA9z#uCPS(3wdh>Y#4BS}J?$)k!q> zYE$`^@-aRFSQfsu&t3(P6e|cyNhM)P5F%%^6ny6E#EDiczA$>Rvsx-D?uPYo=Cx>+ za+)RC9n1FAr|&=shHx!3(xPfYNeva-MmkeivyeR-V`RAUyxVZqAzLT?haclfxHg`? zA9NPXn6mw@QejcGnprDtF227^>|`qYQ8oZJD+3yhcY&ecF|z4Iv2BY5+%8QWx=5HW z_kOQS+CaSHrjoPJv8I0!g*f} z-VdT}Ka|82n$fcMqtDI?6$mh6-B zj0_hZ=i(*xmW#jaDV_3V4Ob;-SILBE zltBsPL*GLt;*9!Yk2>X84CEvD)0KtuC-_Gd^qPpHGP}AffLltf)*hw0D%F5*2VhoakNV^IiEbw2j8pwAq7-g_@wNXlx$XvPoltm-Ja=f6T~; za}KH7d(|YPp(RNUC=bE_(lWT-PuW&oCkqwiu% zF)^LO6d5{=BhaW&yyASt8bk)y5Nm995g-e^gliTCnUna zL`DE1z`&j1!oJ}B|IY`21USu%8k|ZB?N}OS3H~%38#f^!Xi#N7>L?mN{*-?pPuJFP z;+Ft9_%N^En!XE4mr^Ma7lOG3-;hryFUMn0MsR>R68$vG&x~s9f)5;D89z#=Bg$2^ z;}-rF;=UTcGLnT{FKZpQhP@J-fgqaE?L-p{Iuw-gJM!4JsG5OVCtW@#VCYLoklkvO z4jWUN^U}tbOZ`nsZ3--NhJvd=ne=SvOVp0ZkJl`+l*yZNXvIl_O-?nXO3vN^aW0SX znO{vqDX`lPzTJA6TtBeC8>@n-#5;IIuP)fj5-1||DBVY19DcJ1rA8QvD7p#x3I`6e zDjtHVOJF=Q2RYBV4MxHfGehtcZF9?LSo*?tkSp#<633RIBSNn~vc0#CE7ZD*YuBKB zL|IuQIl6#7ZIXq~x5O{gsX>Ex_?@O6~=wsSfy%D|o97GGNi_^7K|b$`I0- z&I&9;$+O{}<+Y&t6vE6kxHSqfcK;{en<&H9g}4bxn-_VC11^=OCQpZ&(sT3E6uLgn zZ*C1$#mD|t^b@NLh8J;OU=6<9Ji$LWNz<`{|1k)SWKbZD^HTFF1GgVhMYgnpRb=Aq|3J6B(_m zX!bOy&wv#-si=A{*b64HBKG=&Z!RAr=EL*UzNbRXfD^7{xX{HO=yXDbbl0y8r#NO@ zM5F6=x~6KTepxivD|qi%K1M6hsCYz$B%4ujTn7P=Nw*~S3n0w%`(O$gB@(qist5%5 zh^=smbOH7)-M(BU0W!opJ4QC20Rk%2G;&#gvXL~4yh|8b?d{f{nmob67-bK|=iS}u z)4jM-qqI42JeY^llk-kw(d=+{}HjW6-CiLOsdgP&|zCM=o)@NMjo#~2l=!UH0H+tS!EDuNv%5l z{{VnMf4{Q+n0QF#ph7c27|Kl*t^_(7Fs=)_Ay0RvY2hL?jqe;x4}->$NY3DPbn;+; z>Aojy75Dfk!CX4UqD~0&i%5o=?!*_|St7^P`sKF2*H#h2Kjp*Ut6>vuVyG#-#-IW`T z4nx#99#Aks!I~H70%pj*=TQ98<@_X!X3iB3m*Ch<7-0jQh;i5zBG49q?~FcP-q_Qr zRQ{dicl6a51y=Vke4eLKv&6FF0u+W7Kv+&qS2=EyEW3R73o#7epw)BBHu%Uyx>A9# z^uk6#Cm~)_yMW@mMoKh7dSc^(ZQJyi3(_BQKP`%8nrp#cSD?O}vdn z^l^fK3a$ZZA}7*dIO)fnUHQKNwSc1&$9V%ri-+h_cvzcu34^~} zY~*5}+{uyl(DJ)%n)ksUnPBv1oLoOO$>vQrDMJThQ}w_pqQx`l;qvf(vDd#xo#CuA zBpQ$_9iiSS2(W@iJAHGKC8nBsdi8{^lzafct|66l{qh^eoufkVr}@Ms?F3IhQwU?) zk!fS}XGrfDEhE>LoATMG42(;UXip0H!T}w{5Up|9>XQ~0Wm-0lrx@iSclc1wIu1h{ zF!)HOV3zv*F%gLj*xWeEAkZwYU(P73n5`}W(cm|g*$8dkr=VqW8fpz@^mC1*@=DQq z5%p)KR&F-M()SK=)cF=tJR|Pw2m?STv+z)*(>UfE*Kb*O4+?K*Jh;F_n~lm(8F;gt zXjD5_mlD1p?84F03?@_Lc#s*TfV}Ga<$-YZKh{}FOQZH;k_t=cYl`8Z5xwgKh&3jiRhXN(WHma<)QgS;S6gcLEs1=spt1boR*o1+^PH8+l>$JK~| zI)wEwPTtbIaBUAlua_7CCYKaAj!T4)-rqR~J>o0Sv*<5@=n=s`Rw4RjhQ5>b z%ZR5>YBxqPOr<1GE|j4yX0TX(Sl|kPzL^}3OrDuCdSvv($mBd^!1y>2_&!lHU$_r5 z7EQdmTJ(D*_Q9YOp5*LJEyLwXCL2c7)+=GL8}{DYCCy1}p9{eh5O%d}ZYQR3y~xJh+D z>~o3eN(!bB0}{K(1iN%q{eLW85KTGAgQR@tY5{+X4!N=QfGb`!+KL ziR3OgO~4Tdg;k#y%(^2`g$X?m4hOL)2$c#%LAJ?;&;SR3{H@~~3IPo6Bnn4O#kK0F z+Xb&i(|Ia$CNQ>u-~q;%cGR$KW5OVm%bSTQ610FRL|opmg)!H;u|O^gVr{q+4KT0M6RzSwEt!8oF3u32s8D&qV^v})ff8Lu3c0A= zf)O@|1V9Og2g}Qr{{T}r2DZ`LjBsQ@B-F~s*aaXUl~cXr@4+#_0D^TeKmZU80g6ii zkcEXop>t&#G>N`ScR0DojiK7mHAaoUGqHy7$Cv$v5Zxv)HWKE{(16aT@%|v-n`ZOL znFi*o@C@~c+b1h9mt)0lDX@%T{vP2_7d)>5<(V^c;(@)6!_~xzvSyM~sXe!c_uqv9HC}xX1MK1}t!ya>@>=2k9^*1~$-swqT>*BcnWpfn(1wM!>ksh* zfb~3QUO}fb5i7SDvjm)6h`Mr3&5XcUxGB6p7N6jn>+l>cONsuG;_&ah+Edz9?p>Rzqg?I0s4qBKbP_+o<6)!@NjB!-y<=HjL=yTXNc=NF59kdA^;;odN~ zh5^OfnQ;p-)ddmpH;e=Tf|mjme(U%VNr5#}e@977#*MyV8MqYMab;Fa+} zA6y`Bv|qls%uCv1?q8+}2;?#EE-rv_IX?3R+lPA}rWlUJAAcXu<-WBZqNDGRdGtMe zGVJQ%6eQb-Q=^_q=K@4q#`^D)O79fkIl@t(n^`(yeyd<*HdG4l&OvumOhq2(M%2d` zwTLzq*;T@rzGj(1Li=av`(i}zqR_|@AtmBR1Zi00Jq9M zf@YPy(tvm|!Ql5E<^3ijP&^h9^Sr7NyFAQ5k6-WbJnW^ zL(96$i`Ni_MonnJK^Xu(_Kmu!2PZw8I1K2G9>)T(OqddEZJUQWgbS`S=)8U28G9b$mQo0)*= zY{he=jO2w~>Bp_{{db7%59!WDm?fe#?+=iTaCng{HG4zM<2MUP2)yT$1TtO1t-1>h z^5fN_8V;X>F0_D?moe6Ugl7Be4Fd{juDz~pMR=6^0}uu|v|H@soL7?mFxS`-K9}<4 z@5+E)cQ7ab0#3531;7jDNquwCzrT!p>9a-iCVL%dY2szb?;w5CJ#O6=`}3Rx4IrBL z&p;p${V*@E%lE)b4iq!*li@OaBfuIS^Q%E|Tp$Bx+?ybGHSl1120eL_j2B&X%(#5Q zv^FBuS{C|-%M9go;4SsXP(G4>87RG)AF-MpO2%wO=-TKp5`luNzIg|Xl}qXTjGqUz zZ|YppE_+1%@pEU>29H9yo*npZ4AMnX&KhwqadLg0y{ zM@bz_K2^&hEZ~EZAE8mh$X0`jGP`QHwwu87h$z|4a7BZ(8ko}#vv2)IxzmiJfcJ)6 zC_s5lac)D%JQVhu7QEC%Nm#m zfHa(%^MsBON+LiJS$qxwoQPiKqJDy4v}SR`a8-U3i76OfG_D}z7VGem18Q%PdYW$*$Lw@>O?rK5h@TAF=b~Om-ZTG@=N2Hj^fm z3ZkBLIZ7fr@m#&zJFs>1J!49PL|FM6VY?n8Kdr^C1Dp_zvU$O+kR9+3W6m=nMNuqK4Pnuq0ppdbZ#UU5F_Nlqo`c6EXwFB;q;d0Khnk|-PDJ7wy+#4yNJ zA&uK<22!)C(||{5!VLw(>%h< z3SB*neK7i_md6j!jw!3dxz_Ax@sVRdAU#Y?Z{M8N{14o?DpugTlnBpz}( zL|CLEk~=zk!5t#P6QPJWdyESqi?W18^)X0uru{h^2Za-T;jX-_V3yaS{{Y9FDF7B8 z9>vH23OAoqwj~rVs6Da(epmp4A}JB|4Pfhf1*&%#qn;gM1TDQRvL0tR6AP%cl|VTU z21w%>JxY~%9~emwT9>6yF$ZBQXffu>^^OoJFo@41>e-MydzRzI9iDQ!dhW_O*y8~d z2UsO}s1ICf1ST9o_kD9o(tkC+aU5T$0nqctKPVIK6X5hJVofcG>`Vxx5D`4v9zz6Q zfeq*wpy0I4kOYK1@y^{d0b%*1sLuSJb-5o?sm2) z+t8_!@Iq>HupBjb#vw+dJVS4;ImvGlD~lbybJ2f7RCYVwXgNWlA|-wDcq-@+-%&Gl zPYSU}3T&KcepxbnCQO+!WXY2zOrJLXxeq3HX}X#GW6F?P*3s=#ZfVW_$L2DR;Y2@#o_;5y)b=E-su5;JKrR0PK((wjrKpPXs*St&W zDSLN%57!Yuac~Z=P<~s&6rSi{6$p+&))u~=v!T{gfx*i=mNgNe-6ot@V-#$A&eG@? z9z#&X9o0s|ctNBwqo70sZap4BSs0i{Iy7URaAtNVfNGiz;=m5wq{VeAMcb5__M>{o zDu*p$qj9xufvei2!9FSAAbcmoHiujSM9r`saCP#ni4B2rDuI2smQzzHaDk*Apaam$ zqBUegcy6@yhs(+B@LnPkPRZ##un-bPDZA@D;h0|d52u_ZY&f0Z{mj#&cSrAllw7%USa>M{#;3i4hRM9sDz*}nm20m*4opg5_gxqxIw}qGOwDGd zYJ4Zc2=*v5$yevAzS*`^?W^Iy1fN`(oR2{zrnjCohsu`~j3Y82h<(t zCJ`hOF<>LI3}2=s1g_HzYS}C)H2FYRYmT@5yziY|Gk!41;3(dVQaCzJaKxibdzi># z-gTc^S^R!TbQfsVs$ORD!H9^Vjok`U05oI~l$v&Pw;up1JxXt~ci-hCd5-s<5E3iO z>MplZ3vLapins+f6px{sv~6XR1C2d*L>^%b0^!^ReCZNAEqC3+Y`)9YyCesyM|k*X zgJJ+_MN%d?b3+UB)x2OcJ5VJ%(WR}ALQdKVNvLSvo(k|5mPJGfISNdZgR&e? zAFmzbm+T+-4zTEFCN7xXHYUL-Q7=Y($KTP6NKqw1E*{g@mFhV$Mei~$;D~V2Iv&ABSG$p1(G|AI%E^7^I zu)}Ang@PwSr8Kybq8LDMfDx!0(UDz{Ds|NzsaN4JnZY3N4-*Se6H8>l4BTfO$a5aWY#EtAd0i0TWBjW4n=7T2_2DIQ1y$|wIJvB-oETf`$54^ zqfd7gfn;F=ngmB;oM7vQlqj7B-POiCNKTh8|f^ORNaK*l6-O5x|buzA*f8M>0Bi?hw5&lPwvws~SX+?N8+{ z3EhD|R;bh6$&;(VK0TExup3xrxZWwGfl+nR_l^7!R!*_Bn7YW~E%_e6Pe`TYKLti`QYKu_$w%AB3+xoKuP9 zj40ASGPe^M`~}?a;0SSzRUX7A(-4a-u7hV*==8(!-XI+BJ{T&y437@Gd1<`8DA^zE zxx=af8B3L`Dglu*lJA}VRL~cHvA`p0Jq3LSfNb6ssLfNkpuR=UCpi*&J1NQ$$S9c| zLW@DI_j?a-rXsx{+-j*&IadxuA!@2{0L(u1JeHIWIUPE1iQI;kO$BMf>6SsaSfO zoCDI{ab*r}!KC&yamE{>9%2f4c+15IfYgJP(=PxHtzmn9zm*U4gxQYd;F$$=jM`Ts z0j^rZ8#0=gwjd@BmL}GHLfQ2|(Z+bUNFX<0&pfrt)Ju@q!L0 zjnRi61qfgXW1zZS@bQa=gb?^m3vH1|n1=5e!|wdKggMC5#K&aZgchGzB8C@JkfE2op;PbbA5Ot?8uKMG>y!{!QYMdttotf?kbSJc6; z@LW9=Q1#9rT(KmeX+5`xABe`Gk(*35EZW1B=SB;q?u|X470_s%nw~+V?87a<3RVo% zI2W|%znG4-C{TOOrFNoQ*wZ4)%=O$32XsiOaultQFCdA9Tk^F06X$y5{$Y- z27;TMToMiyB{o-hL-1f*YoqkRNN?7}(xrjdc;5-`#20Y9Aq>AF?nqw^@MH22&PI)a z^7Dcg0NzL|0LQXo!5#Dx5%&)nrFRUbp$8+D^|vIoMeo>{J9j!D?6a4SaHcAfI8IB^ zhr^9KiF#INm|$eS)_riq@nTmWHY1_o*D(Y>mlkQOYe*u=YjF9Z$0XIFux|t29F6|~ zMash`I=`^vfO-I0kO|3HVrY@B{08fXj3gg{H31cx-VJFYILZ;!9x?AJ#v_~?iq$#4 z5!SJKh4c%CI9on47ZMNf!|u#oGVS(&CI>)lxj-QOly!|92gaV5aEdnpkphOULWy{C zVMuHqLCVl};u6yYGQ3cx=q<%r?9z32;LUq!{1wWHCjBMYHiJ^@V?4jDH? z->m0^;IBZ~a>GhQX{YEIW+DZ0W!e&KH3c4CwttvdVlj0;xSEuhHb$y49rvty8Eq0=ki zVe%BW2pJzl1LVtKBhw-iS^$QAg=hTWjRzqkmEIHJz*}dCtql7Juh_w^$q2`j+ZdSw z4Mf~opeh#>dx5PK5jgls0!MEtJa|j+M-OxE-va4GRVcu#6}(`x{#5|}tgQ=eFWoX& z3DqB=$_lkTf(JUwMI!fA-oE)mVtS9~6og<9roi;?(<)YVl7ROVzCR!)DP)PhMZGxB zBj;4Rj--V(MvshuCf^gJt$Rl+9E1iPi%?gahMd<-Y(}Zbi1uNMAWDxHze9-Ii)nb1 z$*C{^l_4b86TUR%_TYs46fxGdgt#rDsvrz>Ty`%g!H9-1U2+)gH|OM1L#<+TKAL|< zp1k11z@SpMpRTY8-~sg4!8q`wQ-vtLG0!?Rk0=el6Oi~&m!b%rB@d&5mfOF;wOCTV zxO~tfpR?ll17Dqi!uZSO1IvB)j)Q8+5!~<2Ae?^N5}MbzzkC7u)BM~$`zHRR$Kruh z5MA?d&O?In{Tc9Hv-+Lq;F>|$y)00eW_BBHL?-EZFylDS{4U}79k1Je6$5f9gq~b}30OiP2LFc=Q-=H7$ zj{PB@?;9_*At%3_{=?oF+=Ja8xIP>XM0;?D(*6{z;812mP6-Fk#-+*>e2ibai;Lbr zux5h$Xs+Nkz__B4ngmxA4MUx^?+5^!2DAzJ3NQRIM>`}~ zrikwylr5nVaw~p2VW7*$SAr#=FHbe7zzquF#Hdl2OY$Dd;}hbTlFNm7g2T3IDF0` z2~q=!t6{)$^nNHxbxc7+K9A=NimE^fN`G2!)iY0Hg`eu- z)TDyW;1z<`;l5fw4rZ|AJY(ifsCs)eZ?D1pS>y`V^h`VfT8L2-kud`~q;rG2 z)m+tBbRWJCT?UFi!H58hCn5G1Inq7CuK@>#ArrbyNB}Axm;+wOv0-Wwo8N@%oG$up z5hbLcI=2t~fsQIySOG`~rloMCWmN4s2_eknFfiy|&)g)1@|e>4ykHweVEMzmC97FQ zJ0jc0u(ypVyhRA2v@QZ{Ck1O334Ba+N4OkRX%mMTp{RaCVl<(3Ob!UiitKO{IdNDt zS_a|jN=;^-iQK58s5#>UP8(u0PARj= zgI!ot@4a2_EKyQLhXanK2!3nF6y;y8c$tddqrQ3EdR%R1hM`EfX={hd<&OwTYPNUI z8q_3L2U$-doEcsrW@1r7lIfw<%9;&fH=+eKhH%x#hhF$d+Nc^MiQVyu7a9RGs4j-g zTVm;^MU|eo+h4$-5u|VzR1vbpEQccNIRh{4&I*Bhg8V&r#)v1ZdB;<9f(96)VC^@Y z3>-fElx>;r#nk|DcJK@31C*ZOir=B`F^~3 zhbrFHG-KPC3LHXh=MZ}vxXGv~78S?vRl0x@g`uFFS7xP^nia2rHH4Rj4qfQ=j{{GhBm^TQ!9vIEqkpat1FF$1F2KM+1&5chWHe z;Iun(NU#fbI$Su})WL;f!{_ozH2xzQ&Ng*3FT8e1R}YoxMVC)TG=qY7>xsn;1A{hW z3Z6huQyG}*2!cQ^^mB*G@sGfQ3lnwpz}{wEcDW-E>lSrcY(n;3KDelZ7pO$ry)Rgu zoFoGy>Rp&h5~P}-cP*K&)@wAW6n)Hnk|I>8dce&EvATH3;gfX`h`!5RX4R_t;o-{bIA~InE(9eBz)Cvhi@J=Y33<}s0$=B6nJ;ZnqAhi7^MQC_ zNZ^eT(&^p>cAZKox{Q=zRc?r_I_qv69^d%oM5#jn#VOazK@SRD`eE>fKQLedkT*8G z84N?l0cfChN?4v8HSmlfQ5=>s;uCTi2Df^D-fl#bP6{rQ&Iq%UpG=30hF=duBx4iX zA>#nZVgaFWQvJSH7>>K}00=y|@W=lE@d*>8bk1@UR}R>gZx5B@4bqhLjif%XN9mn1 zwOhp<-e;U~1k@-P`v%b4JmHR-@r38);hV&vwY%>C<3WVv(wPD7V0MGF`5b8IN|Cy4 zAwdAAIYl&F!2~YAN0S?aK-SYl{&5|+PzQt0*CI5(Oid9u{mhhVP>V-roMks)d^fxS zC<9kRQ%`s+x4F0e_HcWDyMOZ9~D0W{-j_^0osU*Qf(~JVg zaOY4e(efvpFd&*`^(cb!NOg~hi4HKKX?6gc!dl-9jBK_}=3@H@+D%cxg8&*i;j>vo z!f0ap3;_9)=nV74OU@i0BZ(JSCY%^x3o}e*)Yur^k3Y|nfCtxxq~bp+pJm{hzZ(& zO>>CCT7#bBcJTa)oFUvrUf2&VBbAK(FnqdvWu>J~f9opXd;b6lov-xp81GAujsc1A z17L03!=z3SR3z|RX;Aujeb|zmkGnI2+y4L_hKaB?S-N%Bc94bwF?tQ$*Phg*xK7YC zWWA3$1mCGIHxPlUMZ6X(DBa#T;z0>XXch(+H|L@?PAnmYaPBU`vhQSPpuxXp(+QeW%t%Mh5=Qy0J+ZmF#v`hju zo2iC3FbI zn#XpAAwU%h943Pgk;icnN5&hBt2oNZ6N(TT^bj6~bNo3r(dqqTa;CUQvB&r}B%J1oeQ>Z27XYZSB zs8%2;V5cZqk2MSmfM`n42Mz-xG7|(nnEsz6R-a5$e<{pDZyx(n1%F~i7^{E+rlSBl zDFr52K@e7c_o3Utg3=47UtZQwdCNKhlmHX~#<8LTp}k6T>z>aAHt=)2 zcH<80fh~nFFf@K-i^y>p1yqiQRW9xq>>KMEAd#~-|{A<0Bx&n|GmbQ(qURs*bhZ1*x-)LgSz!qGoBkycC2u76k$w#W0qX0TD;d zYV(99Cm_Y!q;4U@GP6jV1LV$GW4?}HHVw=hRtn(_UjyS0n!`X+qsfhJT51eKd3`)i z1^bMuQS`&`(y$4JwJwFUHA{wN;R++jk0v-NBG^I1QUZeofH?RIh2%XUn&`-%uk^`# zAJ;bd$G)HS!;i}7Q27Rl5s86pG6ABSJFo({niV$)$_Y*$a{I%woz^{qYK+D+Hh_#E zfM=5Pi^l>O=n}{v9`Y`TX1sz36sw0Q-!pIzR8s`{k4GviqYGDs3_l4Y#Q+Mb@EBUICTz{p55r+zC-EQ(6w+Lvi~-g9)k1ghA<`KpiLc#< zP}$D5V`StI9*pM>KPwe#{YC(_L^A168(?iEDV2BuhrgKUZ8|lyc`~32mIYLAfh6_C z7a}81Ele&hH2R4J1&!x_sB&T&RtmFXN-bYUW)g<&X;enfC#=My*#JcfXh(wK=cvCV zk(x{uN2%gZMpCMlHnyB$!Hy(igjBR43I~i_muv(%5T50k6$0_ibX{fwsp6`pY$)^Gm+j(<`9Fx=Id2O^wYJ|tVi0DnAUtKmKhNC9Au5e|B< z@y2ZsX_i%h<-j3;X>z@YAWkth+5}z@vhj0@iQw#Y)vV|zu)kHqs3CB0rm3Ykb3jqD zf!!*Xzkp{a^hti0>FL2rMTW+l3_3KsF-B(os0D8ck|f}jZQWH*m-5Gq`o8&Ixu=)v zNGLTLPt(Yk-!hL{n+4!{{UhA@LdnuzjFqlJ0=mD_1+cDxLqchHw1D}EUW%()azl7w2K$v(jUQz`vB;gHb zI>p%05@&#CxroednnVqqZo1YVFWdgnn+vw7H{Oq&Z*F2h*s>h5fE(ywFCH*Oy?>?! z0%(*j;8!{-w-D+NqCYHWnUkoqqMef{)Wgxp7>92ew19wDK&p*{b9`a%qQ_3a9-gt} z3k8lsq!Gr2`2_;XJm6=Ot_rmcj=RBu3WIb={3N8ENdu84Cl6-X0`b95nEiQ6Xb*WX7c$_YFG>TaS>om) zuHQRr64Z?V^u&JkEQk*qBiVx=d<;ji_c%I$JHtgpk_y|I4lpKwvh;nv2QOxJLI*Gb zc#q|-5Jf_)6<}|*;LFw1q#}rnnjF>1HHMj?@iLxqlr<$?NySeq##^%4%x4WWqk!b{ zh`p{1)65zuobT>(){S1OXXyht0u0*0Jwf)Eg&0a$pr1NDvKwUG=N%)$G1Q65!qOwe z?01OYD*Kll~fA8H5>uu=gxB`Yg|_@)6C!7 z8Lpg!e@q;|BYH+#W`Xs>bAlY$I0MO;>3)L#F)BnAVbcM*%)<-XCQwQm3sRtB!spdx zH@pn}QwE|OX#R3417JvWg*e2jf_Sy}p9hEA0Q`jReq6}Pin7_p$QbOy;LA#R2ELDc zpYWbVu;|!zf~NS@8r(M#18cm(L)DHVs&7FQ$tlLnox%{fJqKP=;hE?yKuIVIyeW}z z0yzYrPfL!1uS7&b(ay1bZ`1l_miqC6M-Yt$hK4{YFR_jW5F1q3r4Ga&Y!!;PPrpOh zy>JGg21l`uLL&*5%0-#xX3|@4Ys?59hE&aKrU@`mqbYVUn0!eQ&LHI3WEfF58eL2# zfB{qP-f~<~V@Nd$#l>YDL;%K`>lxCLe{9ba}07y0C2x(F7+3>tR z*a^nE=T5iRU!ORp1GU+f^br@x!VOTHi!*Aly%bRO&h9MmiB6>A&HTn$WG}Nvy%Y=p;9`iJ^3(2b{d2MyUB>P*?*ytAV)5JR^qgf(+GP;TilnR3tna+ z7Nz@q2=M!0RSWh){-2hvH{NAhU1fqh&rsGO%3^_5Vh&tB1~I)W>$J4*7?&5}o$&b` zn1HJ>1gX5zX)zok1>ixo0}GnQ&_JkQ10u`3qWTB{)8&P05ozbF#$nD8YV(>O}Yy9#69blcL#f3DLX-UVyn(8kRcPLG>sxt zW)>=a;4`#A4UnOSt|{Eh2=gIM+sGMO_f%!0OXxVQU}h9Tzz8d8h9BXeoE>oq39~3j z0+&EVMH7(v7Y1Pp14L1y+GhjgajM$|jz+#cGB_boo6a!>i)oLtDUkCgwL!49y7t56 z^rk2!AEp2zzyd&f3Y~bx3H@FE=5w^b2wn%*E5ZbjxY$8BQumGR{0bi7XV)E2o_?qT zlj($CU3cvE`x#=vtN3teK8AMr2RdJ2SOriH+$DYX7a*9v3~XdSs5Mg#w=jkGFy_~d z;;1;@7r20epjLyy%NJh<8(0-i1##H=d5>uT-*Q7o?obA@~W^j*6sZeT=UUw|fWCdXUCYq2AFr0djN z?2!wlD#EpBF7fyv2(%mP?K4>z>jUDt$u|IqhE9v-Wrx+Iw?89Dbhcp5qCHTxZ~$dy zR6vQOo14Rwdb=z5(uyq~OgKUyD&qi1y z0MmWqi~)%T=I*jg07Y=+kXI5*;|kFTLLv}0VL(VJ!zQ~Dm<(A6vSY9T*p$Sr4nP6Z z6LB{c0r?y@0eO;0$;>#$5JWc?s1;RTRhg|um67U!^Ei7c<97s_tlGM8`DN@qm~7s7 zPb{Zbd_=n|xr#8o08DTXD@Fh?Uf6v8?BWWPQ3B1|TyFxZlT^82r1cBu5|}D^K&lG5 z+Tr4ot3V!+##u!B0Wcy#P8j*~4K5G`)`iNT;q?mXq&DTD2$b9+bZD5Boiw3GUYPbF zV_EDDvEZ;qhWxx3R{;gFKO-B08Fe7-{IyM)2cG0%H41b$V+>!qi8xSAVG{|jEex~T z5|%K)$Z4V@nPFA5v6)h)e(a&kLuI#k4X-i>cRW`?#uE3n5JU(|1oX|Y8%+VpR1mvI zH`s{^=F}-|1y?LB%1SrWaZoReDT!Ngb}ArKKwLLUcFe^l9RO(F6hmEZ;urx`aje-= zqv!_Q+pC1dT;B-RU||8bZF6vVoC8WsAv&!vp~)EVl(hvNI1}V^a>U1zD@KBo`+fvS zRr~Vz7#@Z%bkMK`(p_`TA1~V#aBkkGIH6O0Qiiao@MLA4=>BojPra8Pd>-G_ZfI9T z30qBOihx_I!YG_U?THrf!It%UyT`2_$e!(M(;++_%BN+{JU-awfwa9&c!Q?tu-K3b z8yd}p!&EK;Bakka5@Jya*`G`$&_G=Pe#QYn3TQT|zuAvN>?B@LcK3ii1>1)EU;RaN z8lWy5sg(0{tH{@vK}9;9f;4 zdtz-A2~g69GuIqUsVnC!EhUFIKO=}M4dA9t#wSJnvcN=35;)OOKAx%DJm&)R(4?G= zZ(g{3phx>wG4`?$)K#V(6~Y25$;Ym;nqcAEI8Eli#-^J5qVNRDr(ADm?Uox$)SjV! z6c0`fv<)k+s4t(t3-PE-FJQOD$A{YzjMZkd5NOJ9pOnSPC^{jbRU^5Bh?uv*5ho{B^F$M7=fiA4Gh+R$%}Oa2M0wMlzmv-3L#(>(1SNdYjvv1I#B~y z8+=2}Ii)Kefr7-*Lm(g~8raK-8#qvT-h!^)aGzCjU^bfq_lG1G0<#fc={F@epxnaH zEdmOd1T%8IgI7sLl;MaIq2wBf$_QzZEE{S|p70RIY*D(mP3(ljL73;1hVyj!LB9zLXBc1j8nPi;NwBs7Gt7j9`5!G=A zA4{9dfya2@UDoRlmy7*tABj?^v35>zptA_{dAOL{4GkaeM~xykK?gMuK{)QUQH&TctfWc1q+cV+sSG?!+8 zO$Pc8e1^S?cl`d$I_aI#s*00^t4oG~m_f-^VA=)NaC?90-{5cXCQO*0B+cacpNw(h zDnU(>c7UFyG8oZW1b|i1-_0G%w-rMAZz3tEAbHu$7qKzVusRVq<)+*%h=Wj%J+H1O zAT{g-i1j+bduO?)N@03X^}uOUf!7OsRbCC?cuCz#U9jY@e*~gq4nsC(P=!|`16Ytv zxY!L%C=`w=0p34l#nfW3(r(gwE)lA*m6l-ZZXUQi!e3oDxP#Ijw>SX+Gy^~f0gorSTaQT>!YgGYF@ZpQ= ziGjKR01U*X{{Rfunm7P$2& zh+X;z5Eza{ZejzrtD2ObAj;m>-%Wma{4b*xLh<~%N405vb7>%}j!FhIj6d*Cg#7iy zpd4L4wTl@Re{a_j8ZNH0VZmh&LIcpo>3X*zwg#GcFys6^#h(+b+W~6PdV~yX>oZU) z*mSGVZ&P@Ghq$FIGd(O4^e~LS_YkZMj~T3%j*h2fzA%U=8p22iK5+j44{_qiXH6`gL{db+dYP`<;Yg77vb0(Q7;FCk2h|cf@cM5g zQo(obU>>09vA=ekt&*ir+T)A@mE?mDeh5;54&x;9e zpsC{s0lcX$XRv0~`U6L%1WfL-9ft|0561#RDwYvn(>RLSeuD`=+j!)_Nb~P=b)J9+ z==`t=SQ}RmO87)A8Y59@5x5X!RQ7PLi-hQwlX0SAau}#LFEh*`BbBR&Q&h{yv!--b^ip9{~`)0vK7}BZlqxZtDu5+n+#&BAa(JYNiGa&oR8^a(OH~qIL1O zBk)MVBb4#lz?t+|YfdTqpa8zcAkg))l@@bJhvWLK`;G(iL_TPLOaT}F0Ja@g(tQkP z`48BimAFfV!K74;T^)@Xm9;zd1)(4Z7$07HC61Fx;Bcirc~Yp>>fye06qF0V!tEVb z0xV)p%+j3zUk(zV1k-zapsrkpOa_U)_5xtmFCkSSUnl_aiAk*+9*+z?&LNSzf|X+D z8S$7lFwjxMkAceA$3Zy>Q10&yDvxKkTfl?U2n&iuo)R(YgO$zFF7kW>g=xPSU{MW* zZ~3Dja0Q^^x&Du?2@mM{;dRKU1>4VGjWVIy`?zbLH^1E>QR${rHAaKpCHJNYhoLV4 zLpT5d?0#7d4n8e{$Yq0K;mX^f-&DwBad-&@Vx72fQqN&($UoPtGGoZilt(~oGkKz##dy)hs`fTF*Pjexb=AXdjCDv{Po$rWG4L|}lf0c@7XM@qq!U|j zLvFChNP(0G!F1~xU7TwK+vm^aZd`B?IRsNL!D4s|r;?3elo2SK6E0l1uNka+;$@p# z>4(bauZVdt3U-<+f1I2x&6S8bRprD;$Qv-Ubi)t9On8Q*+6Qax^Grf8BVah)4#gm(WjCIQTWrPLaa@y44 zP2l{_j5Zv+>)Wi@bQm>OSgHXzO-w-YkUy&&wIgHYW!+Z1=+<^z0@?dyOWyBAt#@tys0P7W$BHKkFH!D zL9iDkk-+Gh$0wb{=M;%k+DC;QzZ$Um|FZA@;)Y`#Q4G*~iaDABQC*-dfQ?SWg zaYb4>)^6ikKmv)_NH96VQm3F;Q_8i<;5ICmNev?X^NKS}taD`}g`-%B?e;w0$(Q{O zro(-OImE9C4W9>?;3*dd#Zl-F-!1`mWy-r-A6z(i27o}Flrvlr7)4O*xw609_!t$c z-Sbn98G5q!G6>!9b2zd0}K^mPoR43d0_)RM~ zP5tmnC;dCYynHIC_0byrvBs#8k3k=?@aBZb0exJrNBZ}dH81Plb9B7-2RyQ3(sxo= zzJ*kQg7f+6fEo`W&R3=VJH^dU`gevQgIyhPFXVIpz^L-Jj^n&vLv61J!^ymu^}T$~ z0i)@>=adYcPDS;=ZwIF|9E9Yt$fUr{$%;krYZBY;#8ww$qH6`>o9ZRDGCX177b+H| zOT1S90LbO^2{O*z;u}&Rc<&7a01so~3~6Z2C?-pk-IV$R98MtPz|toN!O#>RTvG>% z;Uprr^us5}9~7t`E~vwu9WDpcsy+zT?OgK?GuFr#S*G7mo{SJKy^evOol4B>I+Ee^96&6 zH0441=Q)4i!_52P@*2mb8+=`k&v z@AyUQU;4dstke5xe*XXtF_^8n{qxrS^JAdsQLPicoJlbVQK8$B(CakV9H~diU3y{a zd?XL0GGancXVF!c~LB# z5EiS^J=hx_wbGEBzUW67;^z+1nDwuL^2PPIwbg~?>n;J#mdNqZ3u;iy@;LqoqPcsR z{Ua2bP6qtJIW~b8Z_a_xVDwA70o>v?J(z#i{{Wf)0N?)rn19j#0GNN<{{Waj`~Lvu z4gS~tV6abuhrX}~9Wn2Pbr!+gejet3xBGLfBYmmu{Lh778Z{UWLm&QNe;AKn z+uI)>_V&+9`g>vj0Av1Vq5ZwE^q)ui!CXZ^avNSiykN9}D&!I($x{A7whtgeA!OKr zX3leH7ZW0C2t*R0o04r6tpn)@Drm^ZnQ;Ur#_c1x&i4PIuPe2#5!VA}Hd#=OYenCb&*4H>*q-y@Z8IGx>= zj4fUmeAI!EtYc-erjgY$X;oP1)mxy@X!#$T5>{nT`MjUNNk zB3JafdTBS`3=c;xjlY+`p8-ahC6XZm_Ot`0fr?Bh#5MKpM0tv&zi;f^@fuk4k1UtE=K_}>dF3xcv2$4LQG-Uv9 z0RS>pVzv*UzXEP%r@`@15phU2M$6B~QvonnL#=~PmBwZwXGbl>@EP8#Pj?U{$&#ry zw3^?4F#ZB!nun7dlzRS*Jm0<@KXJhW*sxQ>#lhKWpzgT7r+DtDhL&%fKkYNsncEeT zuJy0NzM2{J!g$C2Ghgj|9tAu&zx3Sy0PDHB=y?LGbmnQtM_JOSHC`(ZQ7&Uw>}U14 zAN^uXqd>~U^g%swH77~L9RC2=6$XBBKm-ZUoUr5ZId`V8q8gbp^MVP{13*T`{bGZuYZQd zZZoCH3nq{@_BV*XTS42MsJ0x(;iFd1NAFyC%V$D*ne|uTetRZwfuS|o6pC5%_6&0u z;qAiwDx>!TtPTXZDDxd4^5DUrD%}{9$3vli_86=K2}QwLE-{Zl^ASZ<3iS7#4{RcC zClF~hg69`f1_vN01_~Hr!{h^ZQG^dLDMA4f7KkQ!i|}}Gj_5c>p3_l$I;V{0%fGG= z3IVWF8=&Z`lFda0t>)`1hG3VHAgByXD=apYM+!P-;jN-MEmN(!UU4PBS`Bp+0Q4{_ zz}~B>TjKgL93((PL5vD>U&sMTS1c|2ZyXgt6qhn1Q%mx{4k~h=cKju}zyO)hY<)~> zYi|gg8(XbSVe-~3fCUr^Dac1yMfsBIk_6CbXwIR3Um4Ip?c*sBGjxj=C|=n*1@z~1 z9oQ_(!$uW+ax9gw*TDir^n}i`-ox-B!;NTn?!A5lENxPi)qo|?w><6h82%A4-+xRm z%l`mR8Qfp%;|6VS_TvO^XMga+)?`5RwhEl#F>rl1)I2<*y#D~>pjprr920W&Fe$tM zQ)Pp9*Equa$zms4&7N@Y%I*Tam@cb&oB(&+UX&!@k62#32QjLJF4^ol9`6q+BpkZJTy4s+C7LOPYk^zHI;S$bMjxw~%o1s9h z5FFBF>B0!=1*Q>O5Y9(niSv=E2G<`YNi@iE95_&YL`^^tfmy6F>Jb!e3TZS%=QNAo zI!p$Yz^MZp(v;S(pozUnTv+%R3+t`Q(-V03@nM0nXsjAJVa(sSFap9Cc?w2;?p?Fw zTSz%Zs84f2fOb6Na7-IyebA^=MjqIbEVVd?5;Ue9e2yb?K_iN?Ts*NTh-kdb(TSUY zh-1Kq%cT9Ats5|0iji?C2V-$MvZ2zv!O zdN9snYs?gM0$t%60l@zN0na{G2>pgFs)MX;NbiGTdcs!C@H#%hi;6mk1cvo9v0nqg zsbc~@16A(}3hOlHIIBB!eM0!jH@-N2xMzM4e$rzg(Fx1}F7gkmkCj`!MB%}~dN0ru zi>JJrxB%fQkXH0zs!~TsSkDoHszmM}p17Yt=Mv}sF$yYZ?hpa0QxCK_PqY|dZ43oY z@pveR!4yR~1_IZ>Z#k&2)M^?7tX4tpiP*X{8Y^`a?RCXZ=w{3c!xmO@n1BQ@X!-JI-05BU4!VcUgy%_+U zl3+l5hnv7rO#!KjE=#o{DE2mqTN0d!x`?5gI;m3wUn7kaVoMUh@v(2fU6omV8CWOI zn0&TOuqMLxvf$H+iwl5=Be%zlka&Gt#ELy(h>;>$!iwk%f(I*rPH5?ot+jSdU}Z1q zht-Gy*u46=0GX%~vw&ep9wpfdu2!Wsl{|>2l_z*?EIbx1s(XOMI3lY_aKHc>4})BS za8VSYrP@aT5CL}ZK~S&+4JL7CG#nht9(RZaVkxTHIav=&!o4z)R%8Yx`Z(?r@PJ#} zQC@I*GM`aEc*OJ={R9k+Z5*^bXHY7=<%*evP0EI$&RmO321L?N4G;b~_%kQMA0+&D z7V)4>CMh;JRJMN@CrW5iX2g{tS1bTzX!1NZS)zakOqrLbh_C{-YEyRN}6~qEjiAmudCh`?obacT#74!X;*j% zGCP7XC~6Co=QNC$5j0p0+Eg9{=I8!fCw7U%L(h^8h@2WfUXG zY5xFyVygti!Fhb|An>t*<6_Njn|IzaZV(*}Ut5yl-swKBNv_Bdu&_BNRuRYcOdeL7 zNe%!23Gx;|6|6v_Disq$r!6g&W}UtpD;8G?(1{OEMcyXMtZ5uid|EF!3k;D+gd4Fs z^WG#J<#L~VXu-ofi^e3YU9{+7kO;O~GH`-=;cWvqsdMuuCbM9+V#fiZseE7q00lU6 z5^)6ILf`7`@WO%cj)Z-vP|4 zbdL}mq2 zTaG|fz&QtZ4F3R+H4frC9$fH3`02IEan`VJh(B!H)L%?vPzuyaO=A?m%v~lIyiD@3 z8{BBW0AHz#zJDOWa z@uv(>D&+n}FXo35YgLad$?JtgCtn^B+3AEQ29Dqd2jRMIupfA!hL2_<)s)(KQJfYd2z&C56sMPv0AFa$7P{{Ttq7|_=jC5(#4#uzs}U%`QIoOJRk z&wMq)UJ#@3UGs`unH8gMeJLdg^t0V_q-v0iRL z01gmBc+_cHtx{Vq zi#%k#*lv(T1{57!AI%da0NLJSz2cY+`Z~za0Tp~=+*dgPrUDt=YScG$`sVd17!wQ3 z9$aFt8^ko4u8c;TVwx@&vTL>)X4X7JG(&xJ>x&7v&ojc9o7oX%1gh=MlI)=x0bP*N z@8ID??2WGW$R=O=EGOw0s))nTE*MN-r7LFC_~c~A+nHCMvcsnY&kW2*X?i+fwhqhz z6HHeZN#P>JXk9tW>r4Yg1rE4OYn^+h+)^MM8pAR0golWD82JaNLL}I74)E-t&?BIl zo*egt$Z?@BXucjy27*imj@qThfDF>$b9!!R?>3EH*%2VWrm%i=haen191qQ7!1F#u zr1ims4xnMLMQ(}irW}47A*C@qQ55lTo0%ZfL8u=Jv;P3tKmWu4D-i(z0s;U90tN#C z0RaF2000315g{=UK~Z6GK!G4ok)g4{FwyYw;b8yT00;pB0RcY{`R-0nA^Ct&DK>no z>x{!>9v(T05?`0Y04`2hlYnA(5X!$!(I z47qq>BGJH&oSM45W{8}cC%Ap3y!i!szbG z!&VjtbUAl|xF}*L0MmXYt-o{nfK>;_1+{W5mkDzbeyCpICq!(8l=G^Gw3?2d@E~&7 z48CQMHsERP8nfCVG(|=SwtL*|LnEj)k7;1h0)mBZpaewHZazY7TUaZshx+HzACA** zPTXJC;Za(3&-$aem`8q{%(KW!6aGY0uyXUL12ugco2uB;s7#9Tt+*KdkQheDfCXMr zYC-Q2xNJVNXiaGCGGwQGaoO_xaNY48Pks*lIspr#5E`n>TZ38;`7-XQ+~SM?k&vCt343NIY1g-lswMeYjs^!HE( z9rCl8=gu^%XCm_jaTk@a*H}G^uSj$DK2nBhjFVudwVqMS3jC!k(;1%7a&+%GjJs8R zzEY;4jK*kAwc-S7lh4X+YbvwaZj{!GB;oxp=5d0lH3+ zjg1P|*qzPFAG}Kii8Mvln&l~Y5bvHQ_-OMT&XImI6l||hpCAJ0>NGYm^sx(Fle?!r zQ8Z6o1)wVW%@Alo6Lkh_lPUv{5;kiVYjN9ClN&*r%?D@}lm^$es>MdO+*XiNE!r$s zo~q{KE4oPQpf%!K$UEX}74yJp;D9e!x#I8BQw_CnVMm8P(zq+qV!AEXdP=!(NGTO< z+7(^}{fEJdFAuCkux`3{oW@#T!@@KA)B}bfw0iB z4|I00H4TSFnevKsVmOhj{Ub1&O1I552nEtjl69uJOaA~T>MUrUTj8_i_?Hs1YL{z# z$jXMJzfV$`OsAx$5~3#(0PK`pjcYujFADkNv*q~VyT|S+8sP8K-x$>KmfW>+ib-p@ zx5VI9vDBLGjn_`|n9H?S+lZz2I8_QuATCpP=~Xhyl+8eMgNaKh)KZA0n8aQt3^ZZs zDVSY;BUgbwQeYuN4@kpU*1Sb++We%pl?*@Jcn(e1PV<;Om0xd^pDKs9yx9*ec#c>T z&+sEH+9f`}HY`4~>5jc7+}-~Gfc@~j$9Y1T7h+MwqPOMFN0@(M)Q#aB>3 zri;@1&ZFf9cFT@YSsWHJT9lC(lnS)9zk{4CKCr5Vt-zT9Gnh0M-U%0`jMKsGb+PidL%kZ`LEm z4u%>Au>v)UGzwu(V8Du#guLi}_=Tc`GIgB!vr@Xgf^|>7#z9w7oe^64^&?DV{-@C$ ze^YL5{=Jr1Hm*dvmKP-AUqg#)qfihQI#V?o>n2t$AhmVlP*Mte8)E52!`cbryUYqv zw=QuilNmYx0PH%3oAD6X9vBM0fC$ROr-&;r&4WwyMp6V0>E;+R!(>=a%`sx^9HNYO zqc;VFUbhgIEk{d&jgeKgwpwTvp3`A`zY)t9#Nnequp#FzIhFf(@9i6#OY}zN_i8Qh zbAXp$X?DSgHgDP~is{7!O04$t5>c@HM6PY$jioMyd=kha+@21&@52{SDMw( z_&=O2lp#Nk{!4nxWwP0CS#Jw^%VoV~y=A>-c+^XwFR7RN zQ?%~?0K7#t7Z6okMz4T?d6((Jw-h+_bOoq#=Ncv6AJioqI)C4kjEhMIK{Lp?lO;Qq z@{u9s{;ARo^P6mZe5CBG7&9p)eJuzg`#e&-BL_lkd6}ko! zy~-z35DLPETc|vgJv0o&Jhv(;06-?htk~kA+_Iv$ql^K&h_?-htUC=y_INq-mesXp z9}byO(W4JZZG_Jv;I>M4EBH2iaQq&a4M0V;S<+IfZ3^b@=jCUN%i9G(# z>Lo6*(68V!R%XYKObXFI7=;BL8I^L_Hlb766v~`H=L$ee@u|$=9w-<^Rwg?oZKQe;=BhC^~k^Y=8cg4PSs9Wxa zIzDB#6FiHb;(u^sW%5_TnP{GURXhP)9C<`|yfb0-jlo8F*X~~PUf&IRx?ZJqQ)%PQ zHYUSbV{-H`f5Bu>U{Ww;$Dg;8k5a*W$4kpAZa^h>LsqJ?$n5Ql% zR1nG6#J<88$iM1j!l!b+8kyiXXHfePt1I4CW2gCmuW3$gL{;3bsY|Pf>jBo{9c5c^ z54_SQuKDV6cZpn7t!T;5+Fu24oj~4e+u_qW2fH25z5NrJ<^gh#uB1~Ly`S6$L@$&z zv$6OFFA;+uUc^AG_M0SUktujryYi6|Rb}bsCk1bve&w$jl z@YCxo_!U8}rZE_$<;pd+yT5|vj-QGl z*n~rM^}mnu%F;XZ$XZ9KiG%_x!j0YS&sd>#a3@Ltx6BL-5etypVDvFAyal5Nez(r% zMRYo6VcXgn!~mlfx6DyPXrz3RqrTL>@Hj?}vbc+%5v#zTz>60wu3uRCWT(~7mC@Uj z!f2k+jw~8uHxS}2>~wQv(CS9N_~)GatDIASv;a= zl%V1k&p2nenB%`kPeuvlDU|e-{0CUUh1q>0!Y^Y{ZGk+u$97pL>nx8Pc9urE!lIP= zB}Lnfw=FGIQrB=&^_aYCbyEkV0-JZA)Jtc{pWhvx7uoo2xL$P)O&{kPWsnCcWGGYs ziOH5qQHgnCD@TdR3K)OBu&sQ}(fNfO*SG$0-e-;Lj*0I*=3{jK02p&HilpQ`K)zX6 zO6s`PeJ0t0R;5wr(pA2)tY$Te;#|lv(eoBDa?@YjR%nNI`0mREk2;A1n#*Iagxz0y zj0ZF(E#uYZ!VX$|#^K)e{YLHN&+m^s#C2b&+`Nb9gRg|{_C@qRnfiLSwy@>SRfu72 z&~a5P1ET%vI!BT+$!8I%NRN16Daje7da%k7@BaYJEZbBl*LMU3baYR|AOuE{OdnLx zGBgYY>VKQOvYhgYtumQCXMv7hB`}R%zq!k%zvQKZ1vLjYQ?^|8?FKWIE9vUq3s{t% z5-dzgMyK!b3Tdf=t@Zx^=>Gu!!~iQ10RaF40RjXD0s{d7000000TBQpF+oufVR3;V zKv0pPu`uw#(eYs6|Jncu0RsU6KM?xsWYD-CiGl7oc7C-+#7>_|Z-`ZDt5x;KfTkm~ zSXt|=zin&_^aDPV{cn6T*|CYyA<2u!W*(31`cL+~@aAH0yPbpWni5wN@49^e-u4TV zByTID$avp8UEni+AsW%m*zK3Yxj7@qzc`GE631vd$xKLE1K9&O6y6g3)hQZFys%V` ziluz8Q3Jit$X>o!f1}qEKi3*{TZ3<6$hYr-UZnyy?cfJ>tew<6218mN#meQ%e8Fr; z9miNvB`ECouzO9yH_)z+OrIT+l<+4E^TCF7PS@XFQ;hTRqp^A4zFvq_cM$Zz5d?W0 z5C9wj3_VZ!=Pt?Dkm&w0ic0?gUZLZ|`gfKnId717;q<};5ESKjnyuS|GUYJi<Y_8&IQ-%^-}7+nEFEyP-(lj6ONZK zL7h!(#r14)I|ozNxPPVR3(#;y9<7YdujyI#$ON`_AFZAgFDk9<_wZXXjPFtYa%6Hn zuzp@aTzt90=cfeNVWsJc-yi8cagN6GtRU>IbN>KW(qBXVxafL(4uGR0sa!MDXXzjZ^|;3^5rA?D zR}$oRW?rx9`bY)+E^f~i*LC^NU1uZ4o$>tWEh|>u0#Z7htQx`$6*@L$0LDe06 zsH$|y>i(<*i#jzpv*1l(a7P-$W$N?t<*cMog$*8t8bNXNRR<%!2@WT*I7w~kFytKp zmc$HRxjFBEC<+DT!z~o*f{27H)y>2r8L$bHs;3_U;TrvzCXSVg>vEpD$W2wrU+VmL z!o1ItrSNl$e@x03E88!YA1xOyHBC4$aRVXbl$<@@a^@z5ZkfJY&s^5DNJ@xZ1>E9c z;rW5Z5>_+Yrdr4aDg%@#>z(CrtYrdQL{;IdlJTyK*Manvb^)i~J8maw>q^gDQQ6z({jB;*Ap`p{ zmyODl=}ZZlUR2LT{sPR8plpIZ#_}3R<`%*B$bl99{nLNI^M-IfRMpH_yO*Wynn@1h zZmbx3-~s@HM0%KU*aRp%gS_(2!i_IshWg+~0*&YwoUAmg5(7f<>)YVy$n5RBcRh-N z@g|0C1~$D2ihlqN(?ZTMu93jY9p>GR?how+(-S>N%CtKqPFO1muE zgeyIQX(wVed%2^b&i%xRnr~Q|TvAd9(iR|h?T07?PXcR(yyU{0FP$~rY_q0Unm`Ft zNpSRphJuY*Ec&URj_w3T+YyhBhljy-a;{wFQnEpR{2g)^D&jn z3sIHnaPYbUi1bGUkw5?*L7T|BJokZgz=}?kOgy)J2v2+PM_b2}H;#$0cKVLK*p<0x za-Hk;Ja}fjC!fhYX7DF(z9W*b8N5g*z88MJB9Pr4d+C$29EV)npN!?+a6bE|ieUPK zwt=qx03*Rp*Nkb`4xb1r2P=(Qxul~XhYWDyOLz@`JH}VGY|+;gbi~6efBA$s+{&3) zYYXBrZP0h$Om`uPMQ~_gngeCNnhkn*`T@Tu{9i?n$y|v>U=N6U|=J3PK&mk zJ+nf}h2H2ouYRA#gC8T2W=8z7F!E&JM+1nD?wDIJ-5zoY3dPIrC!;yMNi9Y){{8n+LtU$f~gYr7pC_04Wrc~I2* zW{PBW4%&@>0_!*56F2hJ881tNL)7UUZ^-*(7T_31tr~a1f+@A8x}v_AB-H?`a1n$} z+-s?WjA*XaIAr@C%!+7Ua3*qBp0Q!GnC$gAF-D7E>%48gfuYcA%Zuk?9X9@-;Ngck z)$+v^2*z0V!GdhP#UZtI(=Fl5MQ;Z#B1A%flJs7<96xk8_>iD-bG|T%WKlwzDO^J4Oh_OpPh2w_BnMSwEY-D1FZue7eiFK`zzC&KoO^fOae269hH@ zOk+TPv5rl|2vYJ}4=+q#Al_HlZ+j1%!FyWJkt2x%I^Z;6Tihq53@B;KCj*mOarnwb zOVQX+O-f;!&!v%~a>ZF!S`l-f)-S0(iiRQeK<<;#de+od#sI zu3_oZuZ3W_JEO&3^4~?^1IG6?+`;nj3w}szCM0hpV{tpWWUhQ0)(5YM$fG9lzPQHg zSb#YM#iG``vhQEf`~ccI4lL1^%O)L?=g&A8bNtHReDX&Hc*@~N7%tgeuv?Xwt?&xT zmz+y)h(lzaobKWgvd=y0bDp@Jflo8}Pls`w;znwofToW77l4Ywo3Q52;AZL1&lD2a zaPO~dM@?)2=oe;DzgixIABDdXQsPjRTCD24?p)n(o`6hOc?EVC9N4Lwk zUC2&1lZ;X)88?vc={w`)!OKPo23tcV66Q%zY^6G$PBTzs=JAQOboRI?^z%@PEdu%8 zb6B4ulf?kXqlMTNRsrXS6)2QXB*SQ4tFx%M?3?-q#LinnXxwj1 z3N3iiKK_h))*OLr@PsAh%ic&TKn#RWJg*8-U2UOjgSJ-tw-BSUw+ktk8@zNV5Cv;j zE!vdQln%_uK(Z8bPOJ?ltX(ndn~#$zJ!o0$tb;0>?RqW(Y)h=2sh$fw72q4<_=m}Z zl<$Z#nM|j^nnjRx4_sL|6sS%hhahSB0(v`r{uS`$;_>ht{EOf;E4j{300Lyd@u7i{ z!ym>6CqrKAaQk56*uXvZP5f?NFCG)X=lRm*VmjVO8gG^nr{R=P}E82^zDv8 z>Rt1pOx&7p>{2u1a`AZh4u6ew8F9Pdy`Br%h0i87EPIwF$n^EVBgG9) zksFgYPQ*PQ+wc`TM)Zvg6K;~`3eP-H%nm$UhG@fHRv`ZXI1(a#l}cH-YY`FI`M1nD zBYSl9!wJnT?zbOo-cX$e`|LOHIKAvluDIzj zY>F;&I(fAc06+61Ym*E3HsGjfUZwlM1Q95mPlRHL2vWKLS0gC)3DH6x@6h61^!qTR zy54SX#c7~sSd~<8iNbGA@m2>!={pkTHF{v&5(h{TdJ#77>zl{47gv)?&RkT*+ozue z3aA9-UNdrI=uix3h|QgFCkY6Q2$iBCZ)_tF+GMi;Z?DfQisL~ialPpdxjT&u3=O*7 zq&K{~!YV-05y6d}ai2KLREVJ!t4u1`;WWess65*Fv}R63ql$* process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/uploadToPinata.js b/scripts/uploadToPinata.js new file mode 100644 index 0000000..6e9a27f --- /dev/null +++ b/scripts/uploadToPinata.js @@ -0,0 +1,38 @@ +const pinataSDK = require("@pinata/sdk"); +const fs = require("fs"); +const path = require("path"); +require("dotenv").config; + +const pinataApiKey = process.env.PINATA_API_KEY; +const pinataApiSecret = process.env.PINATA_API_SECRET; +const pinata = pinataSDK(pinataApiKey, pinataApiSecret); + +async function storeImages(imagesFilePath) { + const fullImagesPath = path.resolve(imagesFilePath); + const files = fs.readdirSync(fullImagesPath); + let responses = []; + console.log("Uploding to Pinata!..."); + for (fileindex in files) { + const readableStreamForFile = fs.createReadStream( + `${fullImagesPath}/${files[fileindex]}` + ); + try { + const response = await pinata.pinFileToIPFS(readableStreamForFile); + responses.push(response); + } catch (error) { + console.log(error); + } + } + return { responses, files }; +} + +async function storeProjectData(metadata) { + try { + const response = await pinata.pinJSONToIPFS(metadata); + return response; + } catch (error) { + console.log(error); + } + return null; +} +module.exports = { storeImages, storeProjectData }; diff --git a/yarn.lock b/yarn.lock index 7594a29..e3610fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -749,6 +749,17 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== +"@pinata/sdk@^1.1.26": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@pinata/sdk/-/sdk-1.2.1.tgz#737be094479d639f6bad180951ef88e5c59a7f51" + integrity sha512-z728bnPa9lhkKeFnpXqE8j8BXeel6iE35o53pjYjmDEHh01ZE5c4L62Ks7zd2/MuDqNaUWUtGm0tNrEiSwFXoQ== + dependencies: + axios "^0.21.1" + base-path-converter "^1.0.2" + form-data "^2.3.3" + is-ipfs "^0.6.0" + recursive-fs "^1.1.2" + "@resolver-engine/core@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" @@ -2065,6 +2076,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-path-converter@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base-path-converter/-/base-path-converter-1.0.2.tgz#e80b4b4f31c7b1561e632158e00774b6f2f27978" + integrity sha512-51R8JiuXadknn6ouVUteOhDpmI3G5u5GqjruL7bPJpfxUHVgosaO5uPAvRP4FeR4VyyH4sSvsN78Ci6ouoRYqQ== + base-x@^3.0.2, base-x@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" @@ -2298,7 +2314,7 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -bs58@^4.0.0: +bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== @@ -2613,7 +2629,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cids@^0.7.1: +cids@^0.7.1, cids@~0.7.0: version "0.7.5" resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== @@ -2624,6 +2640,17 @@ cids@^0.7.1: multicodec "^1.0.0" multihashes "~0.4.15" +cids@~0.8.0: + version "0.8.3" + resolved "https://registry.yarnpkg.com/cids/-/cids-0.8.3.tgz#aaf48ac8ed857c3d37dad94d8db1d8c9407b92db" + integrity sha512-yoXTbV3llpm+EBGWKeL9xKtksPE/s6DPoDSY4fn8I8TEW1zehWXPSB0pwAXVDlLaOlrw+sNynj995uD9abmPhA== + dependencies: + buffer "^5.6.0" + class-is "^1.1.0" + multibase "^1.0.0" + multicodec "^1.0.1" + multihashes "^1.0.1" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -4395,7 +4422,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -form-data@^2.2.0: +form-data@^2.2.0, form-data@^2.3.3: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== @@ -5227,6 +5254,11 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -5284,6 +5316,11 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -5484,6 +5521,25 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-ipfs@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/is-ipfs/-/is-ipfs-0.6.3.tgz#82a5350e0a42d01441c40b369f8791e91404c497" + integrity sha512-HyRot1dvLcxImtDqPxAaY1miO6WsiP/z7Yxpg2qpaLWv5UdhAPtLvHJ4kMLM0w8GSl8AFsVF23PHe1LzuWrUlQ== + dependencies: + bs58 "^4.0.1" + cids "~0.7.0" + mafmt "^7.0.0" + multiaddr "^7.2.1" + multibase "~0.6.0" + multihashes "~0.4.13" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -6197,6 +6253,13 @@ ltgt@~2.1.1: resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" integrity sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw== +mafmt@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-7.1.0.tgz#4126f6d0eded070ace7dbbb6fb04977412d380b5" + integrity sha512-vpeo9S+hepT3k2h5iFxzEHvvR0GPBx9uKaErmnRzYNcaKb03DgOArjEMlgG4a9LcuZZ89a3I8xbeto487n26eA== + dependencies: + multiaddr "^7.3.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -6571,6 +6634,18 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multiaddr@^7.2.1, multiaddr@^7.3.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-7.5.0.tgz#976c88e256e512263445ab03b3b68c003d5f485e" + integrity sha512-GvhHsIGDULh06jyb6ev+VfREH9evJCFIRnh3jUt9iEZ6XDbyoisZRFEI9bMvK/AiR6y66y6P+eoBw9mBYMhMvw== + dependencies: + buffer "^5.5.0" + cids "~0.8.0" + class-is "^1.1.0" + is-ip "^3.1.0" + multibase "^0.7.0" + varint "^5.0.0" + multibase@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" @@ -6579,6 +6654,14 @@ multibase@^0.7.0: base-x "^3.0.8" buffer "^5.5.0" +multibase@^1.0.0, multibase@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-1.0.1.tgz#4adbe1de0be8a1ab0274328b653c3f1903476724" + integrity sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + multibase@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" @@ -6594,7 +6677,7 @@ multicodec@^0.5.5: dependencies: varint "^5.0.0" -multicodec@^1.0.0: +multicodec@^1.0.0, multicodec@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== @@ -6602,7 +6685,7 @@ multicodec@^1.0.0: buffer "^5.6.0" varint "^5.0.0" -multihashes@^0.4.15, multihashes@~0.4.15: +multihashes@^0.4.15, multihashes@~0.4.13, multihashes@~0.4.15: version "0.4.21" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== @@ -6611,6 +6694,15 @@ multihashes@^0.4.15, multihashes@~0.4.15: multibase "^0.7.0" varint "^5.0.0" +multihashes@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-1.0.1.tgz#a89415d68283cf6287c6e219e304e75ce7fb73fe" + integrity sha512-S27Tepg4i8atNiFaU5ZOm3+gl3KQlUanLs/jWcBxQHFttgq+5x1OgbQmf2d8axJ/48zYGBd/wT9d723USMFduw== + dependencies: + buffer "^5.6.0" + multibase "^1.0.1" + varint "^5.0.0" + murmur-128@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" @@ -7155,6 +7247,14 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path@^0.12.7: + version "0.12.7" + resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== + dependencies: + process "^0.11.1" + util "^0.10.3" + pathval@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" @@ -7260,7 +7360,7 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: +process@^0.11.1, process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== @@ -7537,6 +7637,11 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +recursive-fs@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/recursive-fs/-/recursive-fs-1.1.2.tgz#1d752e2f1a65d25fb6964109a9dbf83a335f90f0" + integrity sha512-QPFEt5EwzwlHoqYsZc+NkUSyDTQf1Hvq7c/kpQJHi77OSCAiDXI3wfB0J04ZG+ekGHmv37mdR8MDPEshD3/RlQ== + recursive-readdir@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -9090,6 +9195,13 @@ util.promisify@^1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.1" +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + util@^0.12.0: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" From 62202173cd9a3db4355d1ed36df29a8d61645c07 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 4 Nov 2022 17:31:07 +0300 Subject: [PATCH 08/28] Funding contract --- test/unit/fundProjectContract.test.js | 287 ++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 test/unit/fundProjectContract.test.js diff --git a/test/unit/fundProjectContract.test.js b/test/unit/fundProjectContract.test.js new file mode 100644 index 0000000..9c691e4 --- /dev/null +++ b/test/unit/fundProjectContract.test.js @@ -0,0 +1,287 @@ +const { ethers, deployments, getNamedAccounts, network } = require("hardhat"); +const { assert, expect } = require("chai"); + +const { + FUNC_FUND, + NEW_VALUE, + PROPOSAL_DESCRIPTION, + developmentChains, + VOTING_DELAY, + proposalsFile, + VOTING_PERIOD, + MIN_DELAY, + INITIAL_SUPPLY, +} = require("../../helper-config"); +const { moveBlocks } = require("../../utils/move-blocks"); +const { moveTime } = require("../../utils/move-time"); +const fs = require("fs"); + +!developmentChains.includes(network.name) + ? describe.skip + : describe("Unit tests of fundingContract", () => { + let gtToken, + account1, + account2, + account3, + governor, + timeLock, + fundProjectContract, + blockNumber; + + beforeEach(async function () { + account1 = (await ethers.getSigners())[1]; + account2 = (await ethers.getSigners())[2]; + account3 = (await ethers.getSigners())[3]; + deployer = (await getNamedAccounts()).deployer; + + await deployments.fixture("all"); + gtToken = await ethers.getContract("GovernanceToken"); + governor = await ethers.getContract("GovernerContract"); + timeLock = await ethers.getContract("TimeLock"); + fundProjectContract = await ethers.getContract("FundProject"); + + gtToken = await ethers.getContract("GovernanceToken", deployer); + }); + + it("was deployed", async () => { + assert(fundProjectContract.address); + }); + + describe("proposes after submit ", async () => { + it("Create a purposal make a vote", async () => { + let tx1 = await gtToken.transfer( + account1.address, + ethers.utils.parseEther("500000") + ); + tx1 = await gtToken.transfer( + account2.address, + ethers.utils.parseEther("300000") + ); + tx1 = await gtToken.transfer( + account3.address, + ethers.utils.parseEther("100000") + ); + + await tx1.wait(1); + + console.log( + `Account1 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account1.address)) + .toString()}` + ); + console.log( + `Account2 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account2.address)) + .toString()}` + ); + + console.log( + `Account3 balance= ${ethers.utils + .formatEther(await gtToken.balanceOf(account3.address)) + .toString()}` + ); + + gtToken = await ethers.getContract( + "GovernanceToken", + account1.address + ); + tx1 = await gtToken.delegate(account1.address); + await tx1.wait(1); + gtToken = await ethers.getContract( + "GovernanceToken", + account2.address + ); + tx1 = await gtToken.delegate(account2.address); + gtToken = await ethers.getContract( + "GovernanceToken", + account3.address + ); + tx1 = await gtToken.delegate(account3.address); + await tx1.wait(1); + + moveBlocks(1); + + blockNumber = await ethers.provider.getBlockNumber(); + console.log( + `account1 voting power : ${await governor.getVotes( + account1.address, + blockNumber - 1 + )}` + ); + console.log( + `account2 voting power : ${await governor.getVotes( + account2.address, + blockNumber - 1 + )}` + ); + console.log( + `account3 voting power : ${await governor.getVotes( + account3.address, + blockNumber - 1 + )}` + ); + + const proposalDescription = + "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMUU"; + const encodedFunctionCall = + fundProjectContract.interface.encodeFunctionData(FUNC, [NEW_VALUE]); + + const proposalTx = await governor.propose( + [fundProjectContract.address], + [0], + [encodedFunctionCall], + proposalDescription + ); + const proposeReceipt = await proposalTx.wait(1); + + console.log( + `Purposal start Block number= ${await ethers.provider.getBlockNumber()}` + ); + const proposalId = proposeReceipt.events[0].args.proposalId; + let proposalState = await governor.state(proposalId); + + const deadline = await governor.proposalDeadline(proposalId); + console.log(`Proposal deadline on block ${deadline.toString()}`); + + console.log(`Current Proposal State: ${proposalState}`); + /* enum ProposalState { + Pending, + Active, + Canceled, + Defeated, + Succeeded, + Queued, + Expired, + Executed + } */ + expect(proposalState == 1); + + await moveBlocks(VOTING_DELAY + 1); + blockNumber = await ethers.provider.getBlockNumber(); + + console.log( + `account1 voting power : ${await governor.getVotes( + account1.address, + blockNumber - 1 + )}` + ); + console.log( + `account2 voting power : ${await governor.getVotes( + account2.address, + blockNumber - 1 + )}` + ); + console.log( + `account3 voting power : ${await governor.getVotes( + account3.address, + blockNumber - 1 + )}` + ); + + console.log( + `after voting delay Block number= ${await ethers.provider.getBlockNumber()}` + ); + + // connect with account1 + governor = await ethers.getContract( + "GovernerContract", + account1.address + ); + // voting... + // 0 = Against, 1 = For, 2 = Abstain + let voteTxResponse = await governor.castVote(proposalId, 1); + await voteTxResponse.wait(1); + console.log( + `after voting account1 Block number= ${await ethers.provider.getBlockNumber()}` + ); + /* const hasVoted = await governor.hasVoted( + proposalId, + account1.address + ); + console.log(`account1 hasVoted: ${hasVoted}`); */ + + console.log( + `after voting period Block number= ${await ethers.provider.getBlockNumber()}` + ); + + // voting with account 2 ************************************************ + + // connect with account2 + const governor1 = await ethers.getContract( + "GovernerContract", + account2.address + ); + + const voteTxResponse1 = await governor1.castVote(proposalId, 0); + await voteTxResponse1.wait(1); + console.log( + `after voting account2 Block number= ${await ethers.provider.getBlockNumber()}` + ); + + /* const hasVoted2 = await governor.hasVoted( + proposalId, + account2.address + ); + console.log(`account2 hasVoted: ${hasVoted2}`); */ + + // account3 is voting ********************************************************** */ + // connect with account1 + governor = await ethers.getContract( + "GovernerContract", + account3.address + ); + // voting... + // 0 = Against, 1 = For, 2 = Abstain + voteTxResponse = await governor.castVote(proposalId, 1); + + // finish the voting + await moveBlocks(VOTING_PERIOD + 1); + + proposalState = await governor.state(proposalId); + console.log(`Current Proposal State: ${proposalState}`); + + // getting to results + const { againstVotes, forVotes, abstainVotes } = + await governor.proposalVotes(proposalId); + console.log( + `Vote on against: ${ethers.utils.formatEther(againstVotes)}` + ); + console.log(`Vote on for: ${ethers.utils.formatEther(forVotes)}`); + console.log( + `Vote on abstain: ${ethers.utils.formatEther(abstainVotes)}` + ); + + assert.equal(proposalState.toString(), "4"); + + // its time to queue & execute + + const descriptionHash = ethers.utils.keccak256(args); + governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + console.log(encodedFunctionCall); + console.log(descriptionHash); + /* const queueTx = await governor.queue( + [fundProjectContract.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await queueTx.wait(1); */ + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + console.log("Executing..."); + /* const executeTx = await governor.execute( + [fundProjectContract.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await executeTx.wait(1); */ + + /* const fundable = await fundProjectContract._isApporoveFundingByDao( + proposalDescription + ); + console.log(fundable); */ + }); + }); + }); From db68871e9e816124e9df90a581fdc6ca8238ea43 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 4 Nov 2022 17:31:30 +0300 Subject: [PATCH 09/28] Funding Contract --- .gitignore | 1 + contracts/FundProject.sol | 57 + contracts/GovernerContract.sol | 10 + deploy/06-deploy-fundProject.js | 37 + deployments/localhost/Box.json | 185 ++ deployments/localhost/FundProject.json | 291 +++ deployments/localhost/GovernanceToken.json | 8 +- deployments/localhost/GovernerContract.json | 1811 +++++++++++++++++ deployments/localhost/TimeLock.json | 1173 +++++++++++ ... => 66f18b8ec322110c2dd2cceea16c0aca.json} | 42 +- .../88b66c97de3b803518e048c2fd73f192.json | 41 + .../c3bd0fff8e093c1104055db0ec135b98.json | 119 ++ helper-config.js | 2 + proposals.json | 2 +- scripts/propose.js | 1 + scripts/queue-and-execute-afterSubmit.js | 26 + scripts/submit.js | 1 + scripts/submit_and_propose.js | 162 ++ 18 files changed, 3943 insertions(+), 26 deletions(-) create mode 100644 contracts/FundProject.sol create mode 100644 deploy/06-deploy-fundProject.js create mode 100644 deployments/localhost/Box.json create mode 100644 deployments/localhost/FundProject.json create mode 100644 deployments/localhost/GovernerContract.json create mode 100644 deployments/localhost/TimeLock.json rename deployments/localhost/solcInputs/{1fbca7b8c0c69581356fdb74c6edaebf.json => 66f18b8ec322110c2dd2cceea16c0aca.json} (100%) create mode 100644 deployments/localhost/solcInputs/88b66c97de3b803518e048c2fd73f192.json create mode 100644 deployments/localhost/solcInputs/c3bd0fff8e093c1104055db0ec135b98.json create mode 100644 scripts/queue-and-execute-afterSubmit.js create mode 100644 scripts/submit_and_propose.js diff --git a/.gitignore b/.gitignore index f2fe16d..26a1e45 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ artifacts cache node_modules +fetchIpfs.js \ No newline at end of file diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol new file mode 100644 index 0000000..9476f06 --- /dev/null +++ b/contracts/FundProject.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract FundProject is Ownable { + error FundProject__NotApporovedByDao(); + + mapping(uint256 => string) public idToHash; + mapping(uint256 => mapping(address => uint256)) public funders; + mapping(uint256 => bool) public _isApporovedByDao; + + modifier isApporovedByDao(uint256 _projecID) { + if (!_isApporovedByDao[_projecID]) + revert FundProject__NotApporovedByDao(); + _; + } + + function fund(uint256 _projecID) + public + payable + isApporovedByDao(_projecID) + { + funders[_projecID][msg.sender] += msg.value; + } + + function apporoveFundingByDao(string memory _ipfsHash, uint256 _projectId) + external + onlyOwner + { + // only dao can call this function (after deployement we will transfer ownership to dao) + + idToHash[_projectId] = _ipfsHash; + _isApporovedByDao[_projectId] = true; + } + + function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { + // only dao can call this function (after deployement we will transfer ownership to dao) + _isApporovedByDao[_projecID] = false; + } + + function _isapporoveFundingByDao(uint256 _projecID) + external + view + returns (bool) + { + return _isApporovedByDao[_projecID]; + } + + function _getHashOfProjectData(uint256 _projecID) + public + view + returns (string memory) + { + return idToHash[_projecID]; + } +} diff --git a/contracts/GovernerContract.sol b/contracts/GovernerContract.sol index b487287..3f7979c 100644 --- a/contracts/GovernerContract.sol +++ b/contracts/GovernerContract.sol @@ -16,6 +16,16 @@ contract GovernerContract is GovernorVotesQuorumFraction, GovernorTimelockControl { + error GovernerContract__NotApporovedByDaoFoundation(); + + mapping(address => bool) public inWhiteList; + + modifier isApporovedByDaoFoundation() { + if (!inWhiteList[msg.sender]) + revert GovernerContract__NotApporovedByDaoFoundation(); + _; + } + constructor( IVotes _token, TimelockController _timelock, diff --git a/deploy/06-deploy-fundProject.js b/deploy/06-deploy-fundProject.js new file mode 100644 index 0000000..7c39e6b --- /dev/null +++ b/deploy/06-deploy-fundProject.js @@ -0,0 +1,37 @@ +const { getNamedAccounts, deployments, network, ethers } = require("hardhat"); +const { developmentChains } = require("../helper-config"); +const { verify } = require("../utils/verify"); + +module.exports = async ({ getNamedAccounts, deployments }) => { + const { deploy, log } = deployments; + const { deployer } = await getNamedAccounts(); + + args = []; + log("deploying FundProject contract..."); + const fundProject = await deploy("FundProject", { + from: deployer, + args: args, + log: true, + waitConfirmations: network.config.blockConfirmations || 1, + }); + log(`FundProject deployed at ${fundProject.address}`); + + if ( + !developmentChains.includes(network.name) && + process.env.ETHERSCAN_API_KEY + ) { + await verify(fundProject.address, args); + } + const timeLock = await ethers.getContract("TimeLock"); + const fundProjectContract = await ethers.getContractAt( + "FundProject", + fundProject.address + ); + const transferOwnerTx = await fundProjectContract.transferOwnership( + timeLock.address + ); + await transferOwnerTx.wait(1); + log("fundProjectContract Ownership transfered!"); +}; + +module.exports.tags = ["all", "funding"]; diff --git a/deployments/localhost/Box.json b/deployments/localhost/Box.json new file mode 100644 index 0000000..f3e62d3 --- /dev/null +++ b/deployments/localhost/Box.json @@ -0,0 +1,185 @@ +{ + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "abi": [ + { + "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": "newValue", + "type": "uint256" + } + ], + "name": "ValueChanged", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "retrieve", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], + "name": "store", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x6e41d7ee4a7548d50a82f10d619808b4b36293e770afd7d3f7cf7fca4530fe48", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "transactionIndex": 0, + "gasUsed": "398269", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xe15d8f3310e6d36266fbfb4fd0b1f9bec3b972d69135cb23efc5031cf7602910", + "transactionHash": "0x6e41d7ee4a7548d50a82f10d619808b4b36293e770afd7d3f7cf7fca4530fe48", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 7, + "transactionHash": "0x6e41d7ee4a7548d50a82f10d619808b4b36293e770afd7d3f7cf7fca4530fe48", + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0xe15d8f3310e6d36266fbfb4fd0b1f9bec3b972d69135cb23efc5031cf7602910" + } + ], + "blockNumber": 7, + "cumulativeGasUsed": "398269", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "66f18b8ec322110c2dd2cceea16c0aca", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"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\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"ValueChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"retrieve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"store\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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/Box.sol\":\"Box\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/Box.sol\":{\"content\":\"// contracts/Box.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract Box is Ownable {\\n uint256 private value;\\n\\n // Emitted when the stored value changes\\n event ValueChanged(uint256 newValue);\\n\\n // Stores a new value in the contract\\n function store(uint256 newValue) public onlyOwner {\\n value = newValue;\\n emit ValueChanged(newValue);\\n }\\n\\n // Reads the last stored value\\n function retrieve() public view returns (uint256) {\\n return value;\\n }\\n}\\n\",\"keccak256\":\"0x40a0d691a6280d5bb9416106951c86399591fd77ea274f1e02b6baa7d68a29af\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6105c38061010d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632e64cec11461005c5780636057361d1461007a578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b6100646100da565b6040516100719190610350565b60405180910390f35b610094600480360381019061008f919061039c565b6100e4565b005b61009e61012d565b005b6100a8610141565b6040516100b5919061040a565b60405180910390f35b6100d860048036038101906100d39190610451565b61016a565b005b6000600154905090565b6100ec6101ed565b806001819055507f93fe6d397c74fdf1402a8b72e47b68512f0510d7b98a4bc4cbdf6ac7108b3c59816040516101229190610350565b60405180910390a150565b6101356101ed565b61013f600061026b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101726101ed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d890610501565b60405180910390fd5b6101ea8161026b565b50565b6101f561032f565b73ffffffffffffffffffffffffffffffffffffffff16610213610141565b73ffffffffffffffffffffffffffffffffffffffff1614610269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609061056d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b600080fd5b61037981610337565b811461038457600080fd5b50565b60008135905061039681610370565b92915050565b6000602082840312156103b2576103b161036b565b5b60006103c084828501610387565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103f4826103c9565b9050919050565b610404816103e9565b82525050565b600060208201905061041f60008301846103fb565b92915050565b61042e816103e9565b811461043957600080fd5b50565b60008135905061044b81610425565b92915050565b6000602082840312156104675761046661036b565b5b60006104758482850161043c565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006104eb60268361047e565b91506104f68261048f565b604082019050919050565b6000602082019050818103600083015261051a816104de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061055760208361047e565b915061056282610521565b602082019050919050565b600060208201905081810360008301526105868161054a565b905091905056fea2646970667358221220934c0892f5e2c6e47639ed174f5093dcdc2264c605fc741014286f50f87e0e5064736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80632e64cec11461005c5780636057361d1461007a578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b6100646100da565b6040516100719190610350565b60405180910390f35b610094600480360381019061008f919061039c565b6100e4565b005b61009e61012d565b005b6100a8610141565b6040516100b5919061040a565b60405180910390f35b6100d860048036038101906100d39190610451565b61016a565b005b6000600154905090565b6100ec6101ed565b806001819055507f93fe6d397c74fdf1402a8b72e47b68512f0510d7b98a4bc4cbdf6ac7108b3c59816040516101229190610350565b60405180910390a150565b6101356101ed565b61013f600061026b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101726101ed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d890610501565b60405180910390fd5b6101ea8161026b565b50565b6101f561032f565b73ffffffffffffffffffffffffffffffffffffffff16610213610141565b73ffffffffffffffffffffffffffffffffffffffff1614610269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609061056d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b600080fd5b61037981610337565b811461038457600080fd5b50565b60008135905061039681610370565b92915050565b6000602082840312156103b2576103b161036b565b5b60006103c084828501610387565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103f4826103c9565b9050919050565b610404816103e9565b82525050565b600060208201905061041f60008301846103fb565b92915050565b61042e816103e9565b811461043957600080fd5b50565b60008135905061044b81610425565b92915050565b6000602082840312156104675761046661036b565b5b60006104758482850161043c565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006104eb60268361047e565b91506104f68261048f565b604082019050919050565b6000602082019050818103600083015261051a816104de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061055760208361047e565b915061056282610521565b602082019050919050565b600060208201905081810360008301526105868161054a565b905091905056fea2646970667358221220934c0892f5e2c6e47639ed174f5093dcdc2264c605fc741014286f50f87e0e5064736f6c63430008110033", + "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": 400, + "contract": "contracts/Box.sol:Box", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 10088, + "contract": "contracts/Box.sol:Box", + "label": "value", + "offset": 0, + "slot": "1", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/localhost/FundProject.json b/deployments/localhost/FundProject.json new file mode 100644 index 0000000..0159ac0 --- /dev/null +++ b/deployments/localhost/FundProject.json @@ -0,0 +1,291 @@ +{ + "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + "abi": [ + { + "inputs": [], + "name": "FundProject__NotApporovedByDao", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "_isApporovedByDao", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_project", + "type": "string" + } + ], + "name": "_isapporoveFundingByDao", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_project", + "type": "string" + } + ], + "name": "apporoveFundingByDao", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_project", + "type": "string" + } + ], + "name": "cancelApporovelFundingByDao", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "ipfsHash", + "type": "string" + } + ], + "name": "fund", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "funders", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x82b0a9a33d5294fba926aa78a436136cb7d25513252ac644c2c5701e8293ca4d", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + "transactionIndex": 0, + "gasUsed": "712147", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000040000000000000000000000000000000008000000000000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x555f0c77d09b474cc8f3dc4d975299237969212a7dee16d073c076fb510cbf04", + "transactionHash": "0x82b0a9a33d5294fba926aa78a436136cb7d25513252ac644c2c5701e8293ca4d", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 9, + "transactionHash": "0x82b0a9a33d5294fba926aa78a436136cb7d25513252ac644c2c5701e8293ca4d", + "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x555f0c77d09b474cc8f3dc4d975299237969212a7dee16d073c076fb510cbf04" + } + ], + "blockNumber": 9, + "cumulativeGasUsed": "712147", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "88b66c97de3b803518e048c2fd73f192", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_project\",\"type\":\"string\"}],\"name\":\"_isapporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_project\",\"type\":\"string\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_project\",\"type\":\"string\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"ipfsHash\",\"type\":\"string\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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/FundProject.sol\":\"FundProject\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract FundProject is Ownable {\\n error FundProject__NotApporovedByDao();\\n\\n mapping(string => mapping(address => uint256)) public funders;\\n mapping(string => bool) public _isApporovedByDao;\\n\\n modifier isApporovedByDao(string memory _ipfsHash) {\\n if (!_isApporovedByDao[_ipfsHash])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n function fund(string memory ipfsHash)\\n public\\n payable\\n isApporovedByDao(ipfsHash)\\n {\\n funders[ipfsHash][msg.sender] += msg.value;\\n }\\n\\n function apporoveFundingByDao(string memory _project) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n _isApporovedByDao[_project] = true;\\n }\\n\\n function cancelApporovelFundingByDao(string memory _project)\\n external\\n onlyOwner\\n {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n _isApporovedByDao[_project] = false;\\n }\\n\\n function _isapporoveFundingByDao(string memory _project)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_project];\\n }\\n}\\n\",\"keccak256\":\"0x1a7a2bd5e84cd24252526a93fbefc84bd2c4e3b40ba6b3493d6bd3bbb2472cc0\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610b768061010d6000396000f3fe6080604052600436106100865760003560e01c806374c121b21161005957806374c121b2146101245780638da5cb5b1461014d578063ab70eff314610178578063acb469ee146101b5578063f2fde38b146101f257610086565b806363e1a6ba1461008b578063715018a6146100c857806372d63464146100df57806373451f6514610108575b600080fd5b34801561009757600080fd5b506100b260048036038101906100ad9190610782565b61021b565b6040516100bf91906107e6565b60405180910390f35b3480156100d457600080fd5b506100dd610251565b005b3480156100eb57600080fd5b5061010660048036038101906101019190610782565b610265565b005b610122600480360381019061011d9190610782565b6102a7565b005b34801561013057600080fd5b5061014b60048036038101906101469190610782565b610380565b005b34801561015957600080fd5b506101626103c2565b60405161016f9190610842565b60405180910390f35b34801561018457600080fd5b5061019f600480360381019061019a9190610889565b6103eb565b6040516101ac91906108fe565b60405180910390f35b3480156101c157600080fd5b506101dc60048036038101906101d79190610782565b610426565b6040516101e991906107e6565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190610919565b61045b565b005b6002818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b6102596104de565b610263600061055c565b565b61026d6104de565b600060028260405161027f91906109b7565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050565b806002816040516102b891906109b7565b908152602001604051809103902060009054906101000a900460ff1661030a576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3460018360405161031b91906109b7565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461037591906109fd565b925050819055505050565b6103886104de565b600160028260405161039a91906109b7565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600182805160208101820180518482526020830160208501208183528095505050505050602052806000526040600020600091509150505481565b600060028260405161043891906109b7565b908152602001604051809103902060009054906101000a900460ff169050919050565b6104636104de565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036104d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c990610ab4565b60405180910390fd5b6104db8161055c565b50565b6104e6610620565b73ffffffffffffffffffffffffffffffffffffffff166105046103c2565b73ffffffffffffffffffffffffffffffffffffffff161461055a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055190610b20565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61068f82610646565b810181811067ffffffffffffffff821117156106ae576106ad610657565b5b80604052505050565b60006106c1610628565b90506106cd8282610686565b919050565b600067ffffffffffffffff8211156106ed576106ec610657565b5b6106f682610646565b9050602081019050919050565b82818337600083830152505050565b6000610725610720846106d2565b6106b7565b90508281526020810184848401111561074157610740610641565b5b61074c848285610703565b509392505050565b600082601f8301126107695761076861063c565b5b8135610779848260208601610712565b91505092915050565b60006020828403121561079857610797610632565b5b600082013567ffffffffffffffff8111156107b6576107b5610637565b5b6107c284828501610754565b91505092915050565b60008115159050919050565b6107e0816107cb565b82525050565b60006020820190506107fb60008301846107d7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061082c82610801565b9050919050565b61083c81610821565b82525050565b60006020820190506108576000830184610833565b92915050565b61086681610821565b811461087157600080fd5b50565b6000813590506108838161085d565b92915050565b600080604083850312156108a05761089f610632565b5b600083013567ffffffffffffffff8111156108be576108bd610637565b5b6108ca85828601610754565b92505060206108db85828601610874565b9150509250929050565b6000819050919050565b6108f8816108e5565b82525050565b600060208201905061091360008301846108ef565b92915050565b60006020828403121561092f5761092e610632565b5b600061093d84828501610874565b91505092915050565b600081519050919050565b600081905092915050565b60005b8381101561097a57808201518184015260208101905061095f565b60008484015250505050565b600061099182610946565b61099b8185610951565b93506109ab81856020860161095c565b80840191505092915050565b60006109c38284610986565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a08826108e5565b9150610a13836108e5565b9250828201905080821115610a2b57610a2a6109ce565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610a9e602683610a31565b9150610aa982610a42565b604082019050919050565b60006020820190508181036000830152610acd81610a91565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000610b0a602083610a31565b9150610b1582610ad4565b602082019050919050565b60006020820190508181036000830152610b3981610afd565b905091905056fea264697066735822122012b342beda6fc4f8b4a00001ced7224dae015a294f9978f0d9b57172d68b03bd64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106100865760003560e01c806374c121b21161005957806374c121b2146101245780638da5cb5b1461014d578063ab70eff314610178578063acb469ee146101b5578063f2fde38b146101f257610086565b806363e1a6ba1461008b578063715018a6146100c857806372d63464146100df57806373451f6514610108575b600080fd5b34801561009757600080fd5b506100b260048036038101906100ad9190610782565b61021b565b6040516100bf91906107e6565b60405180910390f35b3480156100d457600080fd5b506100dd610251565b005b3480156100eb57600080fd5b5061010660048036038101906101019190610782565b610265565b005b610122600480360381019061011d9190610782565b6102a7565b005b34801561013057600080fd5b5061014b60048036038101906101469190610782565b610380565b005b34801561015957600080fd5b506101626103c2565b60405161016f9190610842565b60405180910390f35b34801561018457600080fd5b5061019f600480360381019061019a9190610889565b6103eb565b6040516101ac91906108fe565b60405180910390f35b3480156101c157600080fd5b506101dc60048036038101906101d79190610782565b610426565b6040516101e991906107e6565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190610919565b61045b565b005b6002818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b6102596104de565b610263600061055c565b565b61026d6104de565b600060028260405161027f91906109b7565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050565b806002816040516102b891906109b7565b908152602001604051809103902060009054906101000a900460ff1661030a576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3460018360405161031b91906109b7565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461037591906109fd565b925050819055505050565b6103886104de565b600160028260405161039a91906109b7565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600182805160208101820180518482526020830160208501208183528095505050505050602052806000526040600020600091509150505481565b600060028260405161043891906109b7565b908152602001604051809103902060009054906101000a900460ff169050919050565b6104636104de565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036104d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c990610ab4565b60405180910390fd5b6104db8161055c565b50565b6104e6610620565b73ffffffffffffffffffffffffffffffffffffffff166105046103c2565b73ffffffffffffffffffffffffffffffffffffffff161461055a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055190610b20565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61068f82610646565b810181811067ffffffffffffffff821117156106ae576106ad610657565b5b80604052505050565b60006106c1610628565b90506106cd8282610686565b919050565b600067ffffffffffffffff8211156106ed576106ec610657565b5b6106f682610646565b9050602081019050919050565b82818337600083830152505050565b6000610725610720846106d2565b6106b7565b90508281526020810184848401111561074157610740610641565b5b61074c848285610703565b509392505050565b600082601f8301126107695761076861063c565b5b8135610779848260208601610712565b91505092915050565b60006020828403121561079857610797610632565b5b600082013567ffffffffffffffff8111156107b6576107b5610637565b5b6107c284828501610754565b91505092915050565b60008115159050919050565b6107e0816107cb565b82525050565b60006020820190506107fb60008301846107d7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061082c82610801565b9050919050565b61083c81610821565b82525050565b60006020820190506108576000830184610833565b92915050565b61086681610821565b811461087157600080fd5b50565b6000813590506108838161085d565b92915050565b600080604083850312156108a05761089f610632565b5b600083013567ffffffffffffffff8111156108be576108bd610637565b5b6108ca85828601610754565b92505060206108db85828601610874565b9150509250929050565b6000819050919050565b6108f8816108e5565b82525050565b600060208201905061091360008301846108ef565b92915050565b60006020828403121561092f5761092e610632565b5b600061093d84828501610874565b91505092915050565b600081519050919050565b600081905092915050565b60005b8381101561097a57808201518184015260208101905061095f565b60008484015250505050565b600061099182610946565b61099b8185610951565b93506109ab81856020860161095c565b80840191505092915050565b60006109c38284610986565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a08826108e5565b9150610a13836108e5565b9250828201905080821115610a2b57610a2a6109ce565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610a9e602683610a31565b9150610aa982610a42565b604082019050919050565b60006020820190508181036000830152610acd81610a91565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000610b0a602083610a31565b9150610b1582610ad4565b602082019050919050565b60006020820190508181036000830152610b3981610afd565b905091905056fea264697066735822122012b342beda6fc4f8b4a00001ced7224dae015a294f9978f0d9b57172d68b03bd64736f6c63430008110033", + "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": 7, + "contract": "contracts/FundProject.sol:FundProject", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 147, + "contract": "contracts/FundProject.sol:FundProject", + "label": "funders", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_string_memory_ptr,t_mapping(t_address,t_uint256))" + }, + { + "astId": 151, + "contract": "contracts/FundProject.sol:FundProject", + "label": "_isApporovedByDao", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_string_memory_ptr,t_bool)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_string_memory_ptr,t_bool)": { + "encoding": "mapping", + "key": "t_string_memory_ptr", + "label": "mapping(string => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_string_memory_ptr,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_string_memory_ptr", + "label": "mapping(string => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_string_memory_ptr": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index ab5b9e0..eeee5d3 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -671,7 +671,7 @@ "transactionIndex": 0, "gasUsed": "3606454", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000410000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000008000000000020000000000000000000000000200000000000000000000000000000000000000000", - "blockHash": "0xaf7d65fe25227bdb091ad2c35d1992ca4a422bad25fca1e43b96086d2a04809d", + "blockHash": "0x494cd87aef1ce42710078a5715e8771d1771e8b803f136e00ee7c1b1bc1f0e1a", "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", "logs": [ { @@ -686,7 +686,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 0, - "blockHash": "0xaf7d65fe25227bdb091ad2c35d1992ca4a422bad25fca1e43b96086d2a04809d" + "blockHash": "0x494cd87aef1ce42710078a5715e8771d1771e8b803f136e00ee7c1b1bc1f0e1a" }, { "transactionIndex": 0, @@ -700,7 +700,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 1, - "blockHash": "0xaf7d65fe25227bdb091ad2c35d1992ca4a422bad25fca1e43b96086d2a04809d" + "blockHash": "0x494cd87aef1ce42710078a5715e8771d1771e8b803f136e00ee7c1b1bc1f0e1a" } ], "blockNumber": 1, @@ -710,7 +710,7 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "1fbca7b8c0c69581356fdb74c6edaebf", + "solcInputHash": "66f18b8ec322110c2dd2cceea16c0aca", "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_initialSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes {\\n uint256 public s_initialSupply = 1000000e18;\\n address private immutable i_owner;\\n\\n event TokenTransfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n modifier onlyOwner() {\\n require(i_owner == msg.sender, \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n i_owner = msg.sender;\\n _mint(msg.sender, s_initialSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n emit TokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount)\\n internal\\n override(ERC20Votes)\\n onlyOwner\\n {\\n super._mint(to, amount);\\n }\\n\\n function mintToken(address to, uint256 amount) external {\\n _mint(to, amount);\\n }\\n\\n function burnToken(address account, uint256 amount) external {\\n _burn(account, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0x50615b1158220c5c6d5ac9ebf9507f9f4ea531e0ef593c65b50ebc91a9eaf1ff\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x61016060405269d3c21bcecceda1000000600a553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000eda565b5080600490816200011d919062000eda565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001898184846200022260201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050503373ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff16815250506200021c33600a546200025e60201b60201c565b6200146a565b600083838346306040516020016200023f95949392919062001032565b6040516020818303038152906040528051906020012090509392505050565b3373ffffffffffffffffffffffffffffffffffffffff166101405173ffffffffffffffffffffffffffffffffffffffff1614620002d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c990620010f0565b60405180910390fd5b620002e98282620002ed60201b62000f241760201c565b5050565b620003048282620003ab60201b62000fb11760201c565b620003146200052360201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620003426200054760201b60201c565b111562000386576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037d9062001188565b60405180910390fd5b620003a560096200055160201b6200111017836200056960201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200041d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041490620011fa565b60405180910390fd5b62000431600083836200081a60201b60201c565b80600260008282546200044591906200124b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200049c91906200124b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000503919062001286565b60405180910390a36200051f600083836200081f60201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b600081836200056191906200124b565b905092915050565b60008060008580549050905060008114620005de57856001826200058e9190620012a3565b81548110620005a257620005a1620012de565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620005e1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200060d83858760201c565b915060008111801562000666575043866001836200062c9190620012a3565b8154811062000640576200063f620012de565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1562000707576200068282620008a360201b620011261760201c565b86600183620006929190620012a3565b81548110620006a657620006a5620012de565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000811565b85604051806040016040528062000729436200091160201b620011911760201c565b63ffffffff1681526020016200074a85620008a360201b620011261760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b620008378383836200096760201b620011e41760201c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de68360405162000896919062001286565b60405180910390a3505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000909576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009009062001383565b60405180910390fd5b819050919050565b600063ffffffff80168211156200095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000956906200141b565b60405180910390fd5b819050919050565b6200097f838383620009b760201b6200120f1760201c565b620009b26200099484620009bc60201b60201c565b620009a584620009bc60201b60201c565b8362000a2560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000a625750600081115b1562000c4357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000b555760008062000afc600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000c4860201b6200121417856200056960201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000b4a9291906200143d565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000c425760008062000be9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200055160201b6200111017856200056960201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c379291906200143d565b60405180910390a250505b5b505050565b6000818362000c589190620012a3565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ce257607f821691505b60208210810362000cf85762000cf762000c9a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000d627fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d23565b62000d6e868362000d23565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000dbb62000db562000daf8462000d86565b62000d90565b62000d86565b9050919050565b6000819050919050565b62000dd78362000d9a565b62000def62000de68262000dc2565b84845462000d30565b825550505050565b600090565b62000e0662000df7565b62000e1381848462000dcc565b505050565b5b8181101562000e3b5762000e2f60008262000dfc565b60018101905062000e19565b5050565b601f82111562000e8a5762000e548162000cfe565b62000e5f8462000d13565b8101602085101562000e6f578190505b62000e8762000e7e8562000d13565b83018262000e18565b50505b505050565b600082821c905092915050565b600062000eaf6000198460080262000e8f565b1980831691505092915050565b600062000eca838362000e9c565b9150826002028217905092915050565b62000ee58262000c60565b67ffffffffffffffff81111562000f015762000f0062000c6b565b5b62000f0d825462000cc9565b62000f1a82828562000e3f565b600060209050601f83116001811462000f52576000841562000f3d578287015190505b62000f49858262000ebc565b86555062000fb9565b601f19841662000f628662000cfe565b60005b8281101562000f8c5784890151825560018201915060208501945060208101905062000f65565b8683101562000fac578489015162000fa8601f89168262000e9c565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000fd68162000fc1565b82525050565b62000fe78162000d86565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200101a8262000fed565b9050919050565b6200102c816200100d565b82525050565b600060a08201905062001049600083018862000fcb565b62001058602083018762000fcb565b62001067604083018662000fcb565b62001076606083018562000fdc565b62001085608083018462001021565b9695505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620010d86020836200108f565b9150620010e582620010a0565b602082019050919050565b600060208201905081810360008301526200110b81620010c9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000620011706030836200108f565b91506200117d8262001112565b604082019050919050565b60006020820190508181036000830152620011a38162001161565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620011e2601f836200108f565b9150620011ef82620011aa565b602082019050919050565b600060208201905081810360008301526200121581620011d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620012588262000d86565b9150620012658362000d86565b925082820190508082111562001280576200127f6200121c565b5b92915050565b60006020820190506200129d600083018462000fdc565b92915050565b6000620012b08262000d86565b9150620012bd8362000d86565b9250828203905081811115620012d857620012d76200121c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200136b6027836200108f565b915062001378826200130d565b604082019050919050565b600060208201905081810360008301526200139e816200135c565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620014036026836200108f565b91506200141082620013a5565b604082019050919050565b600060208201905081810360008301526200143681620013f4565b9050919050565b600060408201905062001454600083018562000fdc565b62001463602083018462000fdc565b9392505050565b60805160a05160c05160e051610100516101205161014051613c30620014c56000396000611a5f015260006117b4015260006117f6015260006117d50152600061170a01526000611760015260006117890152613c306000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a457c2d711610097578063d1df306c11610071578063d1df306c146104c0578063d505accf146104dc578063dd62ed3e146104f8578063f1127ed81461052857610173565b8063a457c2d714610444578063a9059cbb14610474578063c3cda520146104a457610173565b806370a082311461034a57806379c650681461037a5780637ecebe00146103965780638e539e8c146103c657806395d89b41146103f65780639ab24eb01461041457610173565b80633644e515116101305780633644e51514610250578063395093511461026e5780633a46b1a81461029e578063587cde1e146102ce5780635c19a95c146102fe5780636fcfff451461031a57610173565b806306fdde0314610178578063095ea7b314610196578063096b34cf146101c657806318160ddd146101e457806323b872dd14610202578063313ce56714610232575b600080fd5b610180610558565b60405161018d91906126f3565b60405180910390f35b6101b060048036038101906101ab91906127ae565b6105ea565b6040516101bd9190612809565b60405180910390f35b6101ce61060d565b6040516101db9190612833565b60405180910390f35b6101ec610613565b6040516101f99190612833565b60405180910390f35b61021c6004803603810190610217919061284e565b61061d565b6040516102299190612809565b60405180910390f35b61023a61064c565b60405161024791906128bd565b60405180910390f35b610258610655565b60405161026591906128f1565b60405180910390f35b610288600480360381019061028391906127ae565b610664565b6040516102959190612809565b60405180910390f35b6102b860048036038101906102b391906127ae565b61069b565b6040516102c59190612833565b60405180910390f35b6102e860048036038101906102e3919061290c565b61072f565b6040516102f59190612948565b60405180910390f35b6103186004803603810190610313919061290c565b610798565b005b610334600480360381019061032f919061290c565b6107ac565b6040516103419190612982565b60405180910390f35b610364600480360381019061035f919061290c565b610800565b6040516103719190612833565b60405180910390f35b610394600480360381019061038f91906127ae565b610848565b005b6103b060048036038101906103ab919061290c565b610856565b6040516103bd9190612833565b60405180910390f35b6103e060048036038101906103db919061299d565b6108a6565b6040516103ed9190612833565b60405180910390f35b6103fe6108fc565b60405161040b91906126f3565b60405180910390f35b61042e6004803603810190610429919061290c565b61098e565b60405161043b9190612833565b60405180910390f35b61045e600480360381019061045991906127ae565b610a9f565b60405161046b9190612809565b60405180910390f35b61048e600480360381019061048991906127ae565b610b16565b60405161049b9190612809565b60405180910390f35b6104be60048036038101906104b99190612a22565b610b39565b005b6104da60048036038101906104d591906127ae565b610c3d565b005b6104f660048036038101906104f19190612aaf565b610c4b565b005b610512600480360381019061050d9190612b51565b610d8d565b60405161051f9190612833565b60405180910390f35b610542600480360381019061053d9190612bbd565b610e14565b60405161054f9190612c72565b60405180910390f35b60606003805461056790612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461059390612cbc565b80156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b5050505050905090565b6000806105f561122a565b9050610602818585611232565b600191505092915050565b600a5481565b6000600254905090565b60008061062861122a565b90506106358582856113fb565b610640858585611487565b60019150509392505050565b60006012905090565b600061065f611706565b905090565b60008061066f61122a565b90506106908185856106818589610d8d565b61068b9190612d1c565b611232565b600191505092915050565b60004382106106df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d690612d9c565b60405180910390fd5b610727600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611820565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6107a96107a361122a565b8261192c565b50565b60006107f9600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611191565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108528282611a46565b5050565b600061089f600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ae2565b9050919050565b60004382106108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190612d9c565b60405180910390fd5b6108f5600983611820565b9050919050565b60606004805461090b90612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461093790612cbc565b80156109845780601f1061095957610100808354040283529160200191610984565b820191906000526020600020905b81548152906001019060200180831161096757829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a7657600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610a2a9190612dbc565b81548110610a3b57610a3a612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a79565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610aaa61122a565b90506000610ab88286610d8d565b905083811015610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af490612e91565b60405180910390fd5b610b0a8286868403611232565b60019250505092915050565b600080610b2161122a565b9050610b2e818585611487565b600191505092915050565b83421115610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612efd565b60405180910390fd5b6000610bde610bd67fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610bbb9493929190612f1d565b60405160208183030381529060405280519060200120611af0565b858585611b0a565b9050610be981611b35565b8614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190612fae565b60405180910390fd5b610c34818861192c565b50505050505050565b610c478282611b93565b5050565b83421115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c859061301a565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610cbd8c611b35565b89604051602001610cd39695949392919061303a565b6040516020818303038152906040528051906020012090506000610cf682611af0565b90506000610d0682878787611b0a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906130e7565b60405180910390fd5b610d818a8a8a611232565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e1c612625565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610e7357610e72612df0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610f2e8282610fb1565b610f36611ba1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f5c610613565b1115610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613179565b60405180910390fd5b610fab600961111083611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611017906131e5565b60405180910390fd5b61102c60008383611e3d565b806002600082825461103e9190612d1c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110939190612d1c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110f89190612833565b60405180910390a361110c60008383611e42565b5050565b6000818361111e9190612d1c565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613277565b60405180910390fd5b819050919050565b600063ffffffff80168211156111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613309565b60405180910390fd5b819050919050565b6111ef83838361120f565b61120a6111fb8461072f565b6112048461072f565b83611eb7565b505050565b505050565b600081836112229190612dbc565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112989061339b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061342d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113ee9190612833565b60405180910390a3505050565b60006114078484610d8d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114815781811015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613499565b60405180910390fd5b6114808484848403611232565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed9061352b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c906135bd565b60405180910390fd5b611570838383611e3d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed9061364f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116899190612d1c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116ed9190612833565b60405180910390a3611700848484611e42565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561178257507f000000000000000000000000000000000000000000000000000000000000000046145b156117af577f0000000000000000000000000000000000000000000000000000000000000000905061181d565b61181a7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006120b0565b90505b90565b6000808380549050905060005b8181101561189f57600061184182846120ea565b90508486828154811061185757611856612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561188957809250611899565b6001816118969190612d1c565b91505b5061182d565b6000821461190157846001836118b59190612dbc565b815481106118c6576118c5612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611904565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006119378361072f565b9050600061194484610800565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611a40828483611eb7565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb906136bb565b60405180910390fd5b611ade8282610f24565b5050565b600081600001549050919050565b6000611b03611afd611706565b83612110565b9050919050565b6000806000611b1b87878787612143565b91509150611b288161224f565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b8281611ae2565b9150611b8d8161241b565b50919050565b611b9d8282612431565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611c335785600182611be79190612dbc565b81548110611bf857611bf7612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c36565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611c6483858763ffffffff16565b9150600081118015611cb757504386600183611c809190612dbc565b81548110611c9157611c90612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611d4457611cc582611126565b86600183611cd39190612dbc565b81548110611ce457611ce3612df0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611e34565b856040518060400160405280611d5943611191565b63ffffffff168152602001611d6d85611126565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611e4d8383836111e4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051611eaa9190612833565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ef35750600081115b156120ab57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fd157600080611f7a600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061121485611bc5565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611fc69291906136db565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120aa57600080612053600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061111085611bc5565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161209f9291906136db565b60405180910390a250505b5b505050565b600083838346306040516020016120cb959493929190613704565b6040516020818303038152906040528051906020012090509392505050565b600060028284186120fb9190613786565b8284166121089190612d1c565b905092915050565b6000828260405160200161212592919061382f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561217e576000600391509150612246565b601b8560ff16141580156121965750601c8560ff1614155b156121a8576000600491509150612246565b6000600187878787604051600081526020016040526040516121cd9493929190613866565b6020604051602081039080840390855afa1580156121ef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223d57600060019250925050612246565b80600092509250505b94509492505050565b60006004811115612263576122626138ab565b5b816004811115612276576122756138ab565b5b031561241857600160048111156122905761228f6138ab565b5b8160048111156122a3576122a26138ab565b5b036122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613926565b60405180910390fd5b600260048111156122f7576122f66138ab565b5b81600481111561230a576123096138ab565b5b0361234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190613992565b60405180910390fd5b6003600481111561235e5761235d6138ab565b5b816004811115612371576123706138ab565b5b036123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890613a24565b60405180910390fd5b6004808111156123c4576123c36138ab565b5b8160048111156123d7576123d66138ab565b5b03612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90613ab6565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61243b828261244f565b612449600961121483611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590613b48565b60405180910390fd5b6124ca82600083611e3d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254790613bda565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546125a79190612dbc565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161260c9190612833565b60405180910390a361262083600084611e42565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561269d578082015181840152602081019050612682565b60008484015250505050565b6000601f19601f8301169050919050565b60006126c582612663565b6126cf818561266e565b93506126df81856020860161267f565b6126e8816126a9565b840191505092915050565b6000602082019050818103600083015261270d81846126ba565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127458261271a565b9050919050565b6127558161273a565b811461276057600080fd5b50565b6000813590506127728161274c565b92915050565b6000819050919050565b61278b81612778565b811461279657600080fd5b50565b6000813590506127a881612782565b92915050565b600080604083850312156127c5576127c4612715565b5b60006127d385828601612763565b92505060206127e485828601612799565b9150509250929050565b60008115159050919050565b612803816127ee565b82525050565b600060208201905061281e60008301846127fa565b92915050565b61282d81612778565b82525050565b60006020820190506128486000830184612824565b92915050565b60008060006060848603121561286757612866612715565b5b600061287586828701612763565b935050602061288686828701612763565b925050604061289786828701612799565b9150509250925092565b600060ff82169050919050565b6128b7816128a1565b82525050565b60006020820190506128d260008301846128ae565b92915050565b6000819050919050565b6128eb816128d8565b82525050565b600060208201905061290660008301846128e2565b92915050565b60006020828403121561292257612921612715565b5b600061293084828501612763565b91505092915050565b6129428161273a565b82525050565b600060208201905061295d6000830184612939565b92915050565b600063ffffffff82169050919050565b61297c81612963565b82525050565b60006020820190506129976000830184612973565b92915050565b6000602082840312156129b3576129b2612715565b5b60006129c184828501612799565b91505092915050565b6129d3816128a1565b81146129de57600080fd5b50565b6000813590506129f0816129ca565b92915050565b6129ff816128d8565b8114612a0a57600080fd5b50565b600081359050612a1c816129f6565b92915050565b60008060008060008060c08789031215612a3f57612a3e612715565b5b6000612a4d89828a01612763565b9650506020612a5e89828a01612799565b9550506040612a6f89828a01612799565b9450506060612a8089828a016129e1565b9350506080612a9189828a01612a0d565b92505060a0612aa289828a01612a0d565b9150509295509295509295565b600080600080600080600060e0888a031215612ace57612acd612715565b5b6000612adc8a828b01612763565b9750506020612aed8a828b01612763565b9650506040612afe8a828b01612799565b9550506060612b0f8a828b01612799565b9450506080612b208a828b016129e1565b93505060a0612b318a828b01612a0d565b92505060c0612b428a828b01612a0d565b91505092959891949750929550565b60008060408385031215612b6857612b67612715565b5b6000612b7685828601612763565b9250506020612b8785828601612763565b9150509250929050565b612b9a81612963565b8114612ba557600080fd5b50565b600081359050612bb781612b91565b92915050565b60008060408385031215612bd457612bd3612715565b5b6000612be285828601612763565b9250506020612bf385828601612ba8565b9150509250929050565b612c0681612963565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612c3d81612c0c565b82525050565b604082016000820151612c596000850182612bfd565b506020820151612c6c6020850182612c34565b50505050565b6000604082019050612c876000830184612c43565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd457607f821691505b602082108103612ce757612ce6612c8d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d2782612778565b9150612d3283612778565b9250828201905080821115612d4a57612d49612ced565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612d86601f8361266e565b9150612d9182612d50565b602082019050919050565b60006020820190508181036000830152612db581612d79565b9050919050565b6000612dc782612778565b9150612dd283612778565b9250828203905081811115612dea57612de9612ced565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e7b60258361266e565b9150612e8682612e1f565b604082019050919050565b60006020820190508181036000830152612eaa81612e6e565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612ee7601d8361266e565b9150612ef282612eb1565b602082019050919050565b60006020820190508181036000830152612f1681612eda565b9050919050565b6000608082019050612f3260008301876128e2565b612f3f6020830186612939565b612f4c6040830185612824565b612f596060830184612824565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612f9860198361266e565b9150612fa382612f62565b602082019050919050565b60006020820190508181036000830152612fc781612f8b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613004601d8361266e565b915061300f82612fce565b602082019050919050565b6000602082019050818103600083015261303381612ff7565b9050919050565b600060c08201905061304f60008301896128e2565b61305c6020830188612939565b6130696040830187612939565b6130766060830186612824565b6130836080830185612824565b61309060a0830184612824565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006130d1601e8361266e565b91506130dc8261309b565b602082019050919050565b60006020820190508181036000830152613100816130c4565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b600061316360308361266e565b915061316e82613107565b604082019050919050565b6000602082019050818103600083015261319281613156565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006131cf601f8361266e565b91506131da82613199565b602082019050919050565b600060208201905081810360008301526131fe816131c2565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061326160278361266e565b915061326c82613205565b604082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006132f360268361266e565b91506132fe82613297565b604082019050919050565b60006020820190508181036000830152613322816132e6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061338560248361266e565b915061339082613329565b604082019050919050565b600060208201905081810360008301526133b481613378565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061341760228361266e565b9150613422826133bb565b604082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613483601d8361266e565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061351560258361266e565b9150613520826134b9565b604082019050919050565b6000602082019050818103600083015261354481613508565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006135a760238361266e565b91506135b28261354b565b604082019050919050565b600060208201905081810360008301526135d68161359a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061363960268361266e565b9150613644826135dd565b604082019050919050565b600060208201905081810360008301526136688161362c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136a560208361266e565b91506136b08261366f565b602082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b60006040820190506136f06000830185612824565b6136fd6020830184612824565b9392505050565b600060a08201905061371960008301886128e2565b61372660208301876128e2565b61373360408301866128e2565b6137406060830185612824565b61374d6080830184612939565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061379182612778565b915061379c83612778565b9250826137ac576137ab613757565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006137f86002836137b7565b9150613803826137c2565b600282019050919050565b6000819050919050565b613829613824826128d8565b61380e565b82525050565b600061383a826137eb565b91506138468285613818565b6020820191506138568284613818565b6020820191508190509392505050565b600060808201905061387b60008301876128e2565b61388860208301866128ae565b61389560408301856128e2565b6138a260608301846128e2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061391060188361266e565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061397c601f8361266e565b915061398782613946565b602082019050919050565b600060208201905081810360008301526139ab8161396f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0e60228361266e565b9150613a19826139b2565b604082019050919050565b60006020820190508181036000830152613a3d81613a01565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613aa060228361266e565b9150613aab82613a44565b604082019050919050565b60006020820190508181036000830152613acf81613a93565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b3260218361266e565b9150613b3d82613ad6565b604082019050919050565b60006020820190508181036000830152613b6181613b25565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc460228361266e565b9150613bcf82613b68565b604082019050919050565b60006020820190508181036000830152613bf381613bb7565b905091905056fea26469706673582212208cef1b9fdc7e68a76433516319a5957edfb8b21989789d9b16fd80e4cfe8088d64736f6c63430008110033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a457c2d711610097578063d1df306c11610071578063d1df306c146104c0578063d505accf146104dc578063dd62ed3e146104f8578063f1127ed81461052857610173565b8063a457c2d714610444578063a9059cbb14610474578063c3cda520146104a457610173565b806370a082311461034a57806379c650681461037a5780637ecebe00146103965780638e539e8c146103c657806395d89b41146103f65780639ab24eb01461041457610173565b80633644e515116101305780633644e51514610250578063395093511461026e5780633a46b1a81461029e578063587cde1e146102ce5780635c19a95c146102fe5780636fcfff451461031a57610173565b806306fdde0314610178578063095ea7b314610196578063096b34cf146101c657806318160ddd146101e457806323b872dd14610202578063313ce56714610232575b600080fd5b610180610558565b60405161018d91906126f3565b60405180910390f35b6101b060048036038101906101ab91906127ae565b6105ea565b6040516101bd9190612809565b60405180910390f35b6101ce61060d565b6040516101db9190612833565b60405180910390f35b6101ec610613565b6040516101f99190612833565b60405180910390f35b61021c6004803603810190610217919061284e565b61061d565b6040516102299190612809565b60405180910390f35b61023a61064c565b60405161024791906128bd565b60405180910390f35b610258610655565b60405161026591906128f1565b60405180910390f35b610288600480360381019061028391906127ae565b610664565b6040516102959190612809565b60405180910390f35b6102b860048036038101906102b391906127ae565b61069b565b6040516102c59190612833565b60405180910390f35b6102e860048036038101906102e3919061290c565b61072f565b6040516102f59190612948565b60405180910390f35b6103186004803603810190610313919061290c565b610798565b005b610334600480360381019061032f919061290c565b6107ac565b6040516103419190612982565b60405180910390f35b610364600480360381019061035f919061290c565b610800565b6040516103719190612833565b60405180910390f35b610394600480360381019061038f91906127ae565b610848565b005b6103b060048036038101906103ab919061290c565b610856565b6040516103bd9190612833565b60405180910390f35b6103e060048036038101906103db919061299d565b6108a6565b6040516103ed9190612833565b60405180910390f35b6103fe6108fc565b60405161040b91906126f3565b60405180910390f35b61042e6004803603810190610429919061290c565b61098e565b60405161043b9190612833565b60405180910390f35b61045e600480360381019061045991906127ae565b610a9f565b60405161046b9190612809565b60405180910390f35b61048e600480360381019061048991906127ae565b610b16565b60405161049b9190612809565b60405180910390f35b6104be60048036038101906104b99190612a22565b610b39565b005b6104da60048036038101906104d591906127ae565b610c3d565b005b6104f660048036038101906104f19190612aaf565b610c4b565b005b610512600480360381019061050d9190612b51565b610d8d565b60405161051f9190612833565b60405180910390f35b610542600480360381019061053d9190612bbd565b610e14565b60405161054f9190612c72565b60405180910390f35b60606003805461056790612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461059390612cbc565b80156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b5050505050905090565b6000806105f561122a565b9050610602818585611232565b600191505092915050565b600a5481565b6000600254905090565b60008061062861122a565b90506106358582856113fb565b610640858585611487565b60019150509392505050565b60006012905090565b600061065f611706565b905090565b60008061066f61122a565b90506106908185856106818589610d8d565b61068b9190612d1c565b611232565b600191505092915050565b60004382106106df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d690612d9c565b60405180910390fd5b610727600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611820565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6107a96107a361122a565b8261192c565b50565b60006107f9600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611191565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108528282611a46565b5050565b600061089f600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ae2565b9050919050565b60004382106108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190612d9c565b60405180910390fd5b6108f5600983611820565b9050919050565b60606004805461090b90612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461093790612cbc565b80156109845780601f1061095957610100808354040283529160200191610984565b820191906000526020600020905b81548152906001019060200180831161096757829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a7657600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610a2a9190612dbc565b81548110610a3b57610a3a612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a79565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610aaa61122a565b90506000610ab88286610d8d565b905083811015610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af490612e91565b60405180910390fd5b610b0a8286868403611232565b60019250505092915050565b600080610b2161122a565b9050610b2e818585611487565b600191505092915050565b83421115610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612efd565b60405180910390fd5b6000610bde610bd67fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610bbb9493929190612f1d565b60405160208183030381529060405280519060200120611af0565b858585611b0a565b9050610be981611b35565b8614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190612fae565b60405180910390fd5b610c34818861192c565b50505050505050565b610c478282611b93565b5050565b83421115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c859061301a565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610cbd8c611b35565b89604051602001610cd39695949392919061303a565b6040516020818303038152906040528051906020012090506000610cf682611af0565b90506000610d0682878787611b0a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906130e7565b60405180910390fd5b610d818a8a8a611232565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e1c612625565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610e7357610e72612df0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610f2e8282610fb1565b610f36611ba1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f5c610613565b1115610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613179565b60405180910390fd5b610fab600961111083611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611017906131e5565b60405180910390fd5b61102c60008383611e3d565b806002600082825461103e9190612d1c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110939190612d1c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110f89190612833565b60405180910390a361110c60008383611e42565b5050565b6000818361111e9190612d1c565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613277565b60405180910390fd5b819050919050565b600063ffffffff80168211156111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613309565b60405180910390fd5b819050919050565b6111ef83838361120f565b61120a6111fb8461072f565b6112048461072f565b83611eb7565b505050565b505050565b600081836112229190612dbc565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112989061339b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061342d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113ee9190612833565b60405180910390a3505050565b60006114078484610d8d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114815781811015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613499565b60405180910390fd5b6114808484848403611232565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed9061352b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c906135bd565b60405180910390fd5b611570838383611e3d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed9061364f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116899190612d1c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116ed9190612833565b60405180910390a3611700848484611e42565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561178257507f000000000000000000000000000000000000000000000000000000000000000046145b156117af577f0000000000000000000000000000000000000000000000000000000000000000905061181d565b61181a7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006120b0565b90505b90565b6000808380549050905060005b8181101561189f57600061184182846120ea565b90508486828154811061185757611856612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561188957809250611899565b6001816118969190612d1c565b91505b5061182d565b6000821461190157846001836118b59190612dbc565b815481106118c6576118c5612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611904565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006119378361072f565b9050600061194484610800565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611a40828483611eb7565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb906136bb565b60405180910390fd5b611ade8282610f24565b5050565b600081600001549050919050565b6000611b03611afd611706565b83612110565b9050919050565b6000806000611b1b87878787612143565b91509150611b288161224f565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b8281611ae2565b9150611b8d8161241b565b50919050565b611b9d8282612431565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611c335785600182611be79190612dbc565b81548110611bf857611bf7612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c36565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611c6483858763ffffffff16565b9150600081118015611cb757504386600183611c809190612dbc565b81548110611c9157611c90612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611d4457611cc582611126565b86600183611cd39190612dbc565b81548110611ce457611ce3612df0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611e34565b856040518060400160405280611d5943611191565b63ffffffff168152602001611d6d85611126565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611e4d8383836111e4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051611eaa9190612833565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ef35750600081115b156120ab57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fd157600080611f7a600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061121485611bc5565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611fc69291906136db565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120aa57600080612053600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061111085611bc5565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161209f9291906136db565b60405180910390a250505b5b505050565b600083838346306040516020016120cb959493929190613704565b6040516020818303038152906040528051906020012090509392505050565b600060028284186120fb9190613786565b8284166121089190612d1c565b905092915050565b6000828260405160200161212592919061382f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561217e576000600391509150612246565b601b8560ff16141580156121965750601c8560ff1614155b156121a8576000600491509150612246565b6000600187878787604051600081526020016040526040516121cd9493929190613866565b6020604051602081039080840390855afa1580156121ef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223d57600060019250925050612246565b80600092509250505b94509492505050565b60006004811115612263576122626138ab565b5b816004811115612276576122756138ab565b5b031561241857600160048111156122905761228f6138ab565b5b8160048111156122a3576122a26138ab565b5b036122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613926565b60405180910390fd5b600260048111156122f7576122f66138ab565b5b81600481111561230a576123096138ab565b5b0361234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190613992565b60405180910390fd5b6003600481111561235e5761235d6138ab565b5b816004811115612371576123706138ab565b5b036123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890613a24565b60405180910390fd5b6004808111156123c4576123c36138ab565b5b8160048111156123d7576123d66138ab565b5b03612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90613ab6565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61243b828261244f565b612449600961121483611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590613b48565b60405180910390fd5b6124ca82600083611e3d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254790613bda565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546125a79190612dbc565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161260c9190612833565b60405180910390a361262083600084611e42565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561269d578082015181840152602081019050612682565b60008484015250505050565b6000601f19601f8301169050919050565b60006126c582612663565b6126cf818561266e565b93506126df81856020860161267f565b6126e8816126a9565b840191505092915050565b6000602082019050818103600083015261270d81846126ba565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127458261271a565b9050919050565b6127558161273a565b811461276057600080fd5b50565b6000813590506127728161274c565b92915050565b6000819050919050565b61278b81612778565b811461279657600080fd5b50565b6000813590506127a881612782565b92915050565b600080604083850312156127c5576127c4612715565b5b60006127d385828601612763565b92505060206127e485828601612799565b9150509250929050565b60008115159050919050565b612803816127ee565b82525050565b600060208201905061281e60008301846127fa565b92915050565b61282d81612778565b82525050565b60006020820190506128486000830184612824565b92915050565b60008060006060848603121561286757612866612715565b5b600061287586828701612763565b935050602061288686828701612763565b925050604061289786828701612799565b9150509250925092565b600060ff82169050919050565b6128b7816128a1565b82525050565b60006020820190506128d260008301846128ae565b92915050565b6000819050919050565b6128eb816128d8565b82525050565b600060208201905061290660008301846128e2565b92915050565b60006020828403121561292257612921612715565b5b600061293084828501612763565b91505092915050565b6129428161273a565b82525050565b600060208201905061295d6000830184612939565b92915050565b600063ffffffff82169050919050565b61297c81612963565b82525050565b60006020820190506129976000830184612973565b92915050565b6000602082840312156129b3576129b2612715565b5b60006129c184828501612799565b91505092915050565b6129d3816128a1565b81146129de57600080fd5b50565b6000813590506129f0816129ca565b92915050565b6129ff816128d8565b8114612a0a57600080fd5b50565b600081359050612a1c816129f6565b92915050565b60008060008060008060c08789031215612a3f57612a3e612715565b5b6000612a4d89828a01612763565b9650506020612a5e89828a01612799565b9550506040612a6f89828a01612799565b9450506060612a8089828a016129e1565b9350506080612a9189828a01612a0d565b92505060a0612aa289828a01612a0d565b9150509295509295509295565b600080600080600080600060e0888a031215612ace57612acd612715565b5b6000612adc8a828b01612763565b9750506020612aed8a828b01612763565b9650506040612afe8a828b01612799565b9550506060612b0f8a828b01612799565b9450506080612b208a828b016129e1565b93505060a0612b318a828b01612a0d565b92505060c0612b428a828b01612a0d565b91505092959891949750929550565b60008060408385031215612b6857612b67612715565b5b6000612b7685828601612763565b9250506020612b8785828601612763565b9150509250929050565b612b9a81612963565b8114612ba557600080fd5b50565b600081359050612bb781612b91565b92915050565b60008060408385031215612bd457612bd3612715565b5b6000612be285828601612763565b9250506020612bf385828601612ba8565b9150509250929050565b612c0681612963565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612c3d81612c0c565b82525050565b604082016000820151612c596000850182612bfd565b506020820151612c6c6020850182612c34565b50505050565b6000604082019050612c876000830184612c43565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd457607f821691505b602082108103612ce757612ce6612c8d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d2782612778565b9150612d3283612778565b9250828201905080821115612d4a57612d49612ced565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612d86601f8361266e565b9150612d9182612d50565b602082019050919050565b60006020820190508181036000830152612db581612d79565b9050919050565b6000612dc782612778565b9150612dd283612778565b9250828203905081811115612dea57612de9612ced565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e7b60258361266e565b9150612e8682612e1f565b604082019050919050565b60006020820190508181036000830152612eaa81612e6e565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612ee7601d8361266e565b9150612ef282612eb1565b602082019050919050565b60006020820190508181036000830152612f1681612eda565b9050919050565b6000608082019050612f3260008301876128e2565b612f3f6020830186612939565b612f4c6040830185612824565b612f596060830184612824565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612f9860198361266e565b9150612fa382612f62565b602082019050919050565b60006020820190508181036000830152612fc781612f8b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613004601d8361266e565b915061300f82612fce565b602082019050919050565b6000602082019050818103600083015261303381612ff7565b9050919050565b600060c08201905061304f60008301896128e2565b61305c6020830188612939565b6130696040830187612939565b6130766060830186612824565b6130836080830185612824565b61309060a0830184612824565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006130d1601e8361266e565b91506130dc8261309b565b602082019050919050565b60006020820190508181036000830152613100816130c4565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b600061316360308361266e565b915061316e82613107565b604082019050919050565b6000602082019050818103600083015261319281613156565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006131cf601f8361266e565b91506131da82613199565b602082019050919050565b600060208201905081810360008301526131fe816131c2565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061326160278361266e565b915061326c82613205565b604082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006132f360268361266e565b91506132fe82613297565b604082019050919050565b60006020820190508181036000830152613322816132e6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061338560248361266e565b915061339082613329565b604082019050919050565b600060208201905081810360008301526133b481613378565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061341760228361266e565b9150613422826133bb565b604082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613483601d8361266e565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061351560258361266e565b9150613520826134b9565b604082019050919050565b6000602082019050818103600083015261354481613508565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006135a760238361266e565b91506135b28261354b565b604082019050919050565b600060208201905081810360008301526135d68161359a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061363960268361266e565b9150613644826135dd565b604082019050919050565b600060208201905081810360008301526136688161362c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136a560208361266e565b91506136b08261366f565b602082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b60006040820190506136f06000830185612824565b6136fd6020830184612824565b9392505050565b600060a08201905061371960008301886128e2565b61372660208301876128e2565b61373360408301866128e2565b6137406060830185612824565b61374d6080830184612939565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061379182612778565b915061379c83612778565b9250826137ac576137ab613757565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006137f86002836137b7565b9150613803826137c2565b600282019050919050565b6000819050919050565b613829613824826128d8565b61380e565b82525050565b600061383a826137eb565b91506138468285613818565b6020820191506138568284613818565b6020820191508190509392505050565b600060808201905061387b60008301876128e2565b61388860208301866128ae565b61389560408301856128e2565b6138a260608301846128e2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061391060188361266e565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061397c601f8361266e565b915061398782613946565b602082019050919050565b600060208201905081810360008301526139ab8161396f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0e60228361266e565b9150613a19826139b2565b604082019050919050565b60006020820190508181036000830152613a3d81613a01565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613aa060228361266e565b9150613aab82613a44565b604082019050919050565b60006020820190508181036000830152613acf81613a93565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b3260218361266e565b9150613b3d82613ad6565b604082019050919050565b60006020820190508181036000830152613b6181613b25565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc460228361266e565b9150613bcf82613b68565b604082019050919050565b60006020820190508181036000830152613bf381613bb7565b905091905056fea26469706673582212208cef1b9fdc7e68a76433516319a5957edfb8b21989789d9b16fd80e4cfe8088d64736f6c63430008110033", diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json new file mode 100644 index 0000000..b65489c --- /dev/null +++ b/deployments/localhost/GovernerContract.json @@ -0,0 +1,1811 @@ +{ + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IVotes", + "name": "_token", + "type": "address" + }, + { + "internalType": "contract TimelockController", + "name": "_timelock", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_votingDelay", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_votingPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_quorumPercentage", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "Empty", + "type": "error" + }, + { + "inputs": [], + "name": "GovernerContract__NotApporovedByDaoFoundation", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "string[]", + "name": "signatures", + "type": "string[]" + }, + { + "indexed": false, + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "startBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "endBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "ProposalExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "eta", + "type": "uint256" + } + ], + "name": "ProposalQueued", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldProposalThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "ProposalThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldQuorumNumerator", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "QuorumNumeratorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldTimelock", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newTimelock", + "type": "address" + } + ], + "name": "TimelockChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "VoteCast", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "voter", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "VoteCastWithParams", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingDelay", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingDelay", + "type": "uint256" + } + ], + "name": "VotingDelaySet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldVotingPeriod", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newVotingPeriod", + "type": "uint256" + } + ], + "name": "VotingPeriodSet", + "type": "event" + }, + { + "inputs": [], + "name": "BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "COUNTING_MODE", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "EXTENDED_BALLOT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + } + ], + "name": "castVote", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "castVoteWithReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "castVoteWithReasonAndParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteWithReasonAndParamsBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "getVotesWithParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasVoted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "hashProposal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "inWhiteList", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalDeadline", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalEta", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalSnapshot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "proposalVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "againstVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "forVotes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "abstainVotes", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "propose", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "queue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "quorum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumDenominator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "quorumNumerator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "relay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newProposalThreshold", + "type": "uint256" + } + ], + "name": "setProposalThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newVotingDelay", + "type": "uint256" + } + ], + "name": "setVotingDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newVotingPeriod", + "type": "uint256" + } + ], + "name": "setVotingPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + } + ], + "name": "state", + "outputs": [ + { + "internalType": "enum IGovernor.ProposalState", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timelock", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IVotes", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newQuorumNumerator", + "type": "uint256" + } + ], + "name": "updateQuorumNumerator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract TimelockController", + "name": "newTimelock", + "type": "address" + } + ], + "name": "updateTimelock", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "votingPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "transactionIndex": 0, + "gasUsed": "6161333", + "logsBloom": "0x00000000000000000100000000001000000000000000000000000000000008000000000000000000000000000010000000000000000040200000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000080002000000000000000000000000000000000000000000001000002000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000001000000000080000800000000000000000000000000000000000000000000000000000400000000000002000", + "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d", + "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logIndex": 0, + "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8", + "logIndex": 1, + "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logIndex": 2, + "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0x0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logIndex": 3, + "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + }, + { + "transactionIndex": 0, + "blockNumber": 3, + "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "topics": [ + "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f0512", + "logIndex": 4, + "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + } + ], + "blockNumber": 3, + "cumulativeGasUsed": "6161333", + "status": 1, + "byzantium": true + }, + "args": [ + "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + 0, + 200, + 0 + ], + "numDeployments": 1, + "solcInputHash": "c3bd0fff8e093c1104055db0ec135b98", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NotApporovedByDaoFoundation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"inWhiteList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl\\n{\\n error GovernerContract__NotApporovedByDaoFoundation();\\n\\n mapping(address => bool) public inWhiteList;\\n\\n modifier isApporovedByDaoFoundation() {\\n if (!inWhiteList[msg.sender])\\n revert GovernerContract__NotApporovedByDaoFoundation();\\n _;\\n }\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x9c54ad803a57f8d4b6b3c7cdcf26172e7c2d820ac9935e9684dc12146ef81c9d\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101606040523480156200001257600080fd5b5060405162007ea938038062007ea9833981810160405281019062000038919062000af1565b838186858560006040518060400160405280601081526020017f476f7665726e6572436f6e7472616374000000000000000000000000000000008152508062000086620001e660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000ef8184846200022360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000149919062000de9565b50506200015c836200025f60201b60201c565b6200016d82620002a660201b60201c565b6200017e816200033360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001c8816200037a60201b60201c565b50620001da816200055960201b60201c565b505050505050620012f4565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200024095949392919062000f0d565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516200029492919062000f6a565b60405180910390a18060048190555050565b60008111620002ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e3906200101e565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600554826040516200032192919062000f6a565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516200036892919062000f6a565b60405180910390a18060068190555050565b6200038a620005fa60201b60201c565b811115620003cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c690620010dc565b60405180910390fd5b6000620003e16200060360201b60201c565b905060008114158015620003fd57506000600960000180549050145b15620004fd5760096000016040518060400160405280600063ffffffff16815260200162000436846200063b60201b62001e961760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000518826009620006a960201b62001f011790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200054d92919062000f6a565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ae929190620010fe565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006064905090565b6000806009600001805490501462000632576200062c6009620008e760201b620021031760201c565b62000636565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620006a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069890620011a1565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620006cb86620008e760201b60201c565b90506000821180156200072757504386600001600184620006ed9190620011f2565b815481106200070157620007006200122d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620007cb5762000743856200063b60201b62001e961760201c565b86600001600184620007569190620011f2565b815481106200076a57620007696200122d565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620008d8565b856000016040518060400160405280620007f0436200098960201b6200219e1760201c565b63ffffffff16815260200162000811886200063b60201b62001e961760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114620009605782600001600182620009109190620011f2565b815481106200092457620009236200122d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000963565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115620009d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009ce90620012d2565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a1182620009e4565b9050919050565b600062000a258262000a04565b9050919050565b62000a378162000a18565b811462000a4357600080fd5b50565b60008151905062000a578162000a2c565b92915050565b600062000a6a82620009e4565b9050919050565b600062000a7e8262000a5d565b9050919050565b62000a908162000a71565b811462000a9c57600080fd5b50565b60008151905062000ab08162000a85565b92915050565b6000819050919050565b62000acb8162000ab6565b811462000ad757600080fd5b50565b60008151905062000aeb8162000ac0565b92915050565b600080600080600060a0868803121562000b105762000b0f620009df565b5b600062000b208882890162000a46565b955050602062000b338882890162000a9f565b945050604062000b468882890162000ada565b935050606062000b598882890162000ada565b925050608062000b6c8882890162000ada565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bfb57607f821691505b60208210810362000c115762000c1062000bb3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c3c565b62000c87868362000c3c565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000cca62000cc462000cbe8462000ab6565b62000c9f565b62000ab6565b9050919050565b6000819050919050565b62000ce68362000ca9565b62000cfe62000cf58262000cd1565b84845462000c49565b825550505050565b600090565b62000d1562000d06565b62000d2281848462000cdb565b505050565b5b8181101562000d4a5762000d3e60008262000d0b565b60018101905062000d28565b5050565b601f82111562000d995762000d638162000c17565b62000d6e8462000c2c565b8101602085101562000d7e578190505b62000d9662000d8d8562000c2c565b83018262000d27565b50505b505050565b600082821c905092915050565b600062000dbe6000198460080262000d9e565b1980831691505092915050565b600062000dd9838362000dab565b9150826002028217905092915050565b62000df48262000b79565b67ffffffffffffffff81111562000e105762000e0f62000b84565b5b62000e1c825462000be2565b62000e2982828562000d4e565b600060209050601f83116001811462000e61576000841562000e4c578287015190505b62000e58858262000dcb565b86555062000ec8565b601f19841662000e718662000c17565b60005b8281101562000e9b5784890151825560018201915060208501945060208101905062000e74565b8683101562000ebb578489015162000eb7601f89168262000dab565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000ee58162000ed0565b82525050565b62000ef68162000ab6565b82525050565b62000f078162000a04565b82525050565b600060a08201905062000f24600083018862000eda565b62000f33602083018762000eda565b62000f42604083018662000eda565b62000f51606083018562000eeb565b62000f60608083018462000efc565b9695505050505050565b600060408201905062000f81600083018562000eeb565b62000f90602083018462000eeb565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200100660278362000f97565b9150620010138262000fa8565b604082019050919050565b60006020820190508181036000830152620010398162000ff7565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620010c460438362000f97565b9150620010d18262001040565b606082019050919050565b60006020820190508181036000830152620010f781620010b5565b9050919050565b600060408201905062001115600083018562000efc565b62001124602083018462000efc565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200118960278362000f97565b915062001196826200112b565b604082019050919050565b60006020820190508181036000830152620011bc816200117a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011ff8262000ab6565b91506200120c8362000ab6565b9250828203905081811115620012275762001226620011c3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620012ba60268362000f97565b9150620012c7826200125c565b604082019050919050565b60006020820190508181036000830152620012ed81620012ab565b9050919050565b60805160a05160c05160e051610100516101205161014051616b4c6200135d60003960008181611e7401528181612f4a01526131be01526000613484015260006134c6015260006134a5015260006133da01526000613430015260006134590152616b4c6000f3fe6080604052600436106102555760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf14610a13578063eb9019d414610a3c578063ece40cc114610a79578063f23a6e6114610aa2578063f8ce560a14610adf578063fc0c546a14610b1c5761029b565b8063c28bc2fa1461092c578063c59057e414610955578063d33219b414610992578063dd4e2ba5146109bd578063deaaa7cc146109e85761029b565b8063a890c910116100fd578063a890c91014610821578063ab58fb8e1461084a578063b58131b014610887578063bc197c81146108b2578063c01f9e37146108ef5761029b565b80637b3c71d3146107145780637d5e81e21461075157806397c3d3341461078e5780639a802a6d146107b9578063a7713a70146107f65761029b565b80633932abb1116101d257806354fd4d501161019657806354fd4d50146105cc57806356781388146105f75780635f398a141461063457806360c4247f1461067157806369e0e346146106ae57806370b0f660146106eb5761029b565b80633932abb1146104ab5780633bccf4fd146104d65780633e4f49e6146105135780634385963214610550578063544ffc9c1461058d5761029b565b8063150b7a0211610219578063150b7a0214610399578063160cbed7146103d65780632656227d146104135780632d63f693146104435780632fe3e261146104805761029b565b806301ffc9a7146102a057806302a251a3146102dd578063034201811461030857806306f3f9e61461034557806306fdde031461036e5761029b565b3661029b573073ffffffffffffffffffffffffffffffffffffffff16610279610b47565b73ffffffffffffffffffffffffffffffffffffffff161461029957600080fd5b005b600080fd5b3480156102ac57600080fd5b506102c760048036038101906102c291906140c9565b610b56565b6040516102d49190614111565b60405180910390f35b3480156102e957600080fd5b506102f2610b68565b6040516102ff9190614145565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906143a1565b610b77565b60405161033c9190614145565b60405180910390f35b34801561035157600080fd5b5061036c6004803603810190610367919061447f565b610c5c565b005b34801561037a57600080fd5b50610383610d53565b604051610390919061452b565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb91906145ab565b610de5565b6040516103cd919061463d565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f891906148bf565b610df9565b60405161040a9190614145565b60405180910390f35b61042d600480360381019061042891906148bf565b6110b3565b60405161043a9190614145565b60405180910390f35b34801561044f57600080fd5b5061046a6004803603810190610465919061447f565b611200565b6040516104779190614145565b60405180910390f35b34801561048c57600080fd5b5061049561126e565b6040516104a29190614989565b60405180910390f35b3480156104b757600080fd5b506104c0611292565b6040516104cd9190614145565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906149a4565b6112a1565b60405161050a9190614145565b60405180910390f35b34801561051f57600080fd5b5061053a6004803603810190610535919061447f565b61132b565b6040516105479190614a96565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190614ab1565b61133d565b6040516105849190614111565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af919061447f565b6113a8565b6040516105c393929190614af1565b60405180910390f35b3480156105d857600080fd5b506105e16113e0565b6040516105ee919061452b565b60405180910390f35b34801561060357600080fd5b5061061e60048036038101906106199190614b28565b61141d565b60405161062b9190614145565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190614b68565b61144e565b6040516106689190614145565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061447f565b6114b8565b6040516106a59190614145565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d09190614c0c565b611604565b6040516106e29190614111565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d919061447f565b611624565b005b34801561072057600080fd5b5061073b60048036038101906107369190614c39565b61171b565b6040516107489190614145565b60405180910390f35b34801561075d57600080fd5b5061077860048036038101906107739190614d4e565b611783565b6040516107859190614145565b60405180910390f35b34801561079a57600080fd5b506107a361179b565b6040516107b09190614145565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db9190614e25565b6117a4565b6040516107ed9190614145565b60405180910390f35b34801561080257600080fd5b5061080b6117ba565b6040516108189190614145565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190614ee4565b6117e3565b005b34801561085657600080fd5b50610871600480360381019061086c919061447f565b6118da565b60405161087e9190614145565b60405180910390f35b34801561089357600080fd5b5061089c6119a7565b6040516108a99190614145565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190614f11565b6119b6565b6040516108e6919061463d565b60405180910390f35b3480156108fb57600080fd5b506109166004803603810190610911919061447f565b6119cb565b6040516109239190614145565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190615036565b611a39565b005b34801561096157600080fd5b5061097c600480360381019061097791906148bf565b611b7a565b6040516109899190614145565b60405180910390f35b34801561099e57600080fd5b506109a7611bb6565b6040516109b491906150b9565b60405180910390f35b3480156109c957600080fd5b506109d2611be0565b6040516109df919061452b565b60405180910390f35b3480156109f457600080fd5b506109fd611c1d565b604051610a0a9190614989565b60405180910390f35b348015610a1f57600080fd5b50610a3a6004803603810190610a35919061447f565b611c41565b005b348015610a4857600080fd5b50610a636004803603810190610a5e91906150d4565b611d38565b604051610a709190614145565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b919061447f565b611d54565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190615114565b611e4b565b604051610ad6919061463d565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b01919061447f565b611e60565b604051610b139190614145565b60405180910390f35b348015610b2857600080fd5b50610b31611e72565b604051610b3e919061520a565b60405180910390f35b6000610b516121f1565b905090565b6000610b618261221b565b9050919050565b6000610b72612295565b905090565b600080610bfa610bf27fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610bb3929190615255565b60405180910390208b80519060200120604051602001610bd795949392919061527d565b6040516020818303038152906040528051906020012061229f565b8686866122b9565b9050610c4d8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a6122e4565b91505098975050505050505050565b610c64610b47565b73ffffffffffffffffffffffffffffffffffffffff16610c826124a0565b73ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf9061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16610cf7610b47565b73ffffffffffffffffffffffffffffffffffffffff1614610d47576000610d1c6124a8565b604051610d2a929190615255565b604051809103902090505b80610d4060026124b5565b03610d3557505b610d5081612591565b50565b606060008054610d629061536b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8e9061536b565b8015610ddb5780601f10610db057610100808354040283529160200191610ddb565b820191906000526020600020905b815481529060010190602001808311610dbe57829003601f168201915b5050505050905090565b600063150b7a0260e01b9050949350505050565b600080610e0886868686611b7a565b905060046007811115610e1e57610e1d614a1f565b5b610e278261132b565b6007811115610e3957610e38614a1f565b5b14610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e709061540e565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190615443565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610f7295949392919061574b565b602060405180830381865afa158015610f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb391906157c8565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611030969594939291906157f5565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611090919061589a565b60405161109e9291906158ce565b60405180910390a18192505050949350505050565b6000806110c286868686611b7a565b905060006110cf8261132b565b9050600460078111156110e5576110e4614a1f565b5b8160078111156110f8576110f7614a1f565b5b148061112857506005600781111561111357611112614a1f565b5b81600781111561112657611125614a1f565b5b145b611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e9061540e565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516111c49190614145565b60405180910390a16111d98288888888612745565b6111e68288888888612828565b6111f3828888888861283c565b8192505050949350505050565b600061125d600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b600061129c6128a5565b905090565b6000806113026112fa7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f89896040516020016112df939291906158f7565b6040516020818303038152906040528051906020012061229f565b8686866122b9565b905061131f878288604051806020016040528060008152506128af565b91505095945050505050565b6000611336826128cf565b9050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806114286124a0565b9050611445848285604051806020016040528060008152506128af565b91505092915050565b6000806114596124a0565b90506114ac87828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876122e4565b91505095945050505050565b6000806009600001805490509050600081036114d9576008549150506115ff565b600060096000016001836114ed919061592e565b815481106114fe576114fd615962565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff16116115e65780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506115ff565b6115fa846009612aa290919063ffffffff16565b925050505b919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b61162c610b47565b73ffffffffffffffffffffffffffffffffffffffff1661164a6124a0565b73ffffffffffffffffffffffffffffffffffffffff16146116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166116bf610b47565b73ffffffffffffffffffffffffffffffffffffffff161461170f5760006116e46124a8565b6040516116f2929190615255565b604051809103902090505b8061170860026124b5565b036116fd57505b61171881612bfa565b50565b6000806117266124a0565b905061177886828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128af565b915050949350505050565b600061179185858585612c3f565b9050949350505050565b60006064905090565b60006117b1848484612f46565b90509392505050565b600080600960000180549050146117da576117d56009612103565b6117de565b6008545b905090565b6117eb610b47565b73ffffffffffffffffffffffffffffffffffffffff166118096124a0565b73ffffffffffffffffffffffffffffffffffffffff161461185f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118569061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661187e610b47565b73ffffffffffffffffffffffffffffffffffffffff16146118ce5760006118a36124a8565b6040516118b1929190615255565b604051809103902090505b806118c760026124b5565b036118bc57505b6118d781612fed565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b815260040161194b9190614989565b602060405180830381865afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190615443565b90506001811461199c578061199f565b60005b915050919050565b60006119b161308c565b905090565b600063bc197c8160e01b905095945050505050565b6000611a28600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff169050919050565b611a41610b47565b73ffffffffffffffffffffffffffffffffffffffff16611a5f6124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac9061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611ad4610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611b24576000611af96124a8565b604051611b07929190615255565b604051809103902090505b80611b1d60026124b5565b03611b1257505b611b738483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085613096565b5050505050565b600084848484604051602001611b939493929190615991565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b611c49610b47565b73ffffffffffffffffffffffffffffffffffffffff16611c676124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb49061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611cdc610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576000611d016124a8565b604051611d0f929190615255565b604051809103902090505b80611d2560026124b5565b03611d1a57505b611d35816130c5565b50565b6000611d4c8383611d4761314d565b612f46565b905092915050565b611d5c610b47565b73ffffffffffffffffffffffffffffffffffffffff16611d7a6124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc79061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611def610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611e3f576000611e146124a8565b604051611e22929190615255565b604051809103902090505b80611e3860026124b5565b03611e2d57505b611e4881613164565b50565b600063f23a6e6160e01b905095945050505050565b6000611e6b826131a9565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090615a5d565b60405180910390fd5b819050919050565b6000806000846000018054905090506000611f1b86612103565b9050600082118015611f7157504386600001600184611f3a919061592e565b81548110611f4b57611f4a615962565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1561200157611f7f85611e96565b86600001600184611f90919061592e565b81548110611fa157611fa0615962565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506120f4565b8560000160405180604001604052806120194361219e565b63ffffffff16815260200161202d88611e96565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b60008082600001805490509050600081146121755782600001600182612129919061592e565b8154811061213a57612139615962565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612178565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090615aef565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061228e575061228d82613271565b5b9050919050565b6000600554905090565b60006122b26122ac6133d6565b836134f0565b9050919050565b60008060006122ca87878787613523565b915091506122d78161362f565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156123105761230f614a1f565b5b6123198861132b565b600781111561232b5761232a614a1f565b5b1461236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290615b81565b60405180910390fd5b60006123ca876123ba846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff1686612f46565b90506123d988888884886137fb565b600084510361243b578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48988848960405161242e9493929190615ba1565b60405180910390a2612492565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612489959493929190615c37565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b60006124c0826139ff565b156124f7576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b61259961179b565b8111156125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290615d30565b60405180910390fd5b60006125e56117ba565b90506000811415801561260057506000600960000180549050145b156126f25760096000016040518060400160405280600063ffffffff16815260200161262b84611e96565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b612706826009611f0190919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516127399291906158ce565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16612764610b47565b73ffffffffffffffffffffffffffffffffffffffff16146128215760005b845181101561281f573073ffffffffffffffffffffffffffffffffffffffff168582815181106127b5576127b4615962565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361280e5761280d8382815181106127ee576127ed615962565b5b6020026020010151805190602001206002613a3490919063ffffffff16565b5b8061281890615d50565b9050612782565b505b5050505050565b6128358585858585613ab0565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661285b610b47565b73ffffffffffffffffffffffffffffffffffffffff16146128905761288060026139ff565b61288f5761288e6002613b4e565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006128c5858585856128c061314d565b6122e4565b9050949350505050565b6000806128db83613bcf565b9050600460078111156128f1576128f0614a1f565b5b81600781111561290457612903614a1f565b5b146129125780915050612a9d565b6000600b60008581526020019081526020016000205490506000801b810361293e578192505050612a9d565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016129999190614989565b602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190615dc4565b156129ea57600792505050612a9d565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b8152600401612a459190614989565b602060405180830381865afa158015612a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a869190615dc4565b15612a9657600592505050612a9d565b6002925050505b919050565b6000438210612ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612add90615e3d565b60405180910390fd5b60008360000180549050905060005b81811015612b6a576000612b098284613ce3565b905084866000018281548110612b2257612b21615962565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612b5457809250612b64565b600181612b61919061589a565b91505b50612af5565b60008214612bcf5784600001600183612b83919061592e565b81548110612b9457612b93615962565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612bd2565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051612c2d9291906158ce565b60405180910390a18060048190555050565b6000612c496119a7565b612c66612c546124a0565b600143612c61919061592e565b611d38565b1015612ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9e90615ecf565b60405180910390fd5b6000612cbc8686868680519060200120611b7a565b90508451865114612d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf990615f61565b60405180910390fd5b8351865114612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d90615f61565b60405180910390fd5b6000865111612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8190615fcd565b60405180910390fd5b6000600160008381526020019081526020016000209050612dea816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613d09565b612e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e209061605f565b60405180910390fd5b6000612e3b612e36611292565b613d23565b612e4443613d23565b612e4e9190616093565b90506000612e62612e5d610b68565b613d23565b82612e6d9190616093565b9050612e858284600001613d7a90919063ffffffff16565b612e9b8184600101613d7a90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084612ec56124a0565b8b8b8d5167ffffffffffffffff811115612ee257612ee1614240565b5b604051908082528060200260200182016040528015612f1557816020015b6060815260200190600190039081612f005790505b508c88888e604051612f2f9998979695949392919061620c565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612fa39291906162bc565b602060405180830381865afa158015612fc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe49190615443565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516130409291906162e5565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606130bc848484604051806060016040528060298152602001616aee60299139613da9565b90509392505050565b60008111613108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff90616380565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405161313b9291906158ce565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516131979291906158ce565b60405180910390a18060068190555050565b60006131b361179b565b6131bc836114b8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016132159190614145565b602060405180830381865afa158015613232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132569190615443565b61326091906163a0565b61326a9190616411565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061335757507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133bf57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133cf57506133ce82613ebd565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561345257507f000000000000000000000000000000000000000000000000000000000000000046145b1561347f577f000000000000000000000000000000000000000000000000000000000000000090506134ed565b6134ea7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613f27565b90505b90565b600082826040516020016135059291906164ba565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561355e576000600391509150613626565b601b8560ff16141580156135765750601c8560ff1614155b15613588576000600491509150613626565b6000600187878787604051600081526020016040526040516135ad94939291906164f1565b6020604051602081039080840390855afa1580156135cf573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361361d57600060019250925050613626565b80600092509250505b94509492505050565b6000600481111561364357613642614a1f565b5b81600481111561365657613655614a1f565b5b03156137f857600160048111156136705761366f614a1f565b5b81600481111561368357613682614a1f565b5b036136c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ba90616582565b60405180910390fd5b600260048111156136d7576136d6614a1f565b5b8160048111156136ea576136e9614a1f565b5b0361372a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613721906165ee565b60405180910390fd5b6003600481111561373e5761373d614a1f565b5b81600481111561375157613750614a1f565b5b03613791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378890616680565b60405180910390fd5b6004808111156137a4576137a3614a1f565b5b8160048111156137b7576137b6614a1f565b5b036137f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ee90616712565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156138a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613898906167a4565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561390f5761390e614a1f565b5b60ff168460ff160361393b578281600001600082825461392f919061589a565b925050819055506139f7565b6001600281111561394f5761394e614a1f565b5b60ff168460ff160361397b578281600101600082825461396f919061589a565b925050819055506139f6565b60028081111561398e5761398d614a1f565b5b60ff168460ff16036139ba57828160020160008282546139ae919061589a565b925050819055506139f5565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ec90616836565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401613b1595949392919061574b565b6000604051808303818588803b158015613b2e57600080fd5b505af1158015613b42573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615613c08576007915050613cde565b8060020160019054906101000a900460ff1615613c29576002915050613cde565b6000613c3484611200565b905060008103613c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c70906168a2565b60405180910390fd5b438110613c8b57600092505050613cde565b6000613c96856119cb565b9050438110613cab5760019350505050613cde565b613cb485613f61565b8015613cc55750613cc485613fa8565b5b15613cd65760049350505050613cde565b600393505050505b919050565b60006002828418613cf49190616411565b828416613d01919061589a565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115613d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d6990616934565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015613dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613de5906169c6565b60405180910390fd5b613df785613fd3565b613e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e2d90616a32565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e5f9190616a83565b60006040518083038185875af1925050503d8060008114613e9c576040519150601f19603f3d011682016040523d82523d6000602084013e613ea1565b606091505b5091509150613eb1828286613ff6565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001613f42959493929190616a9a565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154613f8d919061589a565b613f9e613f9985611200565b611e60565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561400657829050614056565b6000835111156140195782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404d919061452b565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6140a681614071565b81146140b157600080fd5b50565b6000813590506140c38161409d565b92915050565b6000602082840312156140df576140de614067565b5b60006140ed848285016140b4565b91505092915050565b60008115159050919050565b61410b816140f6565b82525050565b60006020820190506141266000830184614102565b92915050565b6000819050919050565b61413f8161412c565b82525050565b600060208201905061415a6000830184614136565b92915050565b6141698161412c565b811461417457600080fd5b50565b60008135905061418681614160565b92915050565b600060ff82169050919050565b6141a28161418c565b81146141ad57600080fd5b50565b6000813590506141bf81614199565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126141ea576141e96141c5565b5b8235905067ffffffffffffffff811115614207576142066141ca565b5b602083019150836001820283011115614223576142226141cf565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142788261422f565b810181811067ffffffffffffffff8211171561429757614296614240565b5b80604052505050565b60006142aa61405d565b90506142b6828261426f565b919050565b600067ffffffffffffffff8211156142d6576142d5614240565b5b6142df8261422f565b9050602081019050919050565b82818337600083830152505050565b600061430e614309846142bb565b6142a0565b90508281526020810184848401111561432a5761432961422a565b5b6143358482856142ec565b509392505050565b600082601f830112614352576143516141c5565b5b81356143628482602086016142fb565b91505092915050565b6000819050919050565b61437e8161436b565b811461438957600080fd5b50565b60008135905061439b81614375565b92915050565b60008060008060008060008060e0898b0312156143c1576143c0614067565b5b60006143cf8b828c01614177565b98505060206143e08b828c016141b0565b975050604089013567ffffffffffffffff8111156144015761440061406c565b5b61440d8b828c016141d4565b9650965050606089013567ffffffffffffffff8111156144305761442f61406c565b5b61443c8b828c0161433d565b945050608061444d8b828c016141b0565b93505060a061445e8b828c0161438c565b92505060c061446f8b828c0161438c565b9150509295985092959890939650565b60006020828403121561449557614494614067565b5b60006144a384828501614177565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156144e65780820151818401526020810190506144cb565b60008484015250505050565b60006144fd826144ac565b61450781856144b7565b93506145178185602086016144c8565b6145208161422f565b840191505092915050565b6000602082019050818103600083015261454581846144f2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145788261454d565b9050919050565b6145888161456d565b811461459357600080fd5b50565b6000813590506145a58161457f565b92915050565b600080600080608085870312156145c5576145c4614067565b5b60006145d387828801614596565b94505060206145e487828801614596565b93505060406145f587828801614177565b925050606085013567ffffffffffffffff8111156146165761461561406c565b5b6146228782880161433d565b91505092959194509250565b61463781614071565b82525050565b6000602082019050614652600083018461462e565b92915050565b600067ffffffffffffffff82111561467357614672614240565b5b602082029050602081019050919050565b600061469761469284614658565b6142a0565b905080838252602082019050602084028301858111156146ba576146b96141cf565b5b835b818110156146e357806146cf8882614596565b8452602084019350506020810190506146bc565b5050509392505050565b600082601f830112614702576147016141c5565b5b8135614712848260208601614684565b91505092915050565b600067ffffffffffffffff82111561473657614735614240565b5b602082029050602081019050919050565b600061475a6147558461471b565b6142a0565b9050808382526020820190506020840283018581111561477d5761477c6141cf565b5b835b818110156147a657806147928882614177565b84526020840193505060208101905061477f565b5050509392505050565b600082601f8301126147c5576147c46141c5565b5b81356147d5848260208601614747565b91505092915050565b600067ffffffffffffffff8211156147f9576147f8614240565b5b602082029050602081019050919050565b600061481d614818846147de565b6142a0565b905080838252602082019050602084028301858111156148405761483f6141cf565b5b835b8181101561488757803567ffffffffffffffff811115614865576148646141c5565b5b808601614872898261433d565b85526020850194505050602081019050614842565b5050509392505050565b600082601f8301126148a6576148a56141c5565b5b81356148b684826020860161480a565b91505092915050565b600080600080608085870312156148d9576148d8614067565b5b600085013567ffffffffffffffff8111156148f7576148f661406c565b5b614903878288016146ed565b945050602085013567ffffffffffffffff8111156149245761492361406c565b5b614930878288016147b0565b935050604085013567ffffffffffffffff8111156149515761495061406c565b5b61495d87828801614891565b925050606061496e8782880161438c565b91505092959194509250565b6149838161436b565b82525050565b600060208201905061499e600083018461497a565b92915050565b600080600080600060a086880312156149c0576149bf614067565b5b60006149ce88828901614177565b95505060206149df888289016141b0565b94505060406149f0888289016141b0565b9350506060614a018882890161438c565b9250506080614a128882890161438c565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110614a5f57614a5e614a1f565b5b50565b6000819050614a7082614a4e565b919050565b6000614a8082614a62565b9050919050565b614a9081614a75565b82525050565b6000602082019050614aab6000830184614a87565b92915050565b60008060408385031215614ac857614ac7614067565b5b6000614ad685828601614177565b9250506020614ae785828601614596565b9150509250929050565b6000606082019050614b066000830186614136565b614b136020830185614136565b614b206040830184614136565b949350505050565b60008060408385031215614b3f57614b3e614067565b5b6000614b4d85828601614177565b9250506020614b5e858286016141b0565b9150509250929050565b600080600080600060808688031215614b8457614b83614067565b5b6000614b9288828901614177565b9550506020614ba3888289016141b0565b945050604086013567ffffffffffffffff811115614bc457614bc361406c565b5b614bd0888289016141d4565b9350935050606086013567ffffffffffffffff811115614bf357614bf261406c565b5b614bff8882890161433d565b9150509295509295909350565b600060208284031215614c2257614c21614067565b5b6000614c3084828501614596565b91505092915050565b60008060008060608587031215614c5357614c52614067565b5b6000614c6187828801614177565b9450506020614c72878288016141b0565b935050604085013567ffffffffffffffff811115614c9357614c9261406c565b5b614c9f878288016141d4565b925092505092959194509250565b600067ffffffffffffffff821115614cc857614cc7614240565b5b614cd18261422f565b9050602081019050919050565b6000614cf1614cec84614cad565b6142a0565b905082815260208101848484011115614d0d57614d0c61422a565b5b614d188482856142ec565b509392505050565b600082601f830112614d3557614d346141c5565b5b8135614d45848260208601614cde565b91505092915050565b60008060008060808587031215614d6857614d67614067565b5b600085013567ffffffffffffffff811115614d8657614d8561406c565b5b614d92878288016146ed565b945050602085013567ffffffffffffffff811115614db357614db261406c565b5b614dbf878288016147b0565b935050604085013567ffffffffffffffff811115614de057614ddf61406c565b5b614dec87828801614891565b925050606085013567ffffffffffffffff811115614e0d57614e0c61406c565b5b614e1987828801614d20565b91505092959194509250565b600080600060608486031215614e3e57614e3d614067565b5b6000614e4c86828701614596565b9350506020614e5d86828701614177565b925050604084013567ffffffffffffffff811115614e7e57614e7d61406c565b5b614e8a8682870161433d565b9150509250925092565b6000614e9f8261454d565b9050919050565b6000614eb182614e94565b9050919050565b614ec181614ea6565b8114614ecc57600080fd5b50565b600081359050614ede81614eb8565b92915050565b600060208284031215614efa57614ef9614067565b5b6000614f0884828501614ecf565b91505092915050565b600080600080600060a08688031215614f2d57614f2c614067565b5b6000614f3b88828901614596565b9550506020614f4c88828901614596565b945050604086013567ffffffffffffffff811115614f6d57614f6c61406c565b5b614f79888289016147b0565b935050606086013567ffffffffffffffff811115614f9a57614f9961406c565b5b614fa6888289016147b0565b925050608086013567ffffffffffffffff811115614fc757614fc661406c565b5b614fd38882890161433d565b9150509295509295909350565b60008083601f840112614ff657614ff56141c5565b5b8235905067ffffffffffffffff811115615013576150126141ca565b5b60208301915083600182028301111561502f5761502e6141cf565b5b9250929050565b600080600080606085870312156150505761504f614067565b5b600061505e87828801614596565b945050602061506f87828801614177565b935050604085013567ffffffffffffffff8111156150905761508f61406c565b5b61509c87828801614fe0565b925092505092959194509250565b6150b38161456d565b82525050565b60006020820190506150ce60008301846150aa565b92915050565b600080604083850312156150eb576150ea614067565b5b60006150f985828601614596565b925050602061510a85828601614177565b9150509250929050565b600080600080600060a086880312156151305761512f614067565b5b600061513e88828901614596565b955050602061514f88828901614596565b945050604061516088828901614177565b935050606061517188828901614177565b925050608086013567ffffffffffffffff8111156151925761519161406c565b5b61519e8882890161433d565b9150509295509295909350565b6000819050919050565b60006151d06151cb6151c68461454d565b6151ab565b61454d565b9050919050565b60006151e2826151b5565b9050919050565b60006151f4826151d7565b9050919050565b615204816151e9565b82525050565b600060208201905061521f60008301846151fb565b92915050565b600081905092915050565b600061523c8385615225565b93506152498385846142ec565b82840190509392505050565b6000615262828486615230565b91508190509392505050565b6152778161418c565b82525050565b600060a082019050615292600083018861497a565b61529f6020830187614136565b6152ac604083018661526e565b6152b9606083018561497a565b6152c6608083018461497a565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b60006153066018836144b7565b9150615311826152d0565b602082019050919050565b60006020820190508181036000830152615335816152f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061538357607f821691505b6020821081036153965761539561533c565b5b50919050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006153f86021836144b7565b91506154038261539c565b604082019050919050565b60006020820190508181036000830152615427816153eb565b9050919050565b60008151905061543d81614160565b92915050565b60006020828403121561545957615458614067565b5b60006154678482850161542e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154a58161456d565b82525050565b60006154b7838361549c565b60208301905092915050565b6000602082019050919050565b60006154db82615470565b6154e5818561547b565b93506154f08361548c565b8060005b8381101561552157815161550888826154ab565b9750615513836154c3565b9250506001810190506154f4565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6155638161412c565b82525050565b6000615575838361555a565b60208301905092915050565b6000602082019050919050565b60006155998261552e565b6155a38185615539565b93506155ae8361554a565b8060005b838110156155df5781516155c68882615569565b97506155d183615581565b9250506001810190506155b2565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b600061563f82615618565b6156498185615623565b93506156598185602086016144c8565b6156628161422f565b840191505092915050565b60006156798383615634565b905092915050565b6000602082019050919050565b6000615699826155ec565b6156a381856155f7565b9350836020820285016156b585615608565b8060005b858110156156f157848403895281516156d2858261566d565b94506156dd83615681565b925060208a019950506001810190506156b9565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061573561573061572b84615703565b61570d565b61436b565b9050919050565b6157458161571a565b82525050565b600060a082019050818103600083015261576581886154d0565b90508181036020830152615779818761558e565b9050818103604083015261578d818661568e565b905061579c606083018561573c565b6157a9608083018461497a565b9695505050505050565b6000815190506157c281614375565b92915050565b6000602082840312156157de576157dd614067565b5b60006157ec848285016157b3565b91505092915050565b600060c082019050818103600083015261580f81896154d0565b90508181036020830152615823818861558e565b90508181036040830152615837818761568e565b9050615846606083018661573c565b615853608083018561497a565b61586060a0830184614136565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006158a58261412c565b91506158b08361412c565b92508282019050808211156158c8576158c761586b565b5b92915050565b60006040820190506158e36000830185614136565b6158f06020830184614136565b9392505050565b600060608201905061590c600083018661497a565b6159196020830185614136565b615926604083018461526e565b949350505050565b60006159398261412c565b91506159448361412c565b925082820390508181111561595c5761595b61586b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201905081810360008301526159ab81876154d0565b905081810360208301526159bf818661558e565b905081810360408301526159d3818561568e565b90506159e2606083018461497a565b95945050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000615a476027836144b7565b9150615a52826159eb565b604082019050919050565b60006020820190508181036000830152615a7681615a3a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615ad96026836144b7565b9150615ae482615a7d565b604082019050919050565b60006020820190508181036000830152615b0881615acc565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000615b6b6023836144b7565b9150615b7682615b0f565b604082019050919050565b60006020820190508181036000830152615b9a81615b5e565b9050919050565b6000608082019050615bb66000830187614136565b615bc3602083018661526e565b615bd06040830185614136565b8181036060830152615be281846144f2565b905095945050505050565b600082825260208201905092915050565b6000615c0982615618565b615c138185615bed565b9350615c238185602086016144c8565b615c2c8161422f565b840191505092915050565b600060a082019050615c4c6000830188614136565b615c59602083018761526e565b615c666040830186614136565b8181036060830152615c7881856144f2565b90508181036080830152615c8c8184615bfe565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000615d1a6043836144b7565b9150615d2582615c98565b606082019050919050565b60006020820190508181036000830152615d4981615d0d565b9050919050565b6000615d5b8261412c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615d8d57615d8c61586b565b5b600182019050919050565b615da1816140f6565b8114615dac57600080fd5b50565b600081519050615dbe81615d98565b92915050565b600060208284031215615dda57615dd9614067565b5b6000615de884828501615daf565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000615e276020836144b7565b9150615e3282615df1565b602082019050919050565b60006020820190508181036000830152615e5681615e1a565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000615eb96031836144b7565b9150615ec482615e5d565b604082019050919050565b60006020820190508181036000830152615ee881615eac565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000615f4b6021836144b7565b9150615f5682615eef565b604082019050919050565b60006020820190508181036000830152615f7a81615f3e565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000615fb76018836144b7565b9150615fc282615f81565b602082019050919050565b60006020820190508181036000830152615fe681615faa565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006160496021836144b7565b915061605482615fed565b604082019050919050565b600060208201905081810360008301526160788161603c565b9050919050565b600067ffffffffffffffff82169050919050565b600061609e8261607f565b91506160a98361607f565b9250828201905067ffffffffffffffff8111156160c9576160c861586b565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000616117826144ac565b61612181856160fb565b93506161318185602086016144c8565b61613a8161422f565b840191505092915050565b6000616151838361610c565b905092915050565b6000602082019050919050565b6000616171826160cf565b61617b81856160da565b93508360208202850161618d856160eb565b8060005b858110156161c957848403895281516161aa8582616145565b94506161b583616159565b925060208a01995050600181019050616191565b50829750879550505050505092915050565b60006161f66161f16161ec8461607f565b6151ab565b61412c565b9050919050565b616206816161db565b82525050565b600061012082019050616222600083018c614136565b61622f602083018b6150aa565b8181036040830152616241818a6154d0565b90508181036060830152616255818961558e565b905081810360808301526162698188616166565b905081810360a083015261627d818761568e565b905061628c60c08301866161fd565b61629960e08301856161fd565b8181036101008301526162ac81846144f2565b90509a9950505050505050505050565b60006040820190506162d160008301856150aa565b6162de6020830184614136565b9392505050565b60006040820190506162fa60008301856150aa565b61630760208301846150aa565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b600061636a6027836144b7565b91506163758261630e565b604082019050919050565b600060208201905081810360008301526163998161635d565b9050919050565b60006163ab8261412c565b91506163b68361412c565b92508282026163c48161412c565b915082820484148315176163db576163da61586b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061641c8261412c565b91506164278361412c565b925082616437576164366163e2565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000616483600283616442565b915061648e8261644d565b600282019050919050565b6000819050919050565b6164b46164af8261436b565b616499565b82525050565b60006164c582616476565b91506164d182856164a3565b6020820191506164e182846164a3565b6020820191508190509392505050565b6000608082019050616506600083018761497a565b616513602083018661526e565b616520604083018561497a565b61652d606083018461497a565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061656c6018836144b7565b915061657782616536565b602082019050919050565b6000602082019050818103600083015261659b8161655f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006165d8601f836144b7565b91506165e3826165a2565b602082019050919050565b60006020820190508181036000830152616607816165cb565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061666a6022836144b7565b91506166758261660e565b604082019050919050565b600060208201905081810360008301526166998161665d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006166fc6022836144b7565b9150616707826166a0565b604082019050919050565b6000602082019050818103600083015261672b816166ef565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b600061678e6027836144b7565b915061679982616732565b604082019050919050565b600060208201905081810360008301526167bd81616781565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b60006168206035836144b7565b915061682b826167c4565b604082019050919050565b6000602082019050818103600083015261684f81616813565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b600061688c601d836144b7565b915061689782616856565b602082019050919050565b600060208201905081810360008301526168bb8161687f565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061691e6026836144b7565b9150616929826168c2565b604082019050919050565b6000602082019050818103600083015261694d81616911565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006169b06026836144b7565b91506169bb82616954565b604082019050919050565b600060208201905081810360008301526169df816169a3565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000616a1c601d836144b7565b9150616a27826169e6565b602082019050919050565b60006020820190508181036000830152616a4b81616a0f565b9050919050565b6000616a5d82615618565b616a678185615225565b9350616a778185602086016144c8565b80840191505092915050565b6000616a8f8284616a52565b915081905092915050565b600060a082019050616aaf600083018861497a565b616abc602083018761497a565b616ac9604083018661497a565b616ad66060830185614136565b616ae360808301846150aa565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212208093c6fc175f4fddd09f2dd4827965a7f0db1bffd10dc3a6661aff42a249f29164736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102555760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf14610a13578063eb9019d414610a3c578063ece40cc114610a79578063f23a6e6114610aa2578063f8ce560a14610adf578063fc0c546a14610b1c5761029b565b8063c28bc2fa1461092c578063c59057e414610955578063d33219b414610992578063dd4e2ba5146109bd578063deaaa7cc146109e85761029b565b8063a890c910116100fd578063a890c91014610821578063ab58fb8e1461084a578063b58131b014610887578063bc197c81146108b2578063c01f9e37146108ef5761029b565b80637b3c71d3146107145780637d5e81e21461075157806397c3d3341461078e5780639a802a6d146107b9578063a7713a70146107f65761029b565b80633932abb1116101d257806354fd4d501161019657806354fd4d50146105cc57806356781388146105f75780635f398a141461063457806360c4247f1461067157806369e0e346146106ae57806370b0f660146106eb5761029b565b80633932abb1146104ab5780633bccf4fd146104d65780633e4f49e6146105135780634385963214610550578063544ffc9c1461058d5761029b565b8063150b7a0211610219578063150b7a0214610399578063160cbed7146103d65780632656227d146104135780632d63f693146104435780632fe3e261146104805761029b565b806301ffc9a7146102a057806302a251a3146102dd578063034201811461030857806306f3f9e61461034557806306fdde031461036e5761029b565b3661029b573073ffffffffffffffffffffffffffffffffffffffff16610279610b47565b73ffffffffffffffffffffffffffffffffffffffff161461029957600080fd5b005b600080fd5b3480156102ac57600080fd5b506102c760048036038101906102c291906140c9565b610b56565b6040516102d49190614111565b60405180910390f35b3480156102e957600080fd5b506102f2610b68565b6040516102ff9190614145565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906143a1565b610b77565b60405161033c9190614145565b60405180910390f35b34801561035157600080fd5b5061036c6004803603810190610367919061447f565b610c5c565b005b34801561037a57600080fd5b50610383610d53565b604051610390919061452b565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb91906145ab565b610de5565b6040516103cd919061463d565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f891906148bf565b610df9565b60405161040a9190614145565b60405180910390f35b61042d600480360381019061042891906148bf565b6110b3565b60405161043a9190614145565b60405180910390f35b34801561044f57600080fd5b5061046a6004803603810190610465919061447f565b611200565b6040516104779190614145565b60405180910390f35b34801561048c57600080fd5b5061049561126e565b6040516104a29190614989565b60405180910390f35b3480156104b757600080fd5b506104c0611292565b6040516104cd9190614145565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906149a4565b6112a1565b60405161050a9190614145565b60405180910390f35b34801561051f57600080fd5b5061053a6004803603810190610535919061447f565b61132b565b6040516105479190614a96565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190614ab1565b61133d565b6040516105849190614111565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af919061447f565b6113a8565b6040516105c393929190614af1565b60405180910390f35b3480156105d857600080fd5b506105e16113e0565b6040516105ee919061452b565b60405180910390f35b34801561060357600080fd5b5061061e60048036038101906106199190614b28565b61141d565b60405161062b9190614145565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190614b68565b61144e565b6040516106689190614145565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061447f565b6114b8565b6040516106a59190614145565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d09190614c0c565b611604565b6040516106e29190614111565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d919061447f565b611624565b005b34801561072057600080fd5b5061073b60048036038101906107369190614c39565b61171b565b6040516107489190614145565b60405180910390f35b34801561075d57600080fd5b5061077860048036038101906107739190614d4e565b611783565b6040516107859190614145565b60405180910390f35b34801561079a57600080fd5b506107a361179b565b6040516107b09190614145565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db9190614e25565b6117a4565b6040516107ed9190614145565b60405180910390f35b34801561080257600080fd5b5061080b6117ba565b6040516108189190614145565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190614ee4565b6117e3565b005b34801561085657600080fd5b50610871600480360381019061086c919061447f565b6118da565b60405161087e9190614145565b60405180910390f35b34801561089357600080fd5b5061089c6119a7565b6040516108a99190614145565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190614f11565b6119b6565b6040516108e6919061463d565b60405180910390f35b3480156108fb57600080fd5b506109166004803603810190610911919061447f565b6119cb565b6040516109239190614145565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190615036565b611a39565b005b34801561096157600080fd5b5061097c600480360381019061097791906148bf565b611b7a565b6040516109899190614145565b60405180910390f35b34801561099e57600080fd5b506109a7611bb6565b6040516109b491906150b9565b60405180910390f35b3480156109c957600080fd5b506109d2611be0565b6040516109df919061452b565b60405180910390f35b3480156109f457600080fd5b506109fd611c1d565b604051610a0a9190614989565b60405180910390f35b348015610a1f57600080fd5b50610a3a6004803603810190610a35919061447f565b611c41565b005b348015610a4857600080fd5b50610a636004803603810190610a5e91906150d4565b611d38565b604051610a709190614145565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b919061447f565b611d54565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190615114565b611e4b565b604051610ad6919061463d565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b01919061447f565b611e60565b604051610b139190614145565b60405180910390f35b348015610b2857600080fd5b50610b31611e72565b604051610b3e919061520a565b60405180910390f35b6000610b516121f1565b905090565b6000610b618261221b565b9050919050565b6000610b72612295565b905090565b600080610bfa610bf27fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610bb3929190615255565b60405180910390208b80519060200120604051602001610bd795949392919061527d565b6040516020818303038152906040528051906020012061229f565b8686866122b9565b9050610c4d8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a6122e4565b91505098975050505050505050565b610c64610b47565b73ffffffffffffffffffffffffffffffffffffffff16610c826124a0565b73ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf9061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16610cf7610b47565b73ffffffffffffffffffffffffffffffffffffffff1614610d47576000610d1c6124a8565b604051610d2a929190615255565b604051809103902090505b80610d4060026124b5565b03610d3557505b610d5081612591565b50565b606060008054610d629061536b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8e9061536b565b8015610ddb5780601f10610db057610100808354040283529160200191610ddb565b820191906000526020600020905b815481529060010190602001808311610dbe57829003601f168201915b5050505050905090565b600063150b7a0260e01b9050949350505050565b600080610e0886868686611b7a565b905060046007811115610e1e57610e1d614a1f565b5b610e278261132b565b6007811115610e3957610e38614a1f565b5b14610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e709061540e565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190615443565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610f7295949392919061574b565b602060405180830381865afa158015610f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb391906157c8565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611030969594939291906157f5565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611090919061589a565b60405161109e9291906158ce565b60405180910390a18192505050949350505050565b6000806110c286868686611b7a565b905060006110cf8261132b565b9050600460078111156110e5576110e4614a1f565b5b8160078111156110f8576110f7614a1f565b5b148061112857506005600781111561111357611112614a1f565b5b81600781111561112657611125614a1f565b5b145b611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e9061540e565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516111c49190614145565b60405180910390a16111d98288888888612745565b6111e68288888888612828565b6111f3828888888861283c565b8192505050949350505050565b600061125d600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b600061129c6128a5565b905090565b6000806113026112fa7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f89896040516020016112df939291906158f7565b6040516020818303038152906040528051906020012061229f565b8686866122b9565b905061131f878288604051806020016040528060008152506128af565b91505095945050505050565b6000611336826128cf565b9050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806114286124a0565b9050611445848285604051806020016040528060008152506128af565b91505092915050565b6000806114596124a0565b90506114ac87828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876122e4565b91505095945050505050565b6000806009600001805490509050600081036114d9576008549150506115ff565b600060096000016001836114ed919061592e565b815481106114fe576114fd615962565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff16116115e65780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506115ff565b6115fa846009612aa290919063ffffffff16565b925050505b919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b61162c610b47565b73ffffffffffffffffffffffffffffffffffffffff1661164a6124a0565b73ffffffffffffffffffffffffffffffffffffffff16146116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166116bf610b47565b73ffffffffffffffffffffffffffffffffffffffff161461170f5760006116e46124a8565b6040516116f2929190615255565b604051809103902090505b8061170860026124b5565b036116fd57505b61171881612bfa565b50565b6000806117266124a0565b905061177886828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128af565b915050949350505050565b600061179185858585612c3f565b9050949350505050565b60006064905090565b60006117b1848484612f46565b90509392505050565b600080600960000180549050146117da576117d56009612103565b6117de565b6008545b905090565b6117eb610b47565b73ffffffffffffffffffffffffffffffffffffffff166118096124a0565b73ffffffffffffffffffffffffffffffffffffffff161461185f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118569061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661187e610b47565b73ffffffffffffffffffffffffffffffffffffffff16146118ce5760006118a36124a8565b6040516118b1929190615255565b604051809103902090505b806118c760026124b5565b036118bc57505b6118d781612fed565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b815260040161194b9190614989565b602060405180830381865afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190615443565b90506001811461199c578061199f565b60005b915050919050565b60006119b161308c565b905090565b600063bc197c8160e01b905095945050505050565b6000611a28600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff169050919050565b611a41610b47565b73ffffffffffffffffffffffffffffffffffffffff16611a5f6124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac9061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611ad4610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611b24576000611af96124a8565b604051611b07929190615255565b604051809103902090505b80611b1d60026124b5565b03611b1257505b611b738483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085613096565b5050505050565b600084848484604051602001611b939493929190615991565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b611c49610b47565b73ffffffffffffffffffffffffffffffffffffffff16611c676124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb49061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611cdc610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576000611d016124a8565b604051611d0f929190615255565b604051809103902090505b80611d2560026124b5565b03611d1a57505b611d35816130c5565b50565b6000611d4c8383611d4761314d565b612f46565b905092915050565b611d5c610b47565b73ffffffffffffffffffffffffffffffffffffffff16611d7a6124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc79061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611def610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611e3f576000611e146124a8565b604051611e22929190615255565b604051809103902090505b80611e3860026124b5565b03611e2d57505b611e4881613164565b50565b600063f23a6e6160e01b905095945050505050565b6000611e6b826131a9565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090615a5d565b60405180910390fd5b819050919050565b6000806000846000018054905090506000611f1b86612103565b9050600082118015611f7157504386600001600184611f3a919061592e565b81548110611f4b57611f4a615962565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1561200157611f7f85611e96565b86600001600184611f90919061592e565b81548110611fa157611fa0615962565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506120f4565b8560000160405180604001604052806120194361219e565b63ffffffff16815260200161202d88611e96565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b60008082600001805490509050600081146121755782600001600182612129919061592e565b8154811061213a57612139615962565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612178565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090615aef565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061228e575061228d82613271565b5b9050919050565b6000600554905090565b60006122b26122ac6133d6565b836134f0565b9050919050565b60008060006122ca87878787613523565b915091506122d78161362f565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156123105761230f614a1f565b5b6123198861132b565b600781111561232b5761232a614a1f565b5b1461236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290615b81565b60405180910390fd5b60006123ca876123ba846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff1686612f46565b90506123d988888884886137fb565b600084510361243b578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48988848960405161242e9493929190615ba1565b60405180910390a2612492565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612489959493929190615c37565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b60006124c0826139ff565b156124f7576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b61259961179b565b8111156125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290615d30565b60405180910390fd5b60006125e56117ba565b90506000811415801561260057506000600960000180549050145b156126f25760096000016040518060400160405280600063ffffffff16815260200161262b84611e96565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b612706826009611f0190919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516127399291906158ce565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16612764610b47565b73ffffffffffffffffffffffffffffffffffffffff16146128215760005b845181101561281f573073ffffffffffffffffffffffffffffffffffffffff168582815181106127b5576127b4615962565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361280e5761280d8382815181106127ee576127ed615962565b5b6020026020010151805190602001206002613a3490919063ffffffff16565b5b8061281890615d50565b9050612782565b505b5050505050565b6128358585858585613ab0565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661285b610b47565b73ffffffffffffffffffffffffffffffffffffffff16146128905761288060026139ff565b61288f5761288e6002613b4e565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006128c5858585856128c061314d565b6122e4565b9050949350505050565b6000806128db83613bcf565b9050600460078111156128f1576128f0614a1f565b5b81600781111561290457612903614a1f565b5b146129125780915050612a9d565b6000600b60008581526020019081526020016000205490506000801b810361293e578192505050612a9d565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016129999190614989565b602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190615dc4565b156129ea57600792505050612a9d565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b8152600401612a459190614989565b602060405180830381865afa158015612a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a869190615dc4565b15612a9657600592505050612a9d565b6002925050505b919050565b6000438210612ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612add90615e3d565b60405180910390fd5b60008360000180549050905060005b81811015612b6a576000612b098284613ce3565b905084866000018281548110612b2257612b21615962565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612b5457809250612b64565b600181612b61919061589a565b91505b50612af5565b60008214612bcf5784600001600183612b83919061592e565b81548110612b9457612b93615962565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612bd2565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051612c2d9291906158ce565b60405180910390a18060048190555050565b6000612c496119a7565b612c66612c546124a0565b600143612c61919061592e565b611d38565b1015612ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9e90615ecf565b60405180910390fd5b6000612cbc8686868680519060200120611b7a565b90508451865114612d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf990615f61565b60405180910390fd5b8351865114612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d90615f61565b60405180910390fd5b6000865111612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8190615fcd565b60405180910390fd5b6000600160008381526020019081526020016000209050612dea816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613d09565b612e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e209061605f565b60405180910390fd5b6000612e3b612e36611292565b613d23565b612e4443613d23565b612e4e9190616093565b90506000612e62612e5d610b68565b613d23565b82612e6d9190616093565b9050612e858284600001613d7a90919063ffffffff16565b612e9b8184600101613d7a90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084612ec56124a0565b8b8b8d5167ffffffffffffffff811115612ee257612ee1614240565b5b604051908082528060200260200182016040528015612f1557816020015b6060815260200190600190039081612f005790505b508c88888e604051612f2f9998979695949392919061620c565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612fa39291906162bc565b602060405180830381865afa158015612fc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe49190615443565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516130409291906162e5565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606130bc848484604051806060016040528060298152602001616aee60299139613da9565b90509392505050565b60008111613108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff90616380565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405161313b9291906158ce565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516131979291906158ce565b60405180910390a18060068190555050565b60006131b361179b565b6131bc836114b8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016132159190614145565b602060405180830381865afa158015613232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132569190615443565b61326091906163a0565b61326a9190616411565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061335757507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133bf57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133cf57506133ce82613ebd565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561345257507f000000000000000000000000000000000000000000000000000000000000000046145b1561347f577f000000000000000000000000000000000000000000000000000000000000000090506134ed565b6134ea7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613f27565b90505b90565b600082826040516020016135059291906164ba565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561355e576000600391509150613626565b601b8560ff16141580156135765750601c8560ff1614155b15613588576000600491509150613626565b6000600187878787604051600081526020016040526040516135ad94939291906164f1565b6020604051602081039080840390855afa1580156135cf573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361361d57600060019250925050613626565b80600092509250505b94509492505050565b6000600481111561364357613642614a1f565b5b81600481111561365657613655614a1f565b5b03156137f857600160048111156136705761366f614a1f565b5b81600481111561368357613682614a1f565b5b036136c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ba90616582565b60405180910390fd5b600260048111156136d7576136d6614a1f565b5b8160048111156136ea576136e9614a1f565b5b0361372a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613721906165ee565b60405180910390fd5b6003600481111561373e5761373d614a1f565b5b81600481111561375157613750614a1f565b5b03613791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378890616680565b60405180910390fd5b6004808111156137a4576137a3614a1f565b5b8160048111156137b7576137b6614a1f565b5b036137f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ee90616712565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156138a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613898906167a4565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561390f5761390e614a1f565b5b60ff168460ff160361393b578281600001600082825461392f919061589a565b925050819055506139f7565b6001600281111561394f5761394e614a1f565b5b60ff168460ff160361397b578281600101600082825461396f919061589a565b925050819055506139f6565b60028081111561398e5761398d614a1f565b5b60ff168460ff16036139ba57828160020160008282546139ae919061589a565b925050819055506139f5565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ec90616836565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401613b1595949392919061574b565b6000604051808303818588803b158015613b2e57600080fd5b505af1158015613b42573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615613c08576007915050613cde565b8060020160019054906101000a900460ff1615613c29576002915050613cde565b6000613c3484611200565b905060008103613c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c70906168a2565b60405180910390fd5b438110613c8b57600092505050613cde565b6000613c96856119cb565b9050438110613cab5760019350505050613cde565b613cb485613f61565b8015613cc55750613cc485613fa8565b5b15613cd65760049350505050613cde565b600393505050505b919050565b60006002828418613cf49190616411565b828416613d01919061589a565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115613d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d6990616934565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015613dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613de5906169c6565b60405180910390fd5b613df785613fd3565b613e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e2d90616a32565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e5f9190616a83565b60006040518083038185875af1925050503d8060008114613e9c576040519150601f19603f3d011682016040523d82523d6000602084013e613ea1565b606091505b5091509150613eb1828286613ff6565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001613f42959493929190616a9a565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154613f8d919061589a565b613f9e613f9985611200565b611e60565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561400657829050614056565b6000835111156140195782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404d919061452b565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6140a681614071565b81146140b157600080fd5b50565b6000813590506140c38161409d565b92915050565b6000602082840312156140df576140de614067565b5b60006140ed848285016140b4565b91505092915050565b60008115159050919050565b61410b816140f6565b82525050565b60006020820190506141266000830184614102565b92915050565b6000819050919050565b61413f8161412c565b82525050565b600060208201905061415a6000830184614136565b92915050565b6141698161412c565b811461417457600080fd5b50565b60008135905061418681614160565b92915050565b600060ff82169050919050565b6141a28161418c565b81146141ad57600080fd5b50565b6000813590506141bf81614199565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126141ea576141e96141c5565b5b8235905067ffffffffffffffff811115614207576142066141ca565b5b602083019150836001820283011115614223576142226141cf565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142788261422f565b810181811067ffffffffffffffff8211171561429757614296614240565b5b80604052505050565b60006142aa61405d565b90506142b6828261426f565b919050565b600067ffffffffffffffff8211156142d6576142d5614240565b5b6142df8261422f565b9050602081019050919050565b82818337600083830152505050565b600061430e614309846142bb565b6142a0565b90508281526020810184848401111561432a5761432961422a565b5b6143358482856142ec565b509392505050565b600082601f830112614352576143516141c5565b5b81356143628482602086016142fb565b91505092915050565b6000819050919050565b61437e8161436b565b811461438957600080fd5b50565b60008135905061439b81614375565b92915050565b60008060008060008060008060e0898b0312156143c1576143c0614067565b5b60006143cf8b828c01614177565b98505060206143e08b828c016141b0565b975050604089013567ffffffffffffffff8111156144015761440061406c565b5b61440d8b828c016141d4565b9650965050606089013567ffffffffffffffff8111156144305761442f61406c565b5b61443c8b828c0161433d565b945050608061444d8b828c016141b0565b93505060a061445e8b828c0161438c565b92505060c061446f8b828c0161438c565b9150509295985092959890939650565b60006020828403121561449557614494614067565b5b60006144a384828501614177565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156144e65780820151818401526020810190506144cb565b60008484015250505050565b60006144fd826144ac565b61450781856144b7565b93506145178185602086016144c8565b6145208161422f565b840191505092915050565b6000602082019050818103600083015261454581846144f2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145788261454d565b9050919050565b6145888161456d565b811461459357600080fd5b50565b6000813590506145a58161457f565b92915050565b600080600080608085870312156145c5576145c4614067565b5b60006145d387828801614596565b94505060206145e487828801614596565b93505060406145f587828801614177565b925050606085013567ffffffffffffffff8111156146165761461561406c565b5b6146228782880161433d565b91505092959194509250565b61463781614071565b82525050565b6000602082019050614652600083018461462e565b92915050565b600067ffffffffffffffff82111561467357614672614240565b5b602082029050602081019050919050565b600061469761469284614658565b6142a0565b905080838252602082019050602084028301858111156146ba576146b96141cf565b5b835b818110156146e357806146cf8882614596565b8452602084019350506020810190506146bc565b5050509392505050565b600082601f830112614702576147016141c5565b5b8135614712848260208601614684565b91505092915050565b600067ffffffffffffffff82111561473657614735614240565b5b602082029050602081019050919050565b600061475a6147558461471b565b6142a0565b9050808382526020820190506020840283018581111561477d5761477c6141cf565b5b835b818110156147a657806147928882614177565b84526020840193505060208101905061477f565b5050509392505050565b600082601f8301126147c5576147c46141c5565b5b81356147d5848260208601614747565b91505092915050565b600067ffffffffffffffff8211156147f9576147f8614240565b5b602082029050602081019050919050565b600061481d614818846147de565b6142a0565b905080838252602082019050602084028301858111156148405761483f6141cf565b5b835b8181101561488757803567ffffffffffffffff811115614865576148646141c5565b5b808601614872898261433d565b85526020850194505050602081019050614842565b5050509392505050565b600082601f8301126148a6576148a56141c5565b5b81356148b684826020860161480a565b91505092915050565b600080600080608085870312156148d9576148d8614067565b5b600085013567ffffffffffffffff8111156148f7576148f661406c565b5b614903878288016146ed565b945050602085013567ffffffffffffffff8111156149245761492361406c565b5b614930878288016147b0565b935050604085013567ffffffffffffffff8111156149515761495061406c565b5b61495d87828801614891565b925050606061496e8782880161438c565b91505092959194509250565b6149838161436b565b82525050565b600060208201905061499e600083018461497a565b92915050565b600080600080600060a086880312156149c0576149bf614067565b5b60006149ce88828901614177565b95505060206149df888289016141b0565b94505060406149f0888289016141b0565b9350506060614a018882890161438c565b9250506080614a128882890161438c565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110614a5f57614a5e614a1f565b5b50565b6000819050614a7082614a4e565b919050565b6000614a8082614a62565b9050919050565b614a9081614a75565b82525050565b6000602082019050614aab6000830184614a87565b92915050565b60008060408385031215614ac857614ac7614067565b5b6000614ad685828601614177565b9250506020614ae785828601614596565b9150509250929050565b6000606082019050614b066000830186614136565b614b136020830185614136565b614b206040830184614136565b949350505050565b60008060408385031215614b3f57614b3e614067565b5b6000614b4d85828601614177565b9250506020614b5e858286016141b0565b9150509250929050565b600080600080600060808688031215614b8457614b83614067565b5b6000614b9288828901614177565b9550506020614ba3888289016141b0565b945050604086013567ffffffffffffffff811115614bc457614bc361406c565b5b614bd0888289016141d4565b9350935050606086013567ffffffffffffffff811115614bf357614bf261406c565b5b614bff8882890161433d565b9150509295509295909350565b600060208284031215614c2257614c21614067565b5b6000614c3084828501614596565b91505092915050565b60008060008060608587031215614c5357614c52614067565b5b6000614c6187828801614177565b9450506020614c72878288016141b0565b935050604085013567ffffffffffffffff811115614c9357614c9261406c565b5b614c9f878288016141d4565b925092505092959194509250565b600067ffffffffffffffff821115614cc857614cc7614240565b5b614cd18261422f565b9050602081019050919050565b6000614cf1614cec84614cad565b6142a0565b905082815260208101848484011115614d0d57614d0c61422a565b5b614d188482856142ec565b509392505050565b600082601f830112614d3557614d346141c5565b5b8135614d45848260208601614cde565b91505092915050565b60008060008060808587031215614d6857614d67614067565b5b600085013567ffffffffffffffff811115614d8657614d8561406c565b5b614d92878288016146ed565b945050602085013567ffffffffffffffff811115614db357614db261406c565b5b614dbf878288016147b0565b935050604085013567ffffffffffffffff811115614de057614ddf61406c565b5b614dec87828801614891565b925050606085013567ffffffffffffffff811115614e0d57614e0c61406c565b5b614e1987828801614d20565b91505092959194509250565b600080600060608486031215614e3e57614e3d614067565b5b6000614e4c86828701614596565b9350506020614e5d86828701614177565b925050604084013567ffffffffffffffff811115614e7e57614e7d61406c565b5b614e8a8682870161433d565b9150509250925092565b6000614e9f8261454d565b9050919050565b6000614eb182614e94565b9050919050565b614ec181614ea6565b8114614ecc57600080fd5b50565b600081359050614ede81614eb8565b92915050565b600060208284031215614efa57614ef9614067565b5b6000614f0884828501614ecf565b91505092915050565b600080600080600060a08688031215614f2d57614f2c614067565b5b6000614f3b88828901614596565b9550506020614f4c88828901614596565b945050604086013567ffffffffffffffff811115614f6d57614f6c61406c565b5b614f79888289016147b0565b935050606086013567ffffffffffffffff811115614f9a57614f9961406c565b5b614fa6888289016147b0565b925050608086013567ffffffffffffffff811115614fc757614fc661406c565b5b614fd38882890161433d565b9150509295509295909350565b60008083601f840112614ff657614ff56141c5565b5b8235905067ffffffffffffffff811115615013576150126141ca565b5b60208301915083600182028301111561502f5761502e6141cf565b5b9250929050565b600080600080606085870312156150505761504f614067565b5b600061505e87828801614596565b945050602061506f87828801614177565b935050604085013567ffffffffffffffff8111156150905761508f61406c565b5b61509c87828801614fe0565b925092505092959194509250565b6150b38161456d565b82525050565b60006020820190506150ce60008301846150aa565b92915050565b600080604083850312156150eb576150ea614067565b5b60006150f985828601614596565b925050602061510a85828601614177565b9150509250929050565b600080600080600060a086880312156151305761512f614067565b5b600061513e88828901614596565b955050602061514f88828901614596565b945050604061516088828901614177565b935050606061517188828901614177565b925050608086013567ffffffffffffffff8111156151925761519161406c565b5b61519e8882890161433d565b9150509295509295909350565b6000819050919050565b60006151d06151cb6151c68461454d565b6151ab565b61454d565b9050919050565b60006151e2826151b5565b9050919050565b60006151f4826151d7565b9050919050565b615204816151e9565b82525050565b600060208201905061521f60008301846151fb565b92915050565b600081905092915050565b600061523c8385615225565b93506152498385846142ec565b82840190509392505050565b6000615262828486615230565b91508190509392505050565b6152778161418c565b82525050565b600060a082019050615292600083018861497a565b61529f6020830187614136565b6152ac604083018661526e565b6152b9606083018561497a565b6152c6608083018461497a565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b60006153066018836144b7565b9150615311826152d0565b602082019050919050565b60006020820190508181036000830152615335816152f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061538357607f821691505b6020821081036153965761539561533c565b5b50919050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006153f86021836144b7565b91506154038261539c565b604082019050919050565b60006020820190508181036000830152615427816153eb565b9050919050565b60008151905061543d81614160565b92915050565b60006020828403121561545957615458614067565b5b60006154678482850161542e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154a58161456d565b82525050565b60006154b7838361549c565b60208301905092915050565b6000602082019050919050565b60006154db82615470565b6154e5818561547b565b93506154f08361548c565b8060005b8381101561552157815161550888826154ab565b9750615513836154c3565b9250506001810190506154f4565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6155638161412c565b82525050565b6000615575838361555a565b60208301905092915050565b6000602082019050919050565b60006155998261552e565b6155a38185615539565b93506155ae8361554a565b8060005b838110156155df5781516155c68882615569565b97506155d183615581565b9250506001810190506155b2565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b600061563f82615618565b6156498185615623565b93506156598185602086016144c8565b6156628161422f565b840191505092915050565b60006156798383615634565b905092915050565b6000602082019050919050565b6000615699826155ec565b6156a381856155f7565b9350836020820285016156b585615608565b8060005b858110156156f157848403895281516156d2858261566d565b94506156dd83615681565b925060208a019950506001810190506156b9565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061573561573061572b84615703565b61570d565b61436b565b9050919050565b6157458161571a565b82525050565b600060a082019050818103600083015261576581886154d0565b90508181036020830152615779818761558e565b9050818103604083015261578d818661568e565b905061579c606083018561573c565b6157a9608083018461497a565b9695505050505050565b6000815190506157c281614375565b92915050565b6000602082840312156157de576157dd614067565b5b60006157ec848285016157b3565b91505092915050565b600060c082019050818103600083015261580f81896154d0565b90508181036020830152615823818861558e565b90508181036040830152615837818761568e565b9050615846606083018661573c565b615853608083018561497a565b61586060a0830184614136565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006158a58261412c565b91506158b08361412c565b92508282019050808211156158c8576158c761586b565b5b92915050565b60006040820190506158e36000830185614136565b6158f06020830184614136565b9392505050565b600060608201905061590c600083018661497a565b6159196020830185614136565b615926604083018461526e565b949350505050565b60006159398261412c565b91506159448361412c565b925082820390508181111561595c5761595b61586b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201905081810360008301526159ab81876154d0565b905081810360208301526159bf818661558e565b905081810360408301526159d3818561568e565b90506159e2606083018461497a565b95945050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000615a476027836144b7565b9150615a52826159eb565b604082019050919050565b60006020820190508181036000830152615a7681615a3a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615ad96026836144b7565b9150615ae482615a7d565b604082019050919050565b60006020820190508181036000830152615b0881615acc565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000615b6b6023836144b7565b9150615b7682615b0f565b604082019050919050565b60006020820190508181036000830152615b9a81615b5e565b9050919050565b6000608082019050615bb66000830187614136565b615bc3602083018661526e565b615bd06040830185614136565b8181036060830152615be281846144f2565b905095945050505050565b600082825260208201905092915050565b6000615c0982615618565b615c138185615bed565b9350615c238185602086016144c8565b615c2c8161422f565b840191505092915050565b600060a082019050615c4c6000830188614136565b615c59602083018761526e565b615c666040830186614136565b8181036060830152615c7881856144f2565b90508181036080830152615c8c8184615bfe565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000615d1a6043836144b7565b9150615d2582615c98565b606082019050919050565b60006020820190508181036000830152615d4981615d0d565b9050919050565b6000615d5b8261412c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615d8d57615d8c61586b565b5b600182019050919050565b615da1816140f6565b8114615dac57600080fd5b50565b600081519050615dbe81615d98565b92915050565b600060208284031215615dda57615dd9614067565b5b6000615de884828501615daf565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000615e276020836144b7565b9150615e3282615df1565b602082019050919050565b60006020820190508181036000830152615e5681615e1a565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000615eb96031836144b7565b9150615ec482615e5d565b604082019050919050565b60006020820190508181036000830152615ee881615eac565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000615f4b6021836144b7565b9150615f5682615eef565b604082019050919050565b60006020820190508181036000830152615f7a81615f3e565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000615fb76018836144b7565b9150615fc282615f81565b602082019050919050565b60006020820190508181036000830152615fe681615faa565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006160496021836144b7565b915061605482615fed565b604082019050919050565b600060208201905081810360008301526160788161603c565b9050919050565b600067ffffffffffffffff82169050919050565b600061609e8261607f565b91506160a98361607f565b9250828201905067ffffffffffffffff8111156160c9576160c861586b565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000616117826144ac565b61612181856160fb565b93506161318185602086016144c8565b61613a8161422f565b840191505092915050565b6000616151838361610c565b905092915050565b6000602082019050919050565b6000616171826160cf565b61617b81856160da565b93508360208202850161618d856160eb565b8060005b858110156161c957848403895281516161aa8582616145565b94506161b583616159565b925060208a01995050600181019050616191565b50829750879550505050505092915050565b60006161f66161f16161ec8461607f565b6151ab565b61412c565b9050919050565b616206816161db565b82525050565b600061012082019050616222600083018c614136565b61622f602083018b6150aa565b8181036040830152616241818a6154d0565b90508181036060830152616255818961558e565b905081810360808301526162698188616166565b905081810360a083015261627d818761568e565b905061628c60c08301866161fd565b61629960e08301856161fd565b8181036101008301526162ac81846144f2565b90509a9950505050505050505050565b60006040820190506162d160008301856150aa565b6162de6020830184614136565b9392505050565b60006040820190506162fa60008301856150aa565b61630760208301846150aa565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b600061636a6027836144b7565b91506163758261630e565b604082019050919050565b600060208201905081810360008301526163998161635d565b9050919050565b60006163ab8261412c565b91506163b68361412c565b92508282026163c48161412c565b915082820484148315176163db576163da61586b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061641c8261412c565b91506164278361412c565b925082616437576164366163e2565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000616483600283616442565b915061648e8261644d565b600282019050919050565b6000819050919050565b6164b46164af8261436b565b616499565b82525050565b60006164c582616476565b91506164d182856164a3565b6020820191506164e182846164a3565b6020820191508190509392505050565b6000608082019050616506600083018761497a565b616513602083018661526e565b616520604083018561497a565b61652d606083018461497a565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061656c6018836144b7565b915061657782616536565b602082019050919050565b6000602082019050818103600083015261659b8161655f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006165d8601f836144b7565b91506165e3826165a2565b602082019050919050565b60006020820190508181036000830152616607816165cb565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061666a6022836144b7565b91506166758261660e565b604082019050919050565b600060208201905081810360008301526166998161665d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006166fc6022836144b7565b9150616707826166a0565b604082019050919050565b6000602082019050818103600083015261672b816166ef565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b600061678e6027836144b7565b915061679982616732565b604082019050919050565b600060208201905081810360008301526167bd81616781565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b60006168206035836144b7565b915061682b826167c4565b604082019050919050565b6000602082019050818103600083015261684f81616813565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b600061688c601d836144b7565b915061689782616856565b602082019050919050565b600060208201905081810360008301526168bb8161687f565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061691e6026836144b7565b9150616929826168c2565b604082019050919050565b6000602082019050818103600083015261694d81616911565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006169b06026836144b7565b91506169bb82616954565b604082019050919050565b600060208201905081810360008301526169df816169a3565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000616a1c601d836144b7565b9150616a27826169e6565b602082019050919050565b60006020820190508181036000830152616a4b81616a0f565b9050919050565b6000616a5d82615618565b616a678185615225565b9350616a778185602086016144c8565b80840191505092915050565b6000616a8f8284616a52565b915081905092915050565b600060a082019050616aaf600083018861497a565b616abc602083018761497a565b616ac9604083018661497a565b616ad66060830185614136565b616ae360808301846150aa565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212208093c6fc175f4fddd09f2dd4827965a7f0db1bffd10dc3a6661aff42a249f29164736f6c63430008110033", + "devdoc": { + "errors": { + "Empty()": [ + { + "details": "An operation (e.g. {front}) couldn't be completed due to the queue being empty." + } + ] + }, + "kind": "dev", + "methods": { + "COUNTING_MODE()": { + "details": "See {IGovernor-COUNTING_MODE}." + }, + "castVote(uint256,uint8)": { + "details": "See {IGovernor-castVote}." + }, + "castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)": { + "details": "See {IGovernor-castVoteBySig}." + }, + "castVoteWithReason(uint256,uint8,string)": { + "details": "See {IGovernor-castVoteWithReason}." + }, + "castVoteWithReasonAndParams(uint256,uint8,string,bytes)": { + "details": "See {IGovernor-castVoteWithReasonAndParams}." + }, + "castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)": { + "details": "See {IGovernor-castVoteWithReasonAndParamsBySig}." + }, + "execute(address[],uint256[],bytes[],bytes32)": { + "details": "See {IGovernor-execute}." + }, + "getVotes(address,uint256)": { + "details": "See {IGovernor-getVotes}." + }, + "getVotesWithParams(address,uint256,bytes)": { + "details": "See {IGovernor-getVotesWithParams}." + }, + "hasVoted(uint256,address)": { + "details": "See {IGovernor-hasVoted}." + }, + "hashProposal(address[],uint256[],bytes[],bytes32)": { + "details": "See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts." + }, + "name()": { + "details": "See {IGovernor-name}." + }, + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { + "details": "See {IERC1155Receiver-onERC1155BatchReceived}." + }, + "onERC1155Received(address,address,uint256,uint256,bytes)": { + "details": "See {IERC1155Receiver-onERC1155Received}." + }, + "onERC721Received(address,address,uint256,bytes)": { + "details": "See {IERC721Receiver-onERC721Received}." + }, + "proposalDeadline(uint256)": { + "details": "See {IGovernor-proposalDeadline}." + }, + "proposalEta(uint256)": { + "details": "Public accessor to check the eta of a queued proposal" + }, + "proposalSnapshot(uint256)": { + "details": "See {IGovernor-proposalSnapshot}." + }, + "proposalVotes(uint256)": { + "details": "Accessor to the internal vote counts." + }, + "queue(address[],uint256[],bytes[],bytes32)": { + "details": "Function to queue a proposal to the timelock." + }, + "quorumDenominator()": { + "details": "Returns the quorum denominator. Defaults to 100, but may be overridden." + }, + "quorumNumerator()": { + "details": "Returns the current quorum numerator. See {quorumDenominator}." + }, + "quorumNumerator(uint256)": { + "details": "Returns the quorum numerator at a specific block number. See {quorumDenominator}." + }, + "relay(address,uint256,bytes)": { + "details": "Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant." + }, + "setProposalThreshold(uint256)": { + "details": "Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event." + }, + "setVotingDelay(uint256)": { + "details": "Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event." + }, + "setVotingPeriod(uint256)": { + "details": "Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event." + }, + "timelock()": { + "details": "Public accessor to check the address of the timelock" + }, + "updateQuorumNumerator(uint256)": { + "details": "Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator." + }, + "updateTimelock(address)": { + "details": "Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals." + }, + "version()": { + "details": "See {IGovernor-version}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 565, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_name", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 570, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_proposals", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_uint256,t_struct(ProposalCore)563_storage)" + }, + { + "astId": 573, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_governanceCall", + "offset": 0, + "slot": "2", + "type": "t_struct(Bytes32Deque)8151_storage" + }, + { + "astId": 3238, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_votingDelay", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 3240, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_votingPeriod", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 3242, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_proposalThreshold", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 3030, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_proposalVotes", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_uint256,t_struct(ProposalVote)3025_storage)" + }, + { + "astId": 3841, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_quorumNumerator", + "offset": 0, + "slot": "8", + "type": "t_uint256" + }, + { + "astId": 3844, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_quorumNumeratorHistory", + "offset": 0, + "slot": "9", + "type": "t_struct(History)4518_storage" + }, + { + "astId": 3421, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_timelock", + "offset": 0, + "slot": "10", + "type": "t_contract(TimelockController)3004" + }, + { + "astId": 3425, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_timelockIds", + "offset": 0, + "slot": "11", + "type": "t_mapping(t_uint256,t_bytes32)" + }, + { + "astId": 8578, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "inWhiteList", + "offset": 0, + "slot": "12", + "type": "t_mapping(t_address,t_bool)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)4513_storage)dyn_storage": { + "base": "t_struct(Checkpoint)4513_storage", + "encoding": "dynamic_array", + "label": "struct Checkpoints.Checkpoint[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(TimelockController)3004": { + "encoding": "inplace", + "label": "contract TimelockController", + "numberOfBytes": "20" + }, + "t_int128": { + "encoding": "inplace", + "label": "int128", + "numberOfBytes": "16" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_int128,t_bytes32)": { + "encoding": "mapping", + "key": "t_int128", + "label": "mapping(int128 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_mapping(t_uint256,t_bytes32)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_mapping(t_uint256,t_struct(ProposalCore)563_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct Governor.ProposalCore)", + "numberOfBytes": "32", + "value": "t_struct(ProposalCore)563_storage" + }, + "t_mapping(t_uint256,t_struct(ProposalVote)3025_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct GovernorCountingSimple.ProposalVote)", + "numberOfBytes": "32", + "value": "t_struct(ProposalVote)3025_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(BlockNumber)5096_storage": { + "encoding": "inplace", + "label": "struct Timers.BlockNumber", + "members": [ + { + "astId": 5095, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_deadline", + "offset": 0, + "slot": "0", + "type": "t_uint64" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Bytes32Deque)8151_storage": { + "encoding": "inplace", + "label": "struct DoubleEndedQueue.Bytes32Deque", + "members": [ + { + "astId": 8144, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_begin", + "offset": 0, + "slot": "0", + "type": "t_int128" + }, + { + "astId": 8146, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_end", + "offset": 16, + "slot": "0", + "type": "t_int128" + }, + { + "astId": 8150, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_data", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_int128,t_bytes32)" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Checkpoint)4513_storage": { + "encoding": "inplace", + "label": "struct Checkpoints.Checkpoint", + "members": [ + { + "astId": 4510, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_blockNumber", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 4512, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_value", + "offset": 4, + "slot": "0", + "type": "t_uint224" + } + ], + "numberOfBytes": "32" + }, + "t_struct(History)4518_storage": { + "encoding": "inplace", + "label": "struct Checkpoints.History", + "members": [ + { + "astId": 4517, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_checkpoints", + "offset": 0, + "slot": "0", + "type": "t_array(t_struct(Checkpoint)4513_storage)dyn_storage" + } + ], + "numberOfBytes": "32" + }, + "t_struct(ProposalCore)563_storage": { + "encoding": "inplace", + "label": "struct Governor.ProposalCore", + "members": [ + { + "astId": 555, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "voteStart", + "offset": 0, + "slot": "0", + "type": "t_struct(BlockNumber)5096_storage" + }, + { + "astId": 558, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "voteEnd", + "offset": 0, + "slot": "1", + "type": "t_struct(BlockNumber)5096_storage" + }, + { + "astId": 560, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "executed", + "offset": 0, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 562, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "canceled", + "offset": 1, + "slot": "2", + "type": "t_bool" + } + ], + "numberOfBytes": "96" + }, + "t_struct(ProposalVote)3025_storage": { + "encoding": "inplace", + "label": "struct GovernorCountingSimple.ProposalVote", + "members": [ + { + "astId": 3016, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "againstVotes", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 3018, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "forVotes", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 3020, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "abstainVotes", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 3024, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "hasVoted", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_bool)" + } + ], + "numberOfBytes": "128" + }, + "t_uint224": { + "encoding": "inplace", + "label": "uint224", + "numberOfBytes": "28" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + } + } + } +} \ No newline at end of file diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json new file mode 100644 index 0000000..daab2e2 --- /dev/null +++ b/deployments/localhost/TimeLock.json @@ -0,0 +1,1173 @@ +{ + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "minDelay", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "proposers", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "executers", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "CallExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "CallScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "Cancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldDuration", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newDuration", + "type": "uint256" + } + ], + "name": "MinDelayChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "CANCELLER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXECUTOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROPOSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TIMELOCK_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "cancel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "payload", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "executeBatch", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getMinDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "getTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "hashOperation", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + } + ], + "name": "hashOperationBatch", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperation", + "outputs": [ + { + "internalType": "bool", + "name": "registered", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationDone", + "outputs": [ + { + "internalType": "bool", + "name": "done", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationPending", + "outputs": [ + { + "internalType": "bool", + "name": "pending", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "id", + "type": "bytes32" + } + ], + "name": "isOperationReady", + "outputs": [ + { + "internalType": "bool", + "name": "ready", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "schedule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "payloads", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "predecessor", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "name": "scheduleBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newDelay", + "type": "uint256" + } + ], + "name": "updateDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "transactionIndex": 0, + "gasUsed": "3021451", + "logsBloom": "0x00000004000000000c000000000000000a0000000000000000000000000000000000000000000000000000000001000010000000000000000200000010200000000000000000000000000010000000000000000000000000000000000001000000000000020000400000000100000800000000000000000000020004000000000000000000000000000000000000000000000000000000080000000000000000000000000020000000000002000000000000000000000000001000000000000000000000000000204000000000001000000200002000000100000100200020000000000000001000000000000000000000000000000000800000000000000000", + "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a", + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + ], + "data": "0x", + "logIndex": 2, + "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", + "0xfd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 4, + "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f0512", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 5, + "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0x11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logIndex": 6, + "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + } + ], + "blockNumber": 2, + "cumulativeGasUsed": "3021451", + "status": 1, + "byzantium": true + }, + "args": [ + 0, + [], + [] + ], + "numDeployments": 1, + "solcInputHash": "66f18b8ec322110c2dd2cceea16c0aca", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minDelay\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"executers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"CallScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"Cancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDuration\",\"type\":\"uint256\"}],\"name\":\"MinDelayChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCELLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXECUTOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMELOCK_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"cancel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperationBatch\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationDone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationPending\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ready\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"schedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"scheduleBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDelay\",\"type\":\"uint256\"}],\"name\":\"updateDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancel(bytes32)\":{\"details\":\"Cancel an operation. Requirements: - the caller must have the 'canceller' role.\"},\"execute(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role.\"},\"executeBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role.\"},\"getMinDelay()\":{\"details\":\"Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations).\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hashOperation(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a single transaction.\"},\"hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a batch of transactions.\"},\"isOperation(bytes32)\":{\"details\":\"Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations.\"},\"isOperationDone(bytes32)\":{\"details\":\"Returns whether an operation is done or not.\"},\"isOperationPending(bytes32)\":{\"details\":\"Returns whether an operation is pending or not.\"},\"isOperationReady(bytes32)\":{\"details\":\"Returns whether an operation is ready or not.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"schedule(address,uint256,bytes,bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role.\"},\"scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"updateDelay(uint256)\":{\"details\":\"Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLock.sol\":\"TimeLock\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/TimeLock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/TimelockController.sol\\\";\\n\\ncontract TimeLock is TimelockController {\\n // minDelay: How long you have to wait before executing\\n // proposers is the list of addresses that can purpose\\n // executers: Who can execute when proposal passes\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executers\\n ) TimelockController(minDelay, proposers, executers) {}\\n}\\n\",\"keccak256\":\"0x6e48ab9ddd3998d94cdd53158d3d0d16984ac638fb4f685fae7fd734254e3c11\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162003bd838038062003bd8833981810160405281019062000037919062000779565b8282826200006c7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5806200035560201b60201c565b620000be7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc17f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001107fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e637f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7837f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001a37f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca562000197620003b860201b60201c565b620003c060201b60201c565b620001d57f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca530620003c060201b60201c565b60005b82518110156200029457620002317fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc18483815181106200021d576200021c62000813565b5b6020026020010151620003c060201b60201c565b620002807ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7838483815181106200026c576200026b62000813565b5b6020026020010151620003c060201b60201c565b806200028c9062000871565b9050620001d8565b5060005b81518110156200030557620002f17fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63838381518110620002dd57620002dc62000813565b5b6020026020010151620003c060201b60201c565b80620002fd9062000871565b905062000298565b50826002819055507f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5600084604051620003419291906200091c565b60405180910390a150505050505062000949565b60006200036883620003d660201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b620003d28282620003f560201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b620004078282620004e660201b60201c565b620004e257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000487620003b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620005798162000564565b81146200058557600080fd5b50565b60008151905062000599816200056e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005ef82620005a4565b810181811067ffffffffffffffff82111715620006115762000610620005b5565b5b80604052505050565b60006200062662000550565b9050620006348282620005e4565b919050565b600067ffffffffffffffff821115620006575762000656620005b5565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200069a826200066d565b9050919050565b620006ac816200068d565b8114620006b857600080fd5b50565b600081519050620006cc81620006a1565b92915050565b6000620006e9620006e38462000639565b6200061a565b905080838252602082019050602084028301858111156200070f576200070e62000668565b5b835b818110156200073c5780620007278882620006bb565b84526020840193505060208101905062000711565b5050509392505050565b600082601f8301126200075e576200075d6200059f565b5b815162000770848260208601620006d2565b91505092915050565b6000806000606084860312156200079557620007946200055a565b5b6000620007a58682870162000588565b935050602084015167ffffffffffffffff811115620007c957620007c86200055f565b5b620007d78682870162000746565b925050604084015167ffffffffffffffff811115620007fb57620007fa6200055f565b5b620008098682870162000746565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200087e8262000564565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620008b357620008b262000842565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000620008f3620008ed620008e784620008be565b620008c8565b62000564565b9050919050565b6200090581620008d2565b82525050565b620009168162000564565b82525050565b6000604082019050620009336000830185620008fa565b6200094260208301846200090b565b9392505050565b61327f80620009596000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "cancel(bytes32)": { + "details": "Cancel an operation. Requirements: - the caller must have the 'canceller' role." + }, + "execute(address,uint256,bytes,bytes32,bytes32)": { + "details": "Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role." + }, + "executeBatch(address[],uint256[],bytes[],bytes32,bytes32)": { + "details": "Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role." + }, + "getMinDelay()": { + "details": "Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getTimestamp(bytes32)": { + "details": "Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations)." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "hashOperation(address,uint256,bytes,bytes32,bytes32)": { + "details": "Returns the identifier of an operation containing a single transaction." + }, + "hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)": { + "details": "Returns the identifier of an operation containing a batch of transactions." + }, + "isOperation(bytes32)": { + "details": "Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations." + }, + "isOperationDone(bytes32)": { + "details": "Returns whether an operation is done or not." + }, + "isOperationPending(bytes32)": { + "details": "Returns whether an operation is pending or not." + }, + "isOperationReady(bytes32)": { + "details": "Returns whether an operation is ready or not." + }, + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { + "details": "See {IERC1155Receiver-onERC1155BatchReceived}." + }, + "onERC1155Received(address,address,uint256,uint256,bytes)": { + "details": "See {IERC1155Receiver-onERC1155Received}." + }, + "onERC721Received(address,address,uint256,bytes)": { + "details": "See {IERC721Receiver-onERC721Received}." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "schedule(address,uint256,bytes,bytes32,bytes32,uint256)": { + "details": "Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role." + }, + "scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)": { + "details": "Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "updateDelay(uint256)": { + "details": "Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 24, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "_roles", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + }, + { + "astId": 2142, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "_timestamps", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_uint256)" + }, + { + "astId": 2144, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "_minDelay", + "offset": 0, + "slot": "2", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)19_storage" + }, + "t_mapping(t_bytes32,t_uint256)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(RoleData)19_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 16, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 18, + "contract": "contracts/TimeLock.sol:TimeLock", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/localhost/solcInputs/1fbca7b8c0c69581356fdb74c6edaebf.json b/deployments/localhost/solcInputs/66f18b8ec322110c2dd2cceea16c0aca.json similarity index 100% rename from deployments/localhost/solcInputs/1fbca7b8c0c69581356fdb74c6edaebf.json rename to deployments/localhost/solcInputs/66f18b8ec322110c2dd2cceea16c0aca.json index f49ad68..753b548 100644 --- a/deployments/localhost/solcInputs/1fbca7b8c0c69581356fdb74c6edaebf.json +++ b/deployments/localhost/solcInputs/66f18b8ec322110c2dd2cceea16c0aca.json @@ -13,12 +13,12 @@ "@openzeppelin/contracts/token/ERC20/ERC20.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" - }, "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" }, @@ -73,41 +73,41 @@ "@openzeppelin/contracts/governance/IGovernor.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" }, + "@openzeppelin/contracts/utils/Timers.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" + }, "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" }, "@openzeppelin/contracts/utils/math/SafeCast.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" }, - "@openzeppelin/contracts/utils/Timers.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" + }, + "contracts/GovernerContract.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl\n{\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" }, "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" }, + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + }, "@openzeppelin/contracts/governance/utils/IVotes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" }, - "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" - }, "@openzeppelin/contracts/utils/Checkpoints.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" - }, - "contracts/GovernerContract.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl\n{\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" + "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" }, "contracts/GovernanceToken.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\ncontract GovernanceToken is ERC20Votes {\n uint256 public s_initialSupply = 1000000e18;\n address private immutable i_owner;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n modifier onlyOwner() {\n require(i_owner == msg.sender, \"Ownable: caller is not the owner\");\n _;\n }\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n i_owner = msg.sender;\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" diff --git a/deployments/localhost/solcInputs/88b66c97de3b803518e048c2fd73f192.json b/deployments/localhost/solcInputs/88b66c97de3b803518e048c2fd73f192.json new file mode 100644 index 0000000..a091199 --- /dev/null +++ b/deployments/localhost/solcInputs/88b66c97de3b803518e048c2fd73f192.json @@ -0,0 +1,41 @@ +{ + "language": "Solidity", + "sources": { + "contracts/FundProject.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract FundProject is Ownable {\n error FundProject__NotApporovedByDao();\n\n mapping(string => mapping(address => uint256)) public funders;\n mapping(string => bool) public _isApporovedByDao;\n\n modifier isApporovedByDao(string memory _ipfsHash) {\n if (!_isApporovedByDao[_ipfsHash])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n function fund(string memory ipfsHash)\n public\n payable\n isApporovedByDao(ipfsHash)\n {\n funders[ipfsHash][msg.sender] += msg.value;\n }\n\n function apporoveFundingByDao(string memory _project) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_project] = true;\n }\n\n function cancelApporovelFundingByDao(string memory _project)\n external\n onlyOwner\n {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_project] = false;\n }\n\n function _isapporoveFundingByDao(string memory _project)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_project];\n }\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/deployments/localhost/solcInputs/c3bd0fff8e093c1104055db0ec135b98.json b/deployments/localhost/solcInputs/c3bd0fff8e093c1104055db0ec135b98.json new file mode 100644 index 0000000..b0471c2 --- /dev/null +++ b/deployments/localhost/solcInputs/c3bd0fff8e093c1104055db0ec135b98.json @@ -0,0 +1,119 @@ +{ + "language": "Solidity", + "sources": { + "contracts/GovernerContract.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl\n{\n error GovernerContract__NotApporovedByDaoFoundation();\n\n mapping(address => bool) public inWhiteList;\n\n modifier isApporovedByDaoFoundation() {\n if (!inWhiteList[msg.sender])\n revert GovernerContract__NotApporovedByDaoFoundation();\n _;\n }\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/Governor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" + }, + "@openzeppelin/contracts/governance/IGovernor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" + }, + "@openzeppelin/contracts/utils/Timers.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + }, + "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.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 Strings {\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" + }, + "@openzeppelin/contracts/governance/TimelockController.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IGovernor.sol\";\n\n/**\n * @dev Extension of the {IGovernor} for timelock supporting modules.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernorTimelock is IGovernor {\n event ProposalQueued(uint256 proposalId, uint256 eta);\n\n function timelock() public view virtual returns (address);\n\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\n\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual returns (uint256 proposalId);\n}\n" + }, + "@openzeppelin/contracts/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + }, + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" + }, + "@openzeppelin/contracts/utils/Checkpoints.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" + }, + "contracts/FundProject.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract FundProject is Ownable {\n error FundProject__NotApporovedByDao();\n\n mapping(bytes32 => mapping(address => uint256)) public funders;\n mapping(bytes32 => bool) public _isApporovedByDao;\n\n modifier isApporovedByDao(bytes32 _ipfsHash) {\n if (!_isApporovedByDao[_ipfsHash])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n function fund(bytes32 ipfsHash) public payable isApporovedByDao(ipfsHash) {\n funders[ipfsHash][msg.sender] += msg.value;\n }\n\n function apporoveFundingByDao(bytes32 _project) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_project] = true;\n }\n\n function cancelApporovelFundingByDao(bytes32 _project) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_project] = false;\n }\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/helper-config.js b/helper-config.js index bd3ce74..12434d6 100644 --- a/helper-config.js +++ b/helper-config.js @@ -18,6 +18,7 @@ const QUORUM_PERCENTAGE = 0; const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; const NEW_VALUE = 77; const FUNC = "store"; +const FUNC_FUND = "apporoveFundingByDao"; const PROPOSAL_DESCRIPTION = "Propasol #1: Store 77 in the Box!"; const proposalsFile = "./proposals.json"; const s_projectID = 1; @@ -51,4 +52,5 @@ module.exports = { s_fundRaisingGoalAmount, s_roadMap, s_otherSources, + FUNC_FUND, }; diff --git a/proposals.json b/proposals.json index bb2d8d6..38c0884 100644 --- a/proposals.json +++ b/proposals.json @@ -1 +1 @@ -{"31337":["47521742407248176895329046821676979254978125686746004564697692958941862657168"]} \ No newline at end of file +{"31337":["93635954656928978411172927636668390692728594276035597100601248699871636060072"]} \ No newline at end of file diff --git a/scripts/propose.js b/scripts/propose.js index 438b46d..c3d1be3 100644 --- a/scripts/propose.js +++ b/scripts/propose.js @@ -18,6 +18,7 @@ async function propose(args, functionToCall, proposalDescription) { functionToCall, args ); + console.log(encodedFunctionCall); console.log(`Proposing ${functionToCall} on ${box.address} with ${args}`); console.log(`Proposal description: \n ${proposalDescription}`); diff --git a/scripts/queue-and-execute-afterSubmit.js b/scripts/queue-and-execute-afterSubmit.js new file mode 100644 index 0000000..e4007b6 --- /dev/null +++ b/scripts/queue-and-execute-afterSubmit.js @@ -0,0 +1,26 @@ +const { ethers, network } = require("hardhat"); +const { + FUNC_FUND, + NEW_VALUE, + PROPOSAL_DESCRIPTION, + developmentChains, + VOTING_DELAY, + proposalsFile, + MIN_DELAY, +} = require("../helper-config"); +const { moveBlocks } = require("../utils/move-blocks"); +const { moveTime } = require("../utils/move-time"); +const fs = require("fs"); + +async function queue_and_execute_afterSubmit() { + const proposalDescription = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMUU"; + + const fundProjectContract = await ethers.getContract("FundProject"); +} + +queue_and_execute_afterSubmit() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/submit.js b/scripts/submit.js index df855fe..f0032b5 100644 --- a/scripts/submit.js +++ b/scripts/submit.js @@ -69,6 +69,7 @@ async function submit( console.log(projectMetaData); const ProjectMetadataUploadResponse = await storeProjectData(projectMetaData); console.log(`ipfs://${ProjectMetadataUploadResponse.IpfsHash}`); + return ProjectMetadataUploadResponse.IpfsHash; } diff --git a/scripts/submit_and_propose.js b/scripts/submit_and_propose.js new file mode 100644 index 0000000..7a54491 --- /dev/null +++ b/scripts/submit_and_propose.js @@ -0,0 +1,162 @@ +const { ethers, network } = require("hardhat"); +const { storeImages, storeProjectData } = require("./uploadToPinata"); +const fs = require("fs"); +const { + s_projectID, + s_projectName, + s_website, + s_description, + s_video, + s_fundRaisingGoalAmount, + s_roadMap, + s_otherSources, + FUNC, + NEW_VALUE, + PROPOSAL_DESCRIPTION, + developmentChains, + VOTING_DELAY, + proposalsFile, + FUNC_FUND, +} = require("../helper-config"); + +const { moveBlocks } = require("../utils/move-blocks"); + +const imageLocation = "./images"; + +const projectDataTemplate = { + projectName: "", + website: "", + description: "", + images1: "", + images2: "", + images3: "", + images4: "", + images5: "", + video: "", + fundRaisingGoalAmount: "", + roadMap: "", + otherSources: "", + projectID: "", +}; + +async function submitAndPropose( + projectName, + website, + description, + video, + fundRaisingGoalAmount, + roadMap, + otherSources, + images1, + images2, + images3, + images4, + images5 +) { + const { responses: imageUploadResponses, files } = await storeImages( + imageLocation + ); + + let projectMetaData = { ...projectDataTemplate }; + + projectMetaData.projectName = projectName; + projectMetaData.website = website; + projectMetaData.description = description; + + projectMetaData.images1 = `ipfs://${imageUploadResponses[0].IpfsHash}`; + projectMetaData.images2 = `ipfs://${imageUploadResponses[1].IpfsHash}`; + projectMetaData.images3 = `ipfs://${imageUploadResponses[2].IpfsHash}`; + /* projectMetaData.images4 = `ipfs://${imageUploadResponses[3].IpfsHash}`; + projectMetaData.images5 = `ipfs://${imageUploadResponses[4].IpfsHash}`; */ + + projectMetaData.video = video; + projectMetaData.fundRaisingGoalAmount = fundRaisingGoalAmount; + projectMetaData.roadMap = roadMap; + projectMetaData.otherSources = otherSources; + + //console.log(projectMetaData); + const ProjectMetadataUploadResponse = await storeProjectData(projectMetaData); + console.log(`ipfs://${ProjectMetadataUploadResponse.IpfsHash}`); + + const proposalDescription = ProjectMetadataUploadResponse.IpfsHash; + + const governor = await ethers.getContract("GovernerContract"); + const fundProject = await ethers.getContract("FundProject"); + + console.log(proposalDescription); + const args = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(proposalDescription) + ); + + const hexOfFundFunction = ethers.utils.hexlify( + ethers.utils.toUtf8Bytes(FUNC_FUND) + ); + + const encodedFunctionCall = hexOfFundFunction.toString() + args.toString(); + const proposalTx = await governor.propose( + [fundProject.address], + [0], + [ethers.utils.hexlify(ethers.utils.toUtf8Bytes(encodedFunctionCall))], + args + ); + const proposeReceipt = await proposalTx.wait(1); + + if (developmentChains.includes(network.name)) { + await moveBlocks(VOTING_DELAY + 1); + } + const proposalId = proposeReceipt.events[0].args.proposalId; + let proposals = JSON.parse(fs.readFileSync(proposalsFile), "utf8"); + proposals[network.config.chainId.toString()].push(proposalId.toString()); + fs.writeFileSync(proposalsFile, JSON.stringify(proposals)); + + console.log(`Proposing ${FUNC_FUND} on ${fundProject.address}`); + console.log(`Proposal description: \n ${proposalDescription}`); + console.log(`encodedFunctioncall ${encodedFunctionCall}`); + + /* const hexOfFundFunction = ethers.utils.hexlify( + ethers.utils.toUtf8Bytes(FUNC_FUND) + ); + const hexOfProposalDescription = ethers.utils.hexlify( + ethers.utils.toUtf8Bytes(proposalDescription) + ); + + const encodedFunctionCall = + hexOfFundFunction.toString() + hexOfProposalDescription.toString(); + + const proposalTx = await governor.propose( + [fundProject.address], + [0], + [ethers.utils.hexlify(ethers.utils.toUtf8Bytes(encodedFunctionCall))], + proposalDescription + ); + const proposeReceipt = await proposalTx.wait(1); + + if (developmentChains.includes(network.name)) { + await moveBlocks(VOTING_DELAY + 1); + } + const proposalId = proposeReceipt.events[0].args.proposalId; + let proposals = JSON.parse(fs.readFileSync(proposalsFile), "utf8"); + proposals[network.config.chainId.toString()].push(proposalId.toString()); + fs.writeFileSync(proposalsFile, JSON.stringify(proposals)); + + console.log(`Proposing ${FUNC_FUND} on ${fundProject.address}`); + console.log(`Proposal description: \n ${proposalDescription}`); + console.log(`encodedFunctioncall ${encodedFunctionCall}`); */ + + return ProjectMetadataUploadResponse.IpfsHash; +} + +submitAndPropose( + s_projectName, + s_website, + s_description, + s_video, + s_fundRaisingGoalAmount, + s_roadMap, + s_otherSources +) + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); From a7a4d7f910ab6b1e0ff2f4e44b8d05c84440163f Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Sat, 5 Nov 2022 18:39:53 +0300 Subject: [PATCH 10/28] Fixed submit_and_propose and testing --- contracts/FundProject.sol | 25 +- coverage.json | 2 +- coverage/contracts/Box.sol.html | 2 +- coverage/contracts/FundProject.sol.html | 263 ++++++++++++++++++ coverage/contracts/GovernanceToken.sol.html | 6 +- coverage/contracts/GovernerContract.sol.html | 52 +++- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 53 ++-- coverage/coverage-final.json | 5 +- coverage/index.html | 40 +-- coverage/lcov-report/contracts/Box.sol.html | 2 +- .../contracts/FundProject.sol.html | 263 ++++++++++++++++++ .../contracts/GovernanceToken.sol.html | 6 +- .../contracts/GovernerContract.sol.html | 52 +++- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 53 ++-- coverage/lcov-report/index.html | 40 +-- coverage/lcov.info | 98 +++++-- deploy/01-deploy-GovernerToken.js | 8 +- deployments/localhost/Box.json | 22 +- deployments/localhost/FundProject.json | 212 +++++++++++--- deployments/localhost/GovernanceToken.json | 6 +- deployments/localhost/GovernerContract.json | 58 ++-- deployments/localhost/TimeLock.json | 72 ++--- ... => 0934ff3c9c2ecd6d365975d91fef7cb5.json} | 2 +- proposals.json | 2 +- scripts/queue-and-execute-afterSubmit.js | 42 ++- scripts/submit_and_propose.js | 52 +--- scripts/vote.js | 3 + test/unit/fundProjectContract.test.js | 32 ++- 30 files changed, 1143 insertions(+), 334 deletions(-) create mode 100644 coverage/contracts/FundProject.sol.html create mode 100644 coverage/lcov-report/contracts/FundProject.sol.html rename deployments/localhost/solcInputs/{88b66c97de3b803518e048c2fd73f192.json => 0934ff3c9c2ecd6d365975d91fef7cb5.json} (72%) diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index 9476f06..4ad3430 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -6,6 +6,9 @@ import "@openzeppelin/contracts/access/Ownable.sol"; contract FundProject is Ownable { error FundProject__NotApporovedByDao(); + uint256 public projectId = 1; + + mapping(string => uint256) public hashToProjectId; mapping(uint256 => string) public idToHash; mapping(uint256 => mapping(address => uint256)) public funders; mapping(uint256 => bool) public _isApporovedByDao; @@ -24,14 +27,12 @@ contract FundProject is Ownable { funders[_projecID][msg.sender] += msg.value; } - function apporoveFundingByDao(string memory _ipfsHash, uint256 _projectId) - external - onlyOwner - { + function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) - - idToHash[_projectId] = _ipfsHash; - _isApporovedByDao[_projectId] = true; + hashToProjectId[_ipfsHash] = projectId; + idToHash[projectId] = _ipfsHash; + _isApporovedByDao[projectId] = true; + projectId++; } function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { @@ -39,7 +40,7 @@ contract FundProject is Ownable { _isApporovedByDao[_projecID] = false; } - function _isapporoveFundingByDao(uint256 _projecID) + function _isApporoveFundingByDao(uint256 _projecID) external view returns (bool) @@ -54,4 +55,12 @@ contract FundProject is Ownable { { return idToHash[_projecID]; } + + function _getProjectId(string memory _ipfsHash) + public + view + returns (uint256) + { + return hashToProjectId[_ipfsHash]; + } } diff --git a/coverage.json b/coverage.json index a81181a..2fbe945 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":14,"35":14,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":14,"5":14,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":14,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"45":2,"54":2,"63":6,"72":14,"81":2,"90":2,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":2,"2":2,"3":6,"4":14,"5":2,"6":2,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/FundProject.sol":{"l":{"17":0,"18":0,"19":0,"27":0,"32":0,"33":0,"34":0,"35":0,"40":0,"48":0,"56":0,"64":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"1":[0,0]},"f":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"fnMap":{"1":{"name":"isApporovedByDao","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":4}}},"2":{"name":"fund","line":25,"loc":{"start":{"line":22,"column":4},"end":{"line":28,"column":4}}},"3":{"name":"apporoveFundingByDao","line":30,"loc":{"start":{"line":30,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":38,"loc":{"start":{"line":38,"column":4},"end":{"line":41,"column":4}}},"5":{"name":"_isapporoveFundingByDao","line":43,"loc":{"start":{"line":43,"column":4},"end":{"line":49,"column":4}}},"6":{"name":"_getHashOfProjectData","line":51,"loc":{"start":{"line":51,"column":4},"end":{"line":57,"column":4}}},"7":{"name":"_getProjectId","line":59,"loc":{"start":{"line":59,"column":4},"end":{"line":65,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":563}},"2":{"start":{"line":27,"column":8},"end":{"line":27,"column":50}},"3":{"start":{"line":32,"column":8},"end":{"line":32,"column":45}},"4":{"start":{"line":33,"column":8},"end":{"line":33,"column":38}},"5":{"start":{"line":34,"column":8},"end":{"line":34,"column":42}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":43}},"7":{"start":{"line":48,"column":8},"end":{"line":48,"column":43}},"8":{"start":{"line":56,"column":8},"end":{"line":56,"column":34}},"9":{"start":{"line":64,"column":8},"end":{"line":64,"column":41}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":2,"64":2,"73":6,"82":14,"91":2,"100":2,"110":1,"119":0,"128":2,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":2,"4":2,"5":6,"6":14,"7":2,"8":2,"9":1,"10":0,"11":2,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/Box.sol.html b/coverage/contracts/Box.sol.html index 7067ecf..c7b3214 100644 --- a/coverage/contracts/Box.sol.html +++ b/coverage/contracts/Box.sol.html @@ -118,7 +118,7 @@

diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html new file mode 100644 index 0000000..a3c4188 --- /dev/null +++ b/coverage/contracts/FundProject.sol.html @@ -0,0 +1,263 @@ + + + + Code coverage report for contracts/FundProject.sol + + + + + + + +
+
+

+ all files / contracts/ FundProject.sol +

+
+
+ 0% + Statements + 0/9 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/7 +
+
+ 0% + Lines + 0/12 +
+
+
+
+

1 2 @@ -136,8 +136,8 @@

      -10× -10× +14× +14×       @@ -153,14 +153,14 @@

      -  +             -  +      

// SPDX-License-Identifier: MIT
@@ -212,15 +212,15 @@ 

_mint(to, amount); }   - function burnToken(address account, uint256 amount) external { - _burn(account, amount); + function burnToken(address account, uint256 amount) external { + _burn(account, amount); }   - function _burn(address account, uint256 amount) + function _burn(address account, uint256 amount) internal override(ERC20Votes) { - super._burn(account, amount); + super._burn(account, amount); } }  

GovernanceToken.sol
77.78%7/9GovernanceToken.sol
100%9/9 100% 2/271.43%5/780%8/10100%7/7100%10/10
contracts/
81.82%18/22
90.91%20/22 100% 2/280.95%17/2182.61%19/2390.48%19/2191.3%21/23
+ +
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+ 
+import "@openzeppelin/contracts/access/Ownable.sol";
+ 
+contract FundProject is Ownable {
+    error FundProject__NotApporovedByDao();
+ 
+    uint256 public projectId = 1;
+ 
+    mapping(string => uint256) public hashToProjectId;
+    mapping(uint256 => string) public idToHash;
+    mapping(uint256 => mapping(address => uint256)) public funders;
+    mapping(uint256 => bool) public _isApporovedByDao;
+ 
+    modifier isApporovedByDao(uint256 _projecID) {
+        if (!_isApporovedByDao[_projecID])
+            revert FundProject__NotApporovedByDao();
+        _;
+    }
+ 
+    function fund(uint256 _projecID)
+        public
+        payable
+        isApporovedByDao(_projecID)
+    {
+        funders[_projecID][msg.sender] += msg.value;
+    }
+ 
+    function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner {
+        // only dao can call this function (after deployement we will transfer ownership to dao)
+        hashToProjectId[_ipfsHash] = projectId;
+        idToHash[projectId] = _ipfsHash;
+        _isApporovedByDao[projectId] = true;
+        projectId++;
+    }
+ 
+    function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {
+        // only dao can call this function (after deployement we will transfer ownership to dao)
+        _isApporovedByDao[_projecID] = false;
+    }
+ 
+    function _isapporoveFundingByDao(uint256 _projecID)
+        external
+        view
+        returns (bool)
+    {
+        return _isApporovedByDao[_projecID];
+    }
+ 
+    function _getHashOfProjectData(uint256 _projecID)
+        public
+        view
+        returns (string memory)
+    {
+        return idToHash[_projecID];
+    }
+ 
+    function _getProjectId(string memory _ipfsHash)
+        public
+        view
+        returns (uint256)
+    {
+        return hashToProjectId[_ipfsHash];
+    }
+}
+ 
+
+ + + + + + + + diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index 325455b..1b564af 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -136,8 +136,8 @@

      -14× -14× +17× +17×       @@ -229,7 +229,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 09fee71..9148424 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -20,28 +20,28 @@

- 80% + 72.73% Statements - 8/10 + 8/11
- 100% + 0% Branches - 0/0 + 0/2
- 81.82% + 75% Functions - 9/11 + 9/12
- 80% + 61.54% Lines - 8/10 + 8/13
-
+
1 2 @@ -172,7 +172,17 @@

127 128 129 -130

  +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140        @@ -195,6 +205,16 @@

      +  +  +  +  +  +  +  +  +  +        @@ -319,6 +339,16 @@

GovernorVotesQuorumFraction, GovernorTimelockControl { + error GovernerContract__NotApporovedByDaoFoundation(); +  + mapping(address => bool) public inWhiteList; +  + modifier isApporovedByDaoFoundation() { + if (!inWhiteList[msg.sender]) + revert GovernerContract__NotApporovedByDaoFoundation(); + _; + } +  constructor( IVotes _token, TimelockController _timelock, @@ -436,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index 7f91a37..67af6be 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index db928cc..57728c0 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,28 +20,28 @@

- 90.91% + 62.5% Statements - 20/22 + 20/32
- 100% + 33.33% Branches - 2/2 + 2/6
- 90.48% + 65.52% Functions - 19/21 + 19/29
- 91.3% + 55.26% Lines - 21/23 + 21/38
-
+
@@ -71,6 +71,19 @@

+ + + + + + + + + + + + + @@ -85,16 +98,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -116,7 +129,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 8693ac2..4ecbc13 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,6 @@ { "contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, -"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":14,"35":14,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":14,"5":14,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":14,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, -"contracts/GovernerContract.sol":{"l":{"45":2,"54":2,"63":6,"72":14,"81":2,"90":2,"100":1,"109":0,"118":2,"127":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":2,"2":2,"3":6,"4":14,"5":2,"6":2,"7":1,"8":0,"9":2,"10":0},"b":{},"f":{"1":3,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"fnMap":{"1":{"name":"constructor","line":34,"loc":{"start":{"line":19,"column":4},"end":{"line":35,"column":5}}},"2":{"name":"votingDelay","line":39,"loc":{"start":{"line":39,"column":4},"end":{"line":46,"column":4}}},"3":{"name":"votingPeriod","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":55,"column":4}}},"4":{"name":"quorum","line":57,"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":4}}},"5":{"name":"state","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":73,"column":4}}},"6":{"name":"propose","line":75,"loc":{"start":{"line":75,"column":4},"end":{"line":82,"column":4}}},"7":{"name":"proposalThreshold","line":84,"loc":{"start":{"line":84,"column":4},"end":{"line":91,"column":4}}},"8":{"name":"_execute","line":93,"loc":{"start":{"line":93,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_cancel","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":110,"column":4}}},"10":{"name":"_executor","line":112,"loc":{"start":{"line":112,"column":4},"end":{"line":119,"column":4}}},"11":{"name":"supportsInterface","line":121,"loc":{"start":{"line":121,"column":4},"end":{"line":128,"column":4}}}},"statementMap":{"1":{"start":{"line":45,"column":8},"end":{"line":45,"column":34}},"2":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":40}},"4":{"start":{"line":72,"column":8},"end":{"line":72,"column":38}},"5":{"start":{"line":81,"column":8},"end":{"line":81,"column":69}},"6":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":78}},"8":{"start":{"line":109,"column":8},"end":{"line":109,"column":73}},"9":{"start":{"line":118,"column":8},"end":{"line":118,"column":32}},"10":{"start":{"line":127,"column":8},"end":{"line":127,"column":51}}},"branchMap":{}}, +"contracts/FundProject.sol":{"l":{"17":0,"18":0,"19":0,"27":0,"32":0,"33":0,"34":0,"35":0,"40":0,"48":0,"56":0,"64":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"1":[0,0]},"f":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"fnMap":{"1":{"name":"isApporovedByDao","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":4}}},"2":{"name":"fund","line":25,"loc":{"start":{"line":22,"column":4},"end":{"line":28,"column":4}}},"3":{"name":"apporoveFundingByDao","line":30,"loc":{"start":{"line":30,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":38,"loc":{"start":{"line":38,"column":4},"end":{"line":41,"column":4}}},"5":{"name":"_isapporoveFundingByDao","line":43,"loc":{"start":{"line":43,"column":4},"end":{"line":49,"column":4}}},"6":{"name":"_getHashOfProjectData","line":51,"loc":{"start":{"line":51,"column":4},"end":{"line":57,"column":4}}},"7":{"name":"_getProjectId","line":59,"loc":{"start":{"line":59,"column":4},"end":{"line":65,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":563}},"2":{"start":{"line":27,"column":8},"end":{"line":27,"column":50}},"3":{"start":{"line":32,"column":8},"end":{"line":32,"column":45}},"4":{"start":{"line":33,"column":8},"end":{"line":33,"column":38}},"5":{"start":{"line":34,"column":8},"end":{"line":34,"column":42}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":43}},"7":{"start":{"line":48,"column":8},"end":{"line":48,"column":43}},"8":{"start":{"line":56,"column":8},"end":{"line":56,"column":34}},"9":{"start":{"line":64,"column":8},"end":{"line":64,"column":41}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, +"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, +"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":2,"64":2,"73":6,"82":14,"91":2,"100":2,"110":1,"119":0,"128":2,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":2,"4":2,"5":6,"6":14,"7":2,"8":2,"9":1,"10":0,"11":2,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index d4fa9a3..cf86e08 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,28 +20,28 @@

- 90.91% + 62.5% Statements - 20/22 + 20/32
- 100% + 33.33% Branches - 2/2 + 2/6
- 90.48% + 65.52% Functions - 19/21 + 19/29
- 91.3% + 55.26% Lines - 21/23 + 21/38
-
+
3/3
FundProject.sol
0%0/90%0/20%0/70%0/12
GovernanceToken.sol
GovernerContract.sol
80%8/10100%0/081.82%9/1180%8/10GovernerContract.sol
72.73%8/110%0/275%9/1261.54%8/13
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/Box.sol.html b/coverage/lcov-report/contracts/Box.sol.html index 7067ecf..c7b3214 100644 --- a/coverage/lcov-report/contracts/Box.sol.html +++ b/coverage/lcov-report/contracts/Box.sol.html @@ -118,7 +118,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html new file mode 100644 index 0000000..a3c4188 --- /dev/null +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -0,0 +1,263 @@ + + + + Code coverage report for contracts/FundProject.sol + + + + + + + +
+
+

+ all files / contracts/ FundProject.sol +

+
+
+ 0% + Statements + 0/9 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/7 +
+
+ 0% + Lines + 0/12 +
+
+
+
+

contracts/
90.91%20/22100%2/290.48%19/2191.3%21/23contracts/
62.5%20/3233.33%2/665.52%19/2955.26%21/38
+ +
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+ 
+import "@openzeppelin/contracts/access/Ownable.sol";
+ 
+contract FundProject is Ownable {
+    error FundProject__NotApporovedByDao();
+ 
+    uint256 public projectId = 1;
+ 
+    mapping(string => uint256) public hashToProjectId;
+    mapping(uint256 => string) public idToHash;
+    mapping(uint256 => mapping(address => uint256)) public funders;
+    mapping(uint256 => bool) public _isApporovedByDao;
+ 
+    modifier isApporovedByDao(uint256 _projecID) {
+        if (!_isApporovedByDao[_projecID])
+            revert FundProject__NotApporovedByDao();
+        _;
+    }
+ 
+    function fund(uint256 _projecID)
+        public
+        payable
+        isApporovedByDao(_projecID)
+    {
+        funders[_projecID][msg.sender] += msg.value;
+    }
+ 
+    function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner {
+        // only dao can call this function (after deployement we will transfer ownership to dao)
+        hashToProjectId[_ipfsHash] = projectId;
+        idToHash[projectId] = _ipfsHash;
+        _isApporovedByDao[projectId] = true;
+        projectId++;
+    }
+ 
+    function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {
+        // only dao can call this function (after deployement we will transfer ownership to dao)
+        _isApporovedByDao[_projecID] = false;
+    }
+ 
+    function _isapporoveFundingByDao(uint256 _projecID)
+        external
+        view
+        returns (bool)
+    {
+        return _isApporovedByDao[_projecID];
+    }
+ 
+    function _getHashOfProjectData(uint256 _projecID)
+        public
+        view
+        returns (string memory)
+    {
+        return idToHash[_projecID];
+    }
+ 
+    function _getProjectId(string memory _ipfsHash)
+        public
+        view
+        returns (uint256)
+    {
+        return hashToProjectId[_ipfsHash];
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index 325455b..1b564af 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -136,8 +136,8 @@

      -14× -14× +17× +17×       @@ -229,7 +229,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 09fee71..9148424 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -20,28 +20,28 @@

- 80% + 72.73% Statements - 8/10 + 8/11
- 100% + 0% Branches - 0/0 + 0/2
- 81.82% + 75% Functions - 9/11 + 9/12
- 80% + 61.54% Lines - 8/10 + 8/13
-
+
1 2 @@ -172,7 +172,17 @@

127 128 129 -130

  +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140        @@ -195,6 +205,16 @@

      +  +  +  +  +  +  +  +  +  +        @@ -319,6 +339,16 @@

GovernorVotesQuorumFraction, GovernorTimelockControl { + error GovernerContract__NotApporovedByDaoFoundation(); +  + mapping(address => bool) public inWhiteList; +  + modifier isApporovedByDaoFoundation() { + if (!inWhiteList[msg.sender]) + revert GovernerContract__NotApporovedByDaoFoundation(); + _; + } +  constructor( IVotes _token, TimelockController _timelock, @@ -436,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index 7f91a37..67af6be 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index db928cc..57728c0 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,28 +20,28 @@

- 90.91% + 62.5% Statements - 20/22 + 20/32
- 100% + 33.33% Branches - 2/2 + 2/6
- 90.48% + 65.52% Functions - 19/21 + 19/29
- 91.3% + 55.26% Lines - 21/23 + 21/38
-
+
@@ -71,6 +71,19 @@

+ + + + + + + + + + + + + @@ -85,16 +98,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -116,7 +129,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index d4fa9a3..cf86e08 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,28 +20,28 @@

- 90.91% + 62.5% Statements - 20/22 + 20/32
- 100% + 33.33% Branches - 2/2 + 2/6
- 90.48% + 65.52% Functions - 19/21 + 19/29
- 91.3% + 55.26% Lines - 21/23 + 21/38
-
+
3/3
FundProject.sol
0%0/90%0/20%0/70%0/12
GovernanceToken.sol
GovernerContract.sol
80%8/10100%0/081.82%9/1180%8/10GovernerContract.sol
72.73%8/110%0/275%9/1261.54%8/13
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 3460ebe..1f8b9d5 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -15,6 +15,43 @@ BRF:0 BRH:0 end_of_record TN: +SF:/home/furkansezal/dao/contracts/FundProject.sol +FN:16,isApporovedByDao +FN:25,fund +FN:30,apporoveFundingByDao +FN:38,cancelApporovelFundingByDao +FN:43,_isapporoveFundingByDao +FN:51,_getHashOfProjectData +FN:59,_getProjectId +FNF:7 +FNH:0 +FNDA:0,isApporovedByDao +FNDA:0,fund +FNDA:0,apporoveFundingByDao +FNDA:0,cancelApporovelFundingByDao +FNDA:0,_isapporoveFundingByDao +FNDA:0,_getHashOfProjectData +FNDA:0,_getProjectId +DA:17,0 +DA:18,0 +DA:19,0 +DA:27,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:40,0 +DA:48,0 +DA:56,0 +DA:64,0 +LF:12 +LH:0 +BRDA:17,1,0,0 +BRDA:17,1,1,0 +BRF:2 +BRH:0 +end_of_record +TN: SF:/home/furkansezal/dao/contracts/GovernanceToken.sol FN:16,onlyOwner FN:23,constructor @@ -27,7 +64,7 @@ FNF:7 FNH:7 FNDA:5,onlyOwner FNDA:3,constructor -FNDA:14,_afterTokenTransfer +FNDA:17,_afterTokenTransfer FNDA:4,_mint FNDA:2,mintToken FNDA:1,burnToken @@ -36,8 +73,8 @@ DA:17,5 DA:18,4 DA:25,3 DA:26,3 -DA:34,14 -DA:35,14 +DA:34,17 +DA:35,17 DA:43,4 DA:47,2 DA:51,1 @@ -51,19 +88,21 @@ BRH:2 end_of_record TN: SF:/home/furkansezal/dao/contracts/GovernerContract.sol -FN:34,constructor -FN:39,votingDelay -FN:48,votingPeriod -FN:57,quorum -FN:66,state -FN:75,propose -FN:84,proposalThreshold -FN:93,_execute -FN:103,_cancel -FN:112,_executor -FN:121,supportsInterface -FNF:11 +FN:23,isApporovedByDaoFoundation +FN:44,constructor +FN:49,votingDelay +FN:58,votingPeriod +FN:67,quorum +FN:76,state +FN:85,propose +FN:94,proposalThreshold +FN:103,_execute +FN:113,_cancel +FN:122,_executor +FN:131,supportsInterface +FNF:12 FNH:9 +FNDA:0,isApporovedByDaoFoundation FNDA:3,constructor FNDA:2,votingDelay FNDA:2,votingPeriod @@ -75,19 +114,24 @@ FNDA:1,_execute FNDA:0,_cancel FNDA:2,_executor FNDA:0,supportsInterface -DA:45,2 -DA:54,2 -DA:63,6 -DA:72,14 -DA:81,2 -DA:90,2 -DA:100,1 -DA:109,0 -DA:118,2 -DA:127,0 -LF:10 +DA:24,0 +DA:25,0 +DA:26,0 +DA:55,2 +DA:64,2 +DA:73,6 +DA:82,14 +DA:91,2 +DA:100,2 +DA:110,1 +DA:119,0 +DA:128,2 +DA:137,0 +LF:13 LH:8 -BRF:0 +BRDA:24,1,0,0 +BRDA:24,1,1,0 +BRF:2 BRH:0 end_of_record TN: diff --git a/deploy/01-deploy-GovernerToken.js b/deploy/01-deploy-GovernerToken.js index 674854b..a526178 100644 --- a/deploy/01-deploy-GovernerToken.js +++ b/deploy/01-deploy-GovernerToken.js @@ -12,8 +12,8 @@ module.exports = async ({ getNamedAccounts, deployments }) => { waitConfirmations: network.config.blockConfirmations || 1, }); log(`governanceToken deployed at ${governanceToken.address}`); - /* await delegate(governanceToken.address, deployer); - console.log(`Delegated!`); */ + await delegate(governanceToken.address, deployer); + console.log(`Delegated!`); if ( !developmentChains.includes(network.name) && @@ -23,7 +23,7 @@ module.exports = async ({ getNamedAccounts, deployments }) => { } }; -/* const delegate = async (governanceTokenAddress, delegatedAccount) => { +const delegate = async (governanceTokenAddress, delegatedAccount) => { const governanceToken = await ethers.getContractAt( "GovernanceToken", governanceTokenAddress @@ -33,6 +33,6 @@ module.exports = async ({ getNamedAccounts, deployments }) => { console.log( `Checkpoint ${await governanceToken.numCheckpoints(delegatedAccount)}` ); -}; */ +}; module.exports.tags = ["all", "governanceToken"]; diff --git a/deployments/localhost/Box.json b/deployments/localhost/Box.json index f3e62d3..83e52ea 100644 --- a/deployments/localhost/Box.json +++ b/deployments/localhost/Box.json @@ -1,5 +1,5 @@ { - "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", "abi": [ { "anonymous": false, @@ -93,22 +93,22 @@ "type": "function" } ], - "transactionHash": "0x6e41d7ee4a7548d50a82f10d619808b4b36293e770afd7d3f7cf7fca4530fe48", + "transactionHash": "0xe52a23bbee8a7d102c1dff9f98c6709834b8ab8101884a3f7b3c47e91636b841", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "contractAddress": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", "transactionIndex": 0, "gasUsed": "398269", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe15d8f3310e6d36266fbfb4fd0b1f9bec3b972d69135cb23efc5031cf7602910", - "transactionHash": "0x6e41d7ee4a7548d50a82f10d619808b4b36293e770afd7d3f7cf7fca4530fe48", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000010000000010000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x2d7e9a6ce2b344890bbb1afd12e6386e8fdcc146f51d75ed41e318fd503d5765", + "transactionHash": "0xe52a23bbee8a7d102c1dff9f98c6709834b8ab8101884a3f7b3c47e91636b841", "logs": [ { "transactionIndex": 0, - "blockNumber": 7, - "transactionHash": "0x6e41d7ee4a7548d50a82f10d619808b4b36293e770afd7d3f7cf7fca4530fe48", - "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "blockNumber": 8, + "transactionHash": "0xe52a23bbee8a7d102c1dff9f98c6709834b8ab8101884a3f7b3c47e91636b841", + "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -116,10 +116,10 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0xe15d8f3310e6d36266fbfb4fd0b1f9bec3b972d69135cb23efc5031cf7602910" + "blockHash": "0x2d7e9a6ce2b344890bbb1afd12e6386e8fdcc146f51d75ed41e318fd503d5765" } ], - "blockNumber": 7, + "blockNumber": 8, "cumulativeGasUsed": "398269", "status": 1, "byzantium": true diff --git a/deployments/localhost/FundProject.json b/deployments/localhost/FundProject.json index 0159ac0..51e2b34 100644 --- a/deployments/localhost/FundProject.json +++ b/deployments/localhost/FundProject.json @@ -1,5 +1,5 @@ { - "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + "address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", "abi": [ { "inputs": [], @@ -27,12 +27,50 @@ }, { "inputs": [ + { + "internalType": "uint256", + "name": "_projecID", + "type": "uint256" + } + ], + "name": "_getHashOfProjectData", + "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_ipfsHash", + "type": "string" + } + ], + "name": "_getProjectId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "name": "_isApporovedByDao", "outputs": [ { @@ -47,9 +85,9 @@ { "inputs": [ { - "internalType": "string", - "name": "_project", - "type": "string" + "internalType": "uint256", + "name": "_projecID", + "type": "uint256" } ], "name": "_isapporoveFundingByDao", @@ -67,7 +105,7 @@ "inputs": [ { "internalType": "string", - "name": "_project", + "name": "_ipfsHash", "type": "string" } ], @@ -79,9 +117,9 @@ { "inputs": [ { - "internalType": "string", - "name": "_project", - "type": "string" + "internalType": "uint256", + "name": "_projecID", + "type": "uint256" } ], "name": "cancelApporovelFundingByDao", @@ -92,9 +130,9 @@ { "inputs": [ { - "internalType": "string", - "name": "ipfsHash", - "type": "string" + "internalType": "uint256", + "name": "_projecID", + "type": "uint256" } ], "name": "fund", @@ -105,9 +143,9 @@ { "inputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" }, { "internalType": "address", @@ -126,6 +164,44 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "hashToProjectId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "idToHash", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "owner", @@ -139,6 +215,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "projectId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "renounceOwnership", @@ -160,22 +249,22 @@ "type": "function" } ], - "transactionHash": "0x82b0a9a33d5294fba926aa78a436136cb7d25513252ac644c2c5701e8293ca4d", + "transactionHash": "0xeafb7064c744cc0b86689488030c47d02dfd9cb63f88ee013618d681050b0123", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + "contractAddress": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", "transactionIndex": 0, - "gasUsed": "712147", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000040000000000000000000000000000000008000000000000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x555f0c77d09b474cc8f3dc4d975299237969212a7dee16d073c076fb510cbf04", - "transactionHash": "0x82b0a9a33d5294fba926aa78a436136cb7d25513252ac644c2c5701e8293ca4d", + "gasUsed": "1111209", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000002000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000040000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x67c7a9186622193f122f0770f99aee44cf7a884bf7fd2ea113f6b1b6bc39e053", + "transactionHash": "0xeafb7064c744cc0b86689488030c47d02dfd9cb63f88ee013618d681050b0123", "logs": [ { "transactionIndex": 0, - "blockNumber": 9, - "transactionHash": "0x82b0a9a33d5294fba926aa78a436136cb7d25513252ac644c2c5701e8293ca4d", - "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + "blockNumber": 10, + "transactionHash": "0xeafb7064c744cc0b86689488030c47d02dfd9cb63f88ee013618d681050b0123", + "address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -183,20 +272,20 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x555f0c77d09b474cc8f3dc4d975299237969212a7dee16d073c076fb510cbf04" + "blockHash": "0x67c7a9186622193f122f0770f99aee44cf7a884bf7fd2ea113f6b1b6bc39e053" } ], - "blockNumber": 9, - "cumulativeGasUsed": "712147", + "blockNumber": 10, + "cumulativeGasUsed": "1111209", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "88b66c97de3b803518e048c2fd73f192", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_project\",\"type\":\"string\"}],\"name\":\"_isapporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_project\",\"type\":\"string\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_project\",\"type\":\"string\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"ipfsHash\",\"type\":\"string\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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/FundProject.sol\":\"FundProject\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract FundProject is Ownable {\\n error FundProject__NotApporovedByDao();\\n\\n mapping(string => mapping(address => uint256)) public funders;\\n mapping(string => bool) public _isApporovedByDao;\\n\\n modifier isApporovedByDao(string memory _ipfsHash) {\\n if (!_isApporovedByDao[_ipfsHash])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n function fund(string memory ipfsHash)\\n public\\n payable\\n isApporovedByDao(ipfsHash)\\n {\\n funders[ipfsHash][msg.sender] += msg.value;\\n }\\n\\n function apporoveFundingByDao(string memory _project) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n _isApporovedByDao[_project] = true;\\n }\\n\\n function cancelApporovelFundingByDao(string memory _project)\\n external\\n onlyOwner\\n {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n _isApporovedByDao[_project] = false;\\n }\\n\\n function _isapporoveFundingByDao(string memory _project)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_project];\\n }\\n}\\n\",\"keccak256\":\"0x1a7a2bd5e84cd24252526a93fbefc84bd2c4e3b40ba6b3493d6bd3bbb2472cc0\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610b768061010d6000396000f3fe6080604052600436106100865760003560e01c806374c121b21161005957806374c121b2146101245780638da5cb5b1461014d578063ab70eff314610178578063acb469ee146101b5578063f2fde38b146101f257610086565b806363e1a6ba1461008b578063715018a6146100c857806372d63464146100df57806373451f6514610108575b600080fd5b34801561009757600080fd5b506100b260048036038101906100ad9190610782565b61021b565b6040516100bf91906107e6565b60405180910390f35b3480156100d457600080fd5b506100dd610251565b005b3480156100eb57600080fd5b5061010660048036038101906101019190610782565b610265565b005b610122600480360381019061011d9190610782565b6102a7565b005b34801561013057600080fd5b5061014b60048036038101906101469190610782565b610380565b005b34801561015957600080fd5b506101626103c2565b60405161016f9190610842565b60405180910390f35b34801561018457600080fd5b5061019f600480360381019061019a9190610889565b6103eb565b6040516101ac91906108fe565b60405180910390f35b3480156101c157600080fd5b506101dc60048036038101906101d79190610782565b610426565b6040516101e991906107e6565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190610919565b61045b565b005b6002818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b6102596104de565b610263600061055c565b565b61026d6104de565b600060028260405161027f91906109b7565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050565b806002816040516102b891906109b7565b908152602001604051809103902060009054906101000a900460ff1661030a576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3460018360405161031b91906109b7565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461037591906109fd565b925050819055505050565b6103886104de565b600160028260405161039a91906109b7565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600182805160208101820180518482526020830160208501208183528095505050505050602052806000526040600020600091509150505481565b600060028260405161043891906109b7565b908152602001604051809103902060009054906101000a900460ff169050919050565b6104636104de565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036104d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c990610ab4565b60405180910390fd5b6104db8161055c565b50565b6104e6610620565b73ffffffffffffffffffffffffffffffffffffffff166105046103c2565b73ffffffffffffffffffffffffffffffffffffffff161461055a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055190610b20565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61068f82610646565b810181811067ffffffffffffffff821117156106ae576106ad610657565b5b80604052505050565b60006106c1610628565b90506106cd8282610686565b919050565b600067ffffffffffffffff8211156106ed576106ec610657565b5b6106f682610646565b9050602081019050919050565b82818337600083830152505050565b6000610725610720846106d2565b6106b7565b90508281526020810184848401111561074157610740610641565b5b61074c848285610703565b509392505050565b600082601f8301126107695761076861063c565b5b8135610779848260208601610712565b91505092915050565b60006020828403121561079857610797610632565b5b600082013567ffffffffffffffff8111156107b6576107b5610637565b5b6107c284828501610754565b91505092915050565b60008115159050919050565b6107e0816107cb565b82525050565b60006020820190506107fb60008301846107d7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061082c82610801565b9050919050565b61083c81610821565b82525050565b60006020820190506108576000830184610833565b92915050565b61086681610821565b811461087157600080fd5b50565b6000813590506108838161085d565b92915050565b600080604083850312156108a05761089f610632565b5b600083013567ffffffffffffffff8111156108be576108bd610637565b5b6108ca85828601610754565b92505060206108db85828601610874565b9150509250929050565b6000819050919050565b6108f8816108e5565b82525050565b600060208201905061091360008301846108ef565b92915050565b60006020828403121561092f5761092e610632565b5b600061093d84828501610874565b91505092915050565b600081519050919050565b600081905092915050565b60005b8381101561097a57808201518184015260208101905061095f565b60008484015250505050565b600061099182610946565b61099b8185610951565b93506109ab81856020860161095c565b80840191505092915050565b60006109c38284610986565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a08826108e5565b9150610a13836108e5565b9250828201905080821115610a2b57610a2a6109ce565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610a9e602683610a31565b9150610aa982610a42565b604082019050919050565b60006020820190508181036000830152610acd81610a91565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000610b0a602083610a31565b9150610b1582610ad4565b602082019050919050565b60006020820190508181036000830152610b3981610afd565b905091905056fea264697066735822122012b342beda6fc4f8b4a00001ced7224dae015a294f9978f0d9b57172d68b03bd64736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106100865760003560e01c806374c121b21161005957806374c121b2146101245780638da5cb5b1461014d578063ab70eff314610178578063acb469ee146101b5578063f2fde38b146101f257610086565b806363e1a6ba1461008b578063715018a6146100c857806372d63464146100df57806373451f6514610108575b600080fd5b34801561009757600080fd5b506100b260048036038101906100ad9190610782565b61021b565b6040516100bf91906107e6565b60405180910390f35b3480156100d457600080fd5b506100dd610251565b005b3480156100eb57600080fd5b5061010660048036038101906101019190610782565b610265565b005b610122600480360381019061011d9190610782565b6102a7565b005b34801561013057600080fd5b5061014b60048036038101906101469190610782565b610380565b005b34801561015957600080fd5b506101626103c2565b60405161016f9190610842565b60405180910390f35b34801561018457600080fd5b5061019f600480360381019061019a9190610889565b6103eb565b6040516101ac91906108fe565b60405180910390f35b3480156101c157600080fd5b506101dc60048036038101906101d79190610782565b610426565b6040516101e991906107e6565b60405180910390f35b3480156101fe57600080fd5b5061021960048036038101906102149190610919565b61045b565b005b6002818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b6102596104de565b610263600061055c565b565b61026d6104de565b600060028260405161027f91906109b7565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050565b806002816040516102b891906109b7565b908152602001604051809103902060009054906101000a900460ff1661030a576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3460018360405161031b91906109b7565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461037591906109fd565b925050819055505050565b6103886104de565b600160028260405161039a91906109b7565b908152602001604051809103902060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600182805160208101820180518482526020830160208501208183528095505050505050602052806000526040600020600091509150505481565b600060028260405161043891906109b7565b908152602001604051809103902060009054906101000a900460ff169050919050565b6104636104de565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036104d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c990610ab4565b60405180910390fd5b6104db8161055c565b50565b6104e6610620565b73ffffffffffffffffffffffffffffffffffffffff166105046103c2565b73ffffffffffffffffffffffffffffffffffffffff161461055a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055190610b20565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61068f82610646565b810181811067ffffffffffffffff821117156106ae576106ad610657565b5b80604052505050565b60006106c1610628565b90506106cd8282610686565b919050565b600067ffffffffffffffff8211156106ed576106ec610657565b5b6106f682610646565b9050602081019050919050565b82818337600083830152505050565b6000610725610720846106d2565b6106b7565b90508281526020810184848401111561074157610740610641565b5b61074c848285610703565b509392505050565b600082601f8301126107695761076861063c565b5b8135610779848260208601610712565b91505092915050565b60006020828403121561079857610797610632565b5b600082013567ffffffffffffffff8111156107b6576107b5610637565b5b6107c284828501610754565b91505092915050565b60008115159050919050565b6107e0816107cb565b82525050565b60006020820190506107fb60008301846107d7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061082c82610801565b9050919050565b61083c81610821565b82525050565b60006020820190506108576000830184610833565b92915050565b61086681610821565b811461087157600080fd5b50565b6000813590506108838161085d565b92915050565b600080604083850312156108a05761089f610632565b5b600083013567ffffffffffffffff8111156108be576108bd610637565b5b6108ca85828601610754565b92505060206108db85828601610874565b9150509250929050565b6000819050919050565b6108f8816108e5565b82525050565b600060208201905061091360008301846108ef565b92915050565b60006020828403121561092f5761092e610632565b5b600061093d84828501610874565b91505092915050565b600081519050919050565b600081905092915050565b60005b8381101561097a57808201518184015260208101905061095f565b60008484015250505050565b600061099182610946565b61099b8185610951565b93506109ab81856020860161095c565b80840191505092915050565b60006109c38284610986565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a08826108e5565b9150610a13836108e5565b9250828201905080821115610a2b57610a2a6109ce565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610a9e602683610a31565b9150610aa982610a42565b604082019050919050565b60006020820190508181036000830152610acd81610a91565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000610b0a602083610a31565b9150610b1582610ad4565b602082019050919050565b60006020820190508181036000830152610b3981610afd565b905091905056fea264697066735822122012b342beda6fc4f8b4a00001ced7224dae015a294f9978f0d9b57172d68b03bd64736f6c63430008110033", + "solcInputHash": "0934ff3c9c2ecd6d365975d91fef7cb5", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isapporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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/FundProject.sol\":\"FundProject\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract FundProject is Ownable {\\n error FundProject__NotApporovedByDao();\\n\\n uint256 public projectId = 1;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n }\\n\\n function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n _isApporovedByDao[projectId] = true;\\n projectId++;\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n _isApporovedByDao[_projecID] = false;\\n }\\n\\n function _isapporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n}\\n\",\"keccak256\":\"0x3d41ee36a763ea6697823208c87e02c74dd811980c78abc5a52ae1191f70f08e\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040526001805534801561001457600080fd5b5061003161002661003660201b60201c565b61003e60201b60201c565b610102565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61124a806101116000396000f3fe6080604052600436106100dd5760003560e01c80638da5cb5b1161007f578063ca1d209d11610059578063ca1d209d146102d2578063cf686259146102ee578063e983c2761461032b578063f2fde38b14610368576100dd565b80638da5cb5b1461022d5780638fb5548f14610258578063abe1aae614610295576100dd565b80634fac2bb7116100bb5780634fac2bb714610187578063715018a6146101c457806374c121b2146101db57806387030f4d14610204576100dd565b8063141a6c22146100e2578063148038b01461011f5780633fafa1271461015c575b600080fd5b3480156100ee57600080fd5b5061010960048036038101906101049190610a98565b610391565b6040516101169190610afa565b60405180910390f35b34801561012b57600080fd5b5061014660048036038101906101419190610b9f565b6103b9565b6040516101539190610afa565b60405180910390f35b34801561016857600080fd5b506101716103de565b60405161017e9190610afa565b60405180910390f35b34801561019357600080fd5b506101ae60048036038101906101a99190610bdf565b6103e4565b6040516101bb9190610c27565b60405180910390f35b3480156101d057600080fd5b506101d9610404565b005b3480156101e757600080fd5b5061020260048036038101906101fd9190610a98565b610418565b005b34801561021057600080fd5b5061022b60048036038101906102269190610bdf565b6104b1565b005b34801561023957600080fd5b506102426104e8565b60405161024f9190610c51565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a9190610bdf565b610511565b60405161028c9190610ceb565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190610bdf565b6105b1565b6040516102c99190610ceb565b60405180910390f35b6102ec60048036038101906102e79190610bdf565b610656565b005b3480156102fa57600080fd5b5061031560048036038101906103109190610a98565b610719565b6040516103229190610afa565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190610bdf565b610747565b60405161035f9190610c27565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190610d0d565b610771565b005b60006002826040516103a39190610d76565b9081526020016040518091039020549050919050565b6004602052816000526040600020602052806000526040600020600091509150505481565b60015481565b60056020528060005260406000206000915054906101000a900460ff1681565b61040c6107f4565b6104166000610872565b565b6104206107f4565b6001546002826040516104339190610d76565b9081526020016040518091039020819055508060036000600154815260200190815260200160002090816104679190610f99565b50600160056000600154815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008154809291906104a99061109a565b919050555050565b6104b96107f4565b60006005600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6003602052806000526040600020600091509050805461053090610dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461055c90610dbc565b80156105a95780601f1061057e576101008083540402835291602001916105a9565b820191906000526020600020905b81548152906001019060200180831161058c57829003601f168201915b505050505081565b60606003600083815260200190815260200160002080546105d190610dbc565b80601f01602080910402602001604051908101604052809291908181526020018280546105fd90610dbc565b801561064a5780601f1061061f5761010080835404028352916020019161064a565b820191906000526020600020905b81548152906001019060200180831161062d57829003601f168201915b50505050509050919050565b806005600082815260200190815260200160002060009054906101000a900460ff166106ae576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461070e91906110e2565b925050819055505050565b6002818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60006005600083815260200190815260200160002060009054906101000a900460ff169050919050565b6107796107f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611188565b60405180910390fd5b6107f181610872565b50565b6107fc610936565b73ffffffffffffffffffffffffffffffffffffffff1661081a6104e8565b73ffffffffffffffffffffffffffffffffffffffff1614610870576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610867906111f4565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6109a58261095c565b810181811067ffffffffffffffff821117156109c4576109c361096d565b5b80604052505050565b60006109d761093e565b90506109e3828261099c565b919050565b600067ffffffffffffffff821115610a0357610a0261096d565b5b610a0c8261095c565b9050602081019050919050565b82818337600083830152505050565b6000610a3b610a36846109e8565b6109cd565b905082815260208101848484011115610a5757610a56610957565b5b610a62848285610a19565b509392505050565b600082601f830112610a7f57610a7e610952565b5b8135610a8f848260208601610a28565b91505092915050565b600060208284031215610aae57610aad610948565b5b600082013567ffffffffffffffff811115610acc57610acb61094d565b5b610ad884828501610a6a565b91505092915050565b6000819050919050565b610af481610ae1565b82525050565b6000602082019050610b0f6000830184610aeb565b92915050565b610b1e81610ae1565b8114610b2957600080fd5b50565b600081359050610b3b81610b15565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6c82610b41565b9050919050565b610b7c81610b61565b8114610b8757600080fd5b50565b600081359050610b9981610b73565b92915050565b60008060408385031215610bb657610bb5610948565b5b6000610bc485828601610b2c565b9250506020610bd585828601610b8a565b9150509250929050565b600060208284031215610bf557610bf4610948565b5b6000610c0384828501610b2c565b91505092915050565b60008115159050919050565b610c2181610c0c565b82525050565b6000602082019050610c3c6000830184610c18565b92915050565b610c4b81610b61565b82525050565b6000602082019050610c666000830184610c42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ca6578082015181840152602081019050610c8b565b60008484015250505050565b6000610cbd82610c6c565b610cc78185610c77565b9350610cd7818560208601610c88565b610ce08161095c565b840191505092915050565b60006020820190508181036000830152610d058184610cb2565b905092915050565b600060208284031215610d2357610d22610948565b5b6000610d3184828501610b8a565b91505092915050565b600081905092915050565b6000610d5082610c6c565b610d5a8185610d3a565b9350610d6a818560208601610c88565b80840191505092915050565b6000610d828284610d45565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dd457607f821691505b602082108103610de757610de6610d8d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302610e4f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610e12565b610e598683610e12565b95508019841693508086168417925050509392505050565b6000819050919050565b6000610e96610e91610e8c84610ae1565b610e71565b610ae1565b9050919050565b6000819050919050565b610eb083610e7b565b610ec4610ebc82610e9d565b848454610e1f565b825550505050565b600090565b610ed9610ecc565b610ee4818484610ea7565b505050565b5b81811015610f0857610efd600082610ed1565b600181019050610eea565b5050565b601f821115610f4d57610f1e81610ded565b610f2784610e02565b81016020851015610f36578190505b610f4a610f4285610e02565b830182610ee9565b50505b505050565b600082821c905092915050565b6000610f7060001984600802610f52565b1980831691505092915050565b6000610f898383610f5f565b9150826002028217905092915050565b610fa282610c6c565b67ffffffffffffffff811115610fbb57610fba61096d565b5b610fc58254610dbc565b610fd0828285610f0c565b600060209050601f8311600181146110035760008415610ff1578287015190505b610ffb8582610f7d565b865550611063565b601f19841661101186610ded565b60005b8281101561103957848901518255600182019150602085019450602081019050611014565b868310156110565784890151611052601f891682610f5f565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006110a582610ae1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036110d7576110d661106b565b5b600182019050919050565b60006110ed82610ae1565b91506110f883610ae1565b92508282019050808211156111105761110f61106b565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611172602683610c77565b915061117d82611116565b604082019050919050565b600060208201905081810360008301526111a181611165565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006111de602083610c77565b91506111e9826111a8565b602082019050919050565b6000602082019050818103600083015261120d816111d1565b905091905056fea264697066735822122068e9250b9ff0fb4d5389f090651a4b0f2725e27ac47b7d2efd97167c68cac4c264736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106100dd5760003560e01c80638da5cb5b1161007f578063ca1d209d11610059578063ca1d209d146102d2578063cf686259146102ee578063e983c2761461032b578063f2fde38b14610368576100dd565b80638da5cb5b1461022d5780638fb5548f14610258578063abe1aae614610295576100dd565b80634fac2bb7116100bb5780634fac2bb714610187578063715018a6146101c457806374c121b2146101db57806387030f4d14610204576100dd565b8063141a6c22146100e2578063148038b01461011f5780633fafa1271461015c575b600080fd5b3480156100ee57600080fd5b5061010960048036038101906101049190610a98565b610391565b6040516101169190610afa565b60405180910390f35b34801561012b57600080fd5b5061014660048036038101906101419190610b9f565b6103b9565b6040516101539190610afa565b60405180910390f35b34801561016857600080fd5b506101716103de565b60405161017e9190610afa565b60405180910390f35b34801561019357600080fd5b506101ae60048036038101906101a99190610bdf565b6103e4565b6040516101bb9190610c27565b60405180910390f35b3480156101d057600080fd5b506101d9610404565b005b3480156101e757600080fd5b5061020260048036038101906101fd9190610a98565b610418565b005b34801561021057600080fd5b5061022b60048036038101906102269190610bdf565b6104b1565b005b34801561023957600080fd5b506102426104e8565b60405161024f9190610c51565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a9190610bdf565b610511565b60405161028c9190610ceb565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190610bdf565b6105b1565b6040516102c99190610ceb565b60405180910390f35b6102ec60048036038101906102e79190610bdf565b610656565b005b3480156102fa57600080fd5b5061031560048036038101906103109190610a98565b610719565b6040516103229190610afa565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190610bdf565b610747565b60405161035f9190610c27565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190610d0d565b610771565b005b60006002826040516103a39190610d76565b9081526020016040518091039020549050919050565b6004602052816000526040600020602052806000526040600020600091509150505481565b60015481565b60056020528060005260406000206000915054906101000a900460ff1681565b61040c6107f4565b6104166000610872565b565b6104206107f4565b6001546002826040516104339190610d76565b9081526020016040518091039020819055508060036000600154815260200190815260200160002090816104679190610f99565b50600160056000600154815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008154809291906104a99061109a565b919050555050565b6104b96107f4565b60006005600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6003602052806000526040600020600091509050805461053090610dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461055c90610dbc565b80156105a95780601f1061057e576101008083540402835291602001916105a9565b820191906000526020600020905b81548152906001019060200180831161058c57829003601f168201915b505050505081565b60606003600083815260200190815260200160002080546105d190610dbc565b80601f01602080910402602001604051908101604052809291908181526020018280546105fd90610dbc565b801561064a5780601f1061061f5761010080835404028352916020019161064a565b820191906000526020600020905b81548152906001019060200180831161062d57829003601f168201915b50505050509050919050565b806005600082815260200190815260200160002060009054906101000a900460ff166106ae576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461070e91906110e2565b925050819055505050565b6002818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60006005600083815260200190815260200160002060009054906101000a900460ff169050919050565b6107796107f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611188565b60405180910390fd5b6107f181610872565b50565b6107fc610936565b73ffffffffffffffffffffffffffffffffffffffff1661081a6104e8565b73ffffffffffffffffffffffffffffffffffffffff1614610870576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610867906111f4565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6109a58261095c565b810181811067ffffffffffffffff821117156109c4576109c361096d565b5b80604052505050565b60006109d761093e565b90506109e3828261099c565b919050565b600067ffffffffffffffff821115610a0357610a0261096d565b5b610a0c8261095c565b9050602081019050919050565b82818337600083830152505050565b6000610a3b610a36846109e8565b6109cd565b905082815260208101848484011115610a5757610a56610957565b5b610a62848285610a19565b509392505050565b600082601f830112610a7f57610a7e610952565b5b8135610a8f848260208601610a28565b91505092915050565b600060208284031215610aae57610aad610948565b5b600082013567ffffffffffffffff811115610acc57610acb61094d565b5b610ad884828501610a6a565b91505092915050565b6000819050919050565b610af481610ae1565b82525050565b6000602082019050610b0f6000830184610aeb565b92915050565b610b1e81610ae1565b8114610b2957600080fd5b50565b600081359050610b3b81610b15565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6c82610b41565b9050919050565b610b7c81610b61565b8114610b8757600080fd5b50565b600081359050610b9981610b73565b92915050565b60008060408385031215610bb657610bb5610948565b5b6000610bc485828601610b2c565b9250506020610bd585828601610b8a565b9150509250929050565b600060208284031215610bf557610bf4610948565b5b6000610c0384828501610b2c565b91505092915050565b60008115159050919050565b610c2181610c0c565b82525050565b6000602082019050610c3c6000830184610c18565b92915050565b610c4b81610b61565b82525050565b6000602082019050610c666000830184610c42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ca6578082015181840152602081019050610c8b565b60008484015250505050565b6000610cbd82610c6c565b610cc78185610c77565b9350610cd7818560208601610c88565b610ce08161095c565b840191505092915050565b60006020820190508181036000830152610d058184610cb2565b905092915050565b600060208284031215610d2357610d22610948565b5b6000610d3184828501610b8a565b91505092915050565b600081905092915050565b6000610d5082610c6c565b610d5a8185610d3a565b9350610d6a818560208601610c88565b80840191505092915050565b6000610d828284610d45565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dd457607f821691505b602082108103610de757610de6610d8d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302610e4f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610e12565b610e598683610e12565b95508019841693508086168417925050509392505050565b6000819050919050565b6000610e96610e91610e8c84610ae1565b610e71565b610ae1565b9050919050565b6000819050919050565b610eb083610e7b565b610ec4610ebc82610e9d565b848454610e1f565b825550505050565b600090565b610ed9610ecc565b610ee4818484610ea7565b505050565b5b81811015610f0857610efd600082610ed1565b600181019050610eea565b5050565b601f821115610f4d57610f1e81610ded565b610f2784610e02565b81016020851015610f36578190505b610f4a610f4285610e02565b830182610ee9565b50505b505050565b600082821c905092915050565b6000610f7060001984600802610f52565b1980831691505092915050565b6000610f898383610f5f565b9150826002028217905092915050565b610fa282610c6c565b67ffffffffffffffff811115610fbb57610fba61096d565b5b610fc58254610dbc565b610fd0828285610f0c565b600060209050601f8311600181146110035760008415610ff1578287015190505b610ffb8582610f7d565b865550611063565b601f19841661101186610ded565b60005b8281101561103957848901518255600182019150602085019450602081019050611014565b868310156110565784890151611052601f891682610f5f565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006110a582610ae1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036110d7576110d661106b565b5b600182019050919050565b60006110ed82610ae1565b91506110f883610ae1565b92508282019050808211156111105761110f61106b565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611172602683610c77565b915061117d82611116565b604082019050919050565b600060208201905081810360008301526111a181611165565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006111de602083610c77565b91506111e9826111a8565b602082019050919050565b6000602082019050818103600083015261120d816111d1565b905091905056fea264697066735822122068e9250b9ff0fb4d5389f090651a4b0f2725e27ac47b7d2efd97167c68cac4c264736f6c63430008110033", "devdoc": { "kind": "dev", "methods": { @@ -228,20 +317,44 @@ "type": "t_address" }, { - "astId": 147, + "astId": 144, "contract": "contracts/FundProject.sol:FundProject", - "label": "funders", + "label": "projectId", "offset": 0, "slot": "1", - "type": "t_mapping(t_string_memory_ptr,t_mapping(t_address,t_uint256))" + "type": "t_uint256" }, { - "astId": 151, + "astId": 148, "contract": "contracts/FundProject.sol:FundProject", - "label": "_isApporovedByDao", + "label": "hashToProjectId", "offset": 0, "slot": "2", - "type": "t_mapping(t_string_memory_ptr,t_bool)" + "type": "t_mapping(t_string_memory_ptr,t_uint256)" + }, + { + "astId": 152, + "contract": "contracts/FundProject.sol:FundProject", + "label": "idToHash", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_uint256,t_string_storage)" + }, + { + "astId": 158, + "contract": "contracts/FundProject.sol:FundProject", + "label": "funders", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" + }, + { + "astId": 162, + "contract": "contracts/FundProject.sol:FundProject", + "label": "_isApporovedByDao", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_bool)" } ], "types": { @@ -262,25 +375,44 @@ "numberOfBytes": "32", "value": "t_uint256" }, - "t_mapping(t_string_memory_ptr,t_bool)": { + "t_mapping(t_string_memory_ptr,t_uint256)": { "encoding": "mapping", "key": "t_string_memory_ptr", - "label": "mapping(string => bool)", + "label": "mapping(string => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_uint256,t_bool)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bool)", "numberOfBytes": "32", "value": "t_bool" }, - "t_mapping(t_string_memory_ptr,t_mapping(t_address,t_uint256))": { + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { "encoding": "mapping", - "key": "t_string_memory_ptr", - "label": "mapping(string => mapping(address => uint256))", + "key": "t_uint256", + "label": "mapping(uint256 => mapping(address => uint256))", "numberOfBytes": "32", "value": "t_mapping(t_address,t_uint256)" }, + "t_mapping(t_uint256,t_string_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => string)", + "numberOfBytes": "32", + "value": "t_string_storage" + }, "t_string_memory_ptr": { "encoding": "bytes", "label": "string", "numberOfBytes": "32" }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, "t_uint256": { "encoding": "inplace", "label": "uint256", diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index eeee5d3..5097bd9 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -671,7 +671,7 @@ "transactionIndex": 0, "gasUsed": "3606454", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000410000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000008000000000020000000000000000000000000200000000000000000000000000000000000000000", - "blockHash": "0x494cd87aef1ce42710078a5715e8771d1771e8b803f136e00ee7c1b1bc1f0e1a", + "blockHash": "0x4b926420f3f972c69a385274ba00055d9c5bb46d1bc930ce20e9ac94d823005a", "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", "logs": [ { @@ -686,7 +686,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 0, - "blockHash": "0x494cd87aef1ce42710078a5715e8771d1771e8b803f136e00ee7c1b1bc1f0e1a" + "blockHash": "0x4b926420f3f972c69a385274ba00055d9c5bb46d1bc930ce20e9ac94d823005a" }, { "transactionIndex": 0, @@ -700,7 +700,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 1, - "blockHash": "0x494cd87aef1ce42710078a5715e8771d1771e8b803f136e00ee7c1b1bc1f0e1a" + "blockHash": "0x4b926420f3f972c69a385274ba00055d9c5bb46d1bc930ce20e9ac94d823005a" } ], "blockNumber": 1, diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json index b65489c..b6a0103 100644 --- a/deployments/localhost/GovernerContract.json +++ b/deployments/localhost/GovernerContract.json @@ -1,5 +1,5 @@ { - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "abi": [ { "inputs": [ @@ -1253,86 +1253,86 @@ "type": "receive" } ], - "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "contractAddress": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "transactionIndex": 0, "gasUsed": "6161333", - "logsBloom": "0x00000000000000000100000000001000000000000000000000000000000008000000000000000000000000000010000000000000000040200000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000080002000000000000000000000000000000000000000000001000002000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000001000000000080000800000000000000000000000000000000000000000000000000000400000000000002000", - "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d", - "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", + "logsBloom": "0x00000000000000000100000000001000000000000000000000000000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000000000000000000000010000000000000000000000000080002000000000000000000000000000000000000000000001000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000001000000000080000800000000000000000000000000000000000000000000000000000000000000000002000", + "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4", + "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", "logs": [ { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 4, + "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 0, - "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 4, + "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" ], "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8", "logIndex": 1, - "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 4, + "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 2, - "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 4, + "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 3, - "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x2243fcacc325f06ba205a5afd9ac93149f84c5591ec29bfdff1948f74aced7d5", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 4, + "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f0512", + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0", "logIndex": 4, - "blockHash": "0xae2f74d3187775714e46f9f1359178fd20c3f21297ae059779bf7025d4d5f06d" + "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" } ], - "blockNumber": 3, + "blockNumber": 4, "cumulativeGasUsed": "6161333", "status": 1, "byzantium": true }, "args": [ "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", 0, 200, 0 diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json index daab2e2..3489558 100644 --- a/deployments/localhost/TimeLock.json +++ b/deployments/localhost/TimeLock.json @@ -1,5 +1,5 @@ { - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "abi": [ { "inputs": [ @@ -867,22 +867,22 @@ "type": "receive" } ], - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "contractAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "transactionIndex": 0, "gasUsed": "3021451", - "logsBloom": "0x00000004000000000c000000000000000a0000000000000000000000000000000000000000000000000000000001000010000000000000000200000010200000000000000000000000000010000000000000000000000000000000000001000000000000020000400000000100000800000000000000000000020004000000000000000000000000000000000000000000000000000000080000000000000000000000000020000000000002000000000000000000000000001000000000000000000000000000204000000000001000000200002000000100000100200020000000000000001000000000000000000000000000000000800000000000000000", - "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a", - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", + "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000400000001000000400000000040200200000010200000000000000000000000000010000000000000000000000000000000000001400000000000020000400000000100000800000000000000000000020000000000000000000000000000000000000000000000000000000000080000000000000000000000000020000000000000000000000000000000000000001000000000000000000000000000204000000000000000000200002000000100000100200020000000000000001000000000000000000000000000000000400000000000000000", + "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c", + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", "logs": [ { "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "blockNumber": 3, + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", @@ -891,13 +891,13 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" }, { "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "blockNumber": 3, + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", "0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1", @@ -906,13 +906,13 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" }, { "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "blockNumber": 3, + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", "0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63", @@ -921,13 +921,13 @@ ], "data": "0x", "logIndex": 2, - "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" }, { "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "blockNumber": 3, + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", "0xfd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", @@ -936,13 +936,13 @@ ], "data": "0x", "logIndex": 3, - "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" }, { "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "blockNumber": 3, + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", @@ -951,37 +951,37 @@ ], "data": "0x", "logIndex": 4, - "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" }, { "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "blockNumber": 3, + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f0512", + "0x0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0", "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" ], "data": "0x", "logIndex": 5, - "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" }, { "transactionIndex": 0, - "blockNumber": 2, - "transactionHash": "0x70ab632b69e014e2d10efbea342445fa60404584e5f9c383896046e88b412334", - "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "blockNumber": 3, + "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "topics": [ "0x11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 6, - "blockHash": "0x9ff12f4fdfa8d3bad15796e1af967fef05ca2da3a769034b4a824897e3b8441a" + "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" } ], - "blockNumber": 2, + "blockNumber": 3, "cumulativeGasUsed": "3021451", "status": 1, "byzantium": true diff --git a/deployments/localhost/solcInputs/88b66c97de3b803518e048c2fd73f192.json b/deployments/localhost/solcInputs/0934ff3c9c2ecd6d365975d91fef7cb5.json similarity index 72% rename from deployments/localhost/solcInputs/88b66c97de3b803518e048c2fd73f192.json rename to deployments/localhost/solcInputs/0934ff3c9c2ecd6d365975d91fef7cb5.json index a091199..2411c7d 100644 --- a/deployments/localhost/solcInputs/88b66c97de3b803518e048c2fd73f192.json +++ b/deployments/localhost/solcInputs/0934ff3c9c2ecd6d365975d91fef7cb5.json @@ -2,7 +2,7 @@ "language": "Solidity", "sources": { "contracts/FundProject.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract FundProject is Ownable {\n error FundProject__NotApporovedByDao();\n\n mapping(string => mapping(address => uint256)) public funders;\n mapping(string => bool) public _isApporovedByDao;\n\n modifier isApporovedByDao(string memory _ipfsHash) {\n if (!_isApporovedByDao[_ipfsHash])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n function fund(string memory ipfsHash)\n public\n payable\n isApporovedByDao(ipfsHash)\n {\n funders[ipfsHash][msg.sender] += msg.value;\n }\n\n function apporoveFundingByDao(string memory _project) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_project] = true;\n }\n\n function cancelApporovelFundingByDao(string memory _project)\n external\n onlyOwner\n {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_project] = false;\n }\n\n function _isapporoveFundingByDao(string memory _project)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_project];\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract FundProject is Ownable {\n error FundProject__NotApporovedByDao();\n\n uint256 public projectId = 1;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => bool) public _isApporovedByDao;\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n }\n\n function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n _isApporovedByDao[projectId] = true;\n projectId++;\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_projecID] = false;\n }\n\n function _isapporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n}\n" }, "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" diff --git a/proposals.json b/proposals.json index 38c0884..c76301b 100644 --- a/proposals.json +++ b/proposals.json @@ -1 +1 @@ -{"31337":["93635954656928978411172927636668390692728594276035597100601248699871636060072"]} \ No newline at end of file +{"31337":["80593019978336960554916183662682172860336371144993872300230438883412700739697"]} \ No newline at end of file diff --git a/scripts/queue-and-execute-afterSubmit.js b/scripts/queue-and-execute-afterSubmit.js index e4007b6..5e3ff1d 100644 --- a/scripts/queue-and-execute-afterSubmit.js +++ b/scripts/queue-and-execute-afterSubmit.js @@ -13,9 +13,47 @@ const { moveTime } = require("../utils/move-time"); const fs = require("fs"); async function queue_and_execute_afterSubmit() { - const proposalDescription = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMUU"; - + const proposalDescription = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; + const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; const fundProjectContract = await ethers.getContract("FundProject"); + let projectId = await fundProjectContract._getProjectId(args); + console.log(projectId.toString()); + console.log(await fundProjectContract._isapporoveFundingByDao(projectId)); + const encodedFunctionCall = fundProjectContract.interface.encodeFunctionData( + FUNC_FUND, + [args] + ); + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(proposalDescription) + ); + + const governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + const queueTx = await governor.queue( + [fundProjectContract.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await queueTx.wait(1); + + if (developmentChains.includes(network.name)) { + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + } + + console.log("Executing..."); + const executeTx = await governor.execute( + [fundProjectContract.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await executeTx.wait(1); + + projectId = await fundProjectContract._getProjectId(args); + console.log(projectId.toString()); + console.log(await fundProjectContract._isapporoveFundingByDao(projectId)); } queue_and_execute_afterSubmit() diff --git a/scripts/submit_and_propose.js b/scripts/submit_and_propose.js index 7a54491..f4c97b4 100644 --- a/scripts/submit_and_propose.js +++ b/scripts/submit_and_propose.js @@ -36,7 +36,6 @@ const projectDataTemplate = { fundRaisingGoalAmount: "", roadMap: "", otherSources: "", - projectID: "", }; async function submitAndPropose( @@ -81,22 +80,18 @@ async function submitAndPropose( const proposalDescription = ProjectMetadataUploadResponse.IpfsHash; const governor = await ethers.getContract("GovernerContract"); - const fundProject = await ethers.getContract("FundProject"); + const fundProjectContract = await ethers.getContract("FundProject"); - console.log(proposalDescription); - const args = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(proposalDescription) + const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; + const encodedFunctionCall = fundProjectContract.interface.encodeFunctionData( + FUNC_FUND, + [args] ); - const hexOfFundFunction = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(FUNC_FUND) - ); - - const encodedFunctionCall = hexOfFundFunction.toString() + args.toString(); const proposalTx = await governor.propose( - [fundProject.address], + [fundProjectContract.address], [0], - [ethers.utils.hexlify(ethers.utils.toUtf8Bytes(encodedFunctionCall))], + [encodedFunctionCall], args ); const proposeReceipt = await proposalTx.wait(1); @@ -109,39 +104,8 @@ async function submitAndPropose( proposals[network.config.chainId.toString()].push(proposalId.toString()); fs.writeFileSync(proposalsFile, JSON.stringify(proposals)); - console.log(`Proposing ${FUNC_FUND} on ${fundProject.address}`); - console.log(`Proposal description: \n ${proposalDescription}`); - console.log(`encodedFunctioncall ${encodedFunctionCall}`); - - /* const hexOfFundFunction = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(FUNC_FUND) - ); - const hexOfProposalDescription = ethers.utils.hexlify( - ethers.utils.toUtf8Bytes(proposalDescription) - ); - - const encodedFunctionCall = - hexOfFundFunction.toString() + hexOfProposalDescription.toString(); - - const proposalTx = await governor.propose( - [fundProject.address], - [0], - [ethers.utils.hexlify(ethers.utils.toUtf8Bytes(encodedFunctionCall))], - proposalDescription - ); - const proposeReceipt = await proposalTx.wait(1); - - if (developmentChains.includes(network.name)) { - await moveBlocks(VOTING_DELAY + 1); - } - const proposalId = proposeReceipt.events[0].args.proposalId; - let proposals = JSON.parse(fs.readFileSync(proposalsFile), "utf8"); - proposals[network.config.chainId.toString()].push(proposalId.toString()); - fs.writeFileSync(proposalsFile, JSON.stringify(proposals)); - - console.log(`Proposing ${FUNC_FUND} on ${fundProject.address}`); + console.log(`Proposing ${FUNC_FUND} on ${fundProjectContract.address}`); console.log(`Proposal description: \n ${proposalDescription}`); - console.log(`encodedFunctioncall ${encodedFunctionCall}`); */ return ProjectMetadataUploadResponse.IpfsHash; } diff --git a/scripts/vote.js b/scripts/vote.js index 7255f5d..a3230e2 100644 --- a/scripts/vote.js +++ b/scripts/vote.js @@ -27,6 +27,9 @@ async function vote(proposalIndex) { await moveBlocks(VOTING_PERIOD + 1); } console.log("Voted! Ready to gooo!"); + + let proposalState = await governor.state(proposalId); + console.log(proposalState); } vote(index) diff --git a/test/unit/fundProjectContract.test.js b/test/unit/fundProjectContract.test.js index 9c691e4..f7acaec 100644 --- a/test/unit/fundProjectContract.test.js +++ b/test/unit/fundProjectContract.test.js @@ -122,9 +122,11 @@ const fs = require("fs"); ); const proposalDescription = - "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMUU"; + "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; const encodedFunctionCall = - fundProjectContract.interface.encodeFunctionData(FUNC, [NEW_VALUE]); + fundProjectContract.interface.encodeFunctionData(FUNC_FUND, [ + proposalDescription, + ]); const proposalTx = await governor.propose( [fundProjectContract.address], @@ -225,7 +227,7 @@ const fs = require("fs"); console.log(`account2 hasVoted: ${hasVoted2}`); */ // account3 is voting ********************************************************** */ - // connect with account1 + // connect with account3 governor = await ethers.getContract( "GovernerContract", account3.address @@ -255,33 +257,37 @@ const fs = require("fs"); // its time to queue & execute - const descriptionHash = ethers.utils.keccak256(args); + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(proposalDescription) + ); governor = await ethers.getContract("GovernerContract"); console.log("Queueing..."); - console.log(encodedFunctionCall); - console.log(descriptionHash); - /* const queueTx = await governor.queue( + + const queueTx = await governor.queue( [fundProjectContract.address], [0], [encodedFunctionCall], descriptionHash ); - await queueTx.wait(1); */ + await queueTx.wait(1); await moveTime(MIN_DELAY + 1); await moveBlocks(1); console.log("Executing..."); - /* const executeTx = await governor.execute( + const executeTx = await governor.execute( [fundProjectContract.address], [0], [encodedFunctionCall], descriptionHash ); - await executeTx.wait(1); */ - - /* const fundable = await fundProjectContract._isApporoveFundingByDao( + await executeTx.wait(1); + const projectId = await fundProjectContract._getProjectId( proposalDescription ); - console.log(fundable); */ + const fundable = await fundProjectContract._isApporoveFundingByDao( + projectId + ); + + assert(fundable); }); }); }); From ea4432c3a99329a21e1d38048897d4d6943319e8 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Sun, 6 Nov 2022 10:30:45 +0300 Subject: [PATCH 11/28] add more test --- contracts/FundProject.sol | 25 ++- coverage.json | 2 +- coverage/contracts/Box.sol.html | 2 +- coverage/contracts/FundProject.sol.html | 139 ++++++++++++----- coverage/contracts/GovernanceToken.sol.html | 2 +- coverage/contracts/GovernerContract.sol.html | 18 +-- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 40 ++--- coverage/coverage-final.json | 4 +- coverage/index.html | 40 ++--- coverage/lcov-report/contracts/Box.sol.html | 2 +- .../contracts/FundProject.sol.html | 139 ++++++++++++----- .../contracts/GovernanceToken.sol.html | 2 +- .../contracts/GovernerContract.sol.html | 18 +-- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 40 ++--- coverage/lcov-report/index.html | 40 ++--- coverage/lcov.info | 104 +++++++------ helper-config.js | 2 + test/unit/fundProjectContract.test.js | 146 +++++++++++++++++- 20 files changed, 541 insertions(+), 228 deletions(-) diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index 4ad3430..be0cf7f 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -11,6 +11,8 @@ contract FundProject is Ownable { mapping(string => uint256) public hashToProjectId; mapping(uint256 => string) public idToHash; mapping(uint256 => mapping(address => uint256)) public funders; + mapping(uint256 => uint256) public projectFunds; + mapping(uint256 => uint256) public projectFundingGoalAmount; mapping(uint256 => bool) public _isApporovedByDao; modifier isApporovedByDao(uint256 _projecID) { @@ -25,10 +27,15 @@ contract FundProject is Ownable { isApporovedByDao(_projecID) { funders[_projecID][msg.sender] += msg.value; + projectFunds[_projecID] += msg.value; } - function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner { + function apporoveFundingByDao( + string memory _ipfsHash, + uint256 _fundingGoalAmount + ) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) + projectFundingGoalAmount[projectId] = _fundingGoalAmount; hashToProjectId[_ipfsHash] = projectId; idToHash[projectId] = _ipfsHash; _isApporovedByDao[projectId] = true; @@ -63,4 +70,20 @@ contract FundProject is Ownable { { return hashToProjectId[_ipfsHash]; } + + function _getBalanceOfProject(uint256 _projecID) + public + view + returns (uint256) + { + return projectFunds[_projecID]; + } + + function _getFundingGoalAmount(uint256 _projecID) + public + view + returns (uint256) + { + return projectFundingGoalAmount[_projecID]; + } } diff --git a/coverage.json b/coverage.json index 2fbe945..31a40b2 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/FundProject.sol":{"l":{"17":0,"18":0,"19":0,"27":0,"32":0,"33":0,"34":0,"35":0,"40":0,"48":0,"56":0,"64":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"1":[0,0]},"f":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"fnMap":{"1":{"name":"isApporovedByDao","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":4}}},"2":{"name":"fund","line":25,"loc":{"start":{"line":22,"column":4},"end":{"line":28,"column":4}}},"3":{"name":"apporoveFundingByDao","line":30,"loc":{"start":{"line":30,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":38,"loc":{"start":{"line":38,"column":4},"end":{"line":41,"column":4}}},"5":{"name":"_isapporoveFundingByDao","line":43,"loc":{"start":{"line":43,"column":4},"end":{"line":49,"column":4}}},"6":{"name":"_getHashOfProjectData","line":51,"loc":{"start":{"line":51,"column":4},"end":{"line":57,"column":4}}},"7":{"name":"_getProjectId","line":59,"loc":{"start":{"line":59,"column":4},"end":{"line":65,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":563}},"2":{"start":{"line":27,"column":8},"end":{"line":27,"column":50}},"3":{"start":{"line":32,"column":8},"end":{"line":32,"column":45}},"4":{"start":{"line":33,"column":8},"end":{"line":33,"column":38}},"5":{"start":{"line":34,"column":8},"end":{"line":34,"column":42}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":43}},"7":{"start":{"line":48,"column":8},"end":{"line":48,"column":43}},"8":{"start":{"line":56,"column":8},"end":{"line":56,"column":34}},"9":{"start":{"line":64,"column":8},"end":{"line":64,"column":41}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":2,"64":2,"73":6,"82":14,"91":2,"100":2,"110":1,"119":0,"128":2,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":2,"4":2,"5":6,"6":14,"7":2,"8":2,"9":1,"10":0,"11":2,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/FundProject.sol":{"l":{"19":1,"20":0,"21":1,"29":1,"30":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"55":2,"63":0,"71":2,"79":1,"87":1},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":0,"11":2,"12":1,"13":1},"b":{"1":[0,1]},"f":{"1":1,"2":1,"3":1,"4":1,"5":2,"6":0,"7":2,"8":1,"9":1},"fnMap":{"1":{"name":"isApporovedByDao","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"fund","line":27,"loc":{"start":{"line":24,"column":4},"end":{"line":31,"column":4}}},"3":{"name":"apporoveFundingByDao","line":36,"loc":{"start":{"line":33,"column":4},"end":{"line":43,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"5":{"name":"_isApporoveFundingByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":56,"column":4}}},"6":{"name":"_getHashOfProjectData","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":4}}},"7":{"name":"_getProjectId","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":72,"column":4}}},"8":{"name":"_getBalanceOfProject","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":4}}},"9":{"name":"_getFundingGoalAmount","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":88,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":681}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":50}},"3":{"start":{"line":30,"column":8},"end":{"line":30,"column":43}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":63}},"5":{"start":{"line":39,"column":8},"end":{"line":39,"column":45}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":38}},"7":{"start":{"line":41,"column":8},"end":{"line":41,"column":42}},"8":{"start":{"line":47,"column":8},"end":{"line":47,"column":43}},"9":{"start":{"line":55,"column":8},"end":{"line":55,"column":43}},"10":{"start":{"line":63,"column":8},"end":{"line":63,"column":34}},"11":{"start":{"line":71,"column":8},"end":{"line":71,"column":41}},"12":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"13":{"start":{"line":87,"column":8},"end":{"line":87,"column":50}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":4,"64":4,"73":12,"82":29,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":4,"3":4,"4":12,"5":29,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":4,"4":4,"5":12,"6":29,"7":4,"8":4,"9":3,"10":0,"11":6,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/Box.sol.html b/coverage/contracts/Box.sol.html index c7b3214..649ed12 100644 --- a/coverage/contracts/Box.sol.html +++ b/coverage/contracts/Box.sol.html @@ -118,7 +118,7 @@

diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html index a3c4188..4c020dc 100644 --- a/coverage/contracts/FundProject.sol.html +++ b/coverage/contracts/FundProject.sol.html @@ -20,28 +20,28 @@

- 0% + 92.31% Statements - 0/9 + 12/13
- 0% + 50% Branches - 0/2 + 1/2
- 0% + 88.89% Functions - 0/7 + 8/9
- 0% + 87.5% Lines - 0/12 + 14/16
-
+

contracts/
90.91%20/22100%2/290.48%19/2191.3%21/23contracts/
62.5%20/3233.33%2/665.52%19/2955.26%21/38
@@ -247,7 +316,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index 1b564af..abccd38 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -229,7 +229,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 9148424..4ed3a88 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -236,7 +236,7 @@

      - +       @@ -245,7 +245,7 @@

      - +       @@ -254,7 +254,7 @@

      - +12×       @@ -263,7 +263,7 @@

      -14× +29×       @@ -272,7 +272,7 @@

      - +       @@ -281,7 +281,7 @@

      - +       @@ -291,7 +291,7 @@

      - +       @@ -309,7 +309,7 @@

      - +       @@ -466,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index 67af6be..e59c2b3 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index 57728c0..a23d781 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,28 +20,28 @@

- 62.5% + 88.89% Statements - 20/32 + 32/36
- 33.33% + 50% Branches - 2/6 + 3/6
- 65.52% + 87.1% Functions - 19/29 + 27/31
- 55.26% + 83.33% Lines - 21/38 + 35/42
-
+
1 2 @@ -109,7 +109,30 @@

64 65 66 -67

  +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90        @@ -125,9 +148,11 @@

      +  +  +   -  -  +       @@ -135,28 +160,33 @@

      -  + +         -  -  -  -        + + + + +   -        +         -  +  +  +  +       @@ -172,7 +202,23 @@

      -  + +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +      

// SPDX-License-Identifier: MIT
@@ -188,41 +234,48 @@ 

mapping(string => uint256) public hashToProjectId; mapping(uint256 => string) public idToHash; mapping(uint256 => mapping(address => uint256)) public funders; + mapping(uint256 => uint256) public projectFunds; + mapping(uint256 => uint256) public projectFundingGoalAmount; mapping(uint256 => bool) public _isApporovedByDao;   - modifier isApporovedByDao(uint256 _projecID) { - if (!_isApporovedByDao[_projecID]) + modifier isApporovedByDao(uint256 _projecID) { + Iif (!_isApporovedByDao[_projecID]) revert FundProject__NotApporovedByDao(); _; }   - function fund(uint256 _projecID) + function fund(uint256 _projecID) public payable isApporovedByDao(_projecID) { - funders[_projecID][msg.sender] += msg.value; + funders[_projecID][msg.sender] += msg.value; + projectFunds[_projecID] += msg.value; }   - function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner { + function apporoveFundingByDao( + string memory _ipfsHash, + uint256 _fundingGoalAmount + ) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) - hashToProjectId[_ipfsHash] = projectId; - idToHash[projectId] = _ipfsHash; - _isApporovedByDao[projectId] = true; + projectFundingGoalAmount[projectId] = _fundingGoalAmount; + hashToProjectId[_ipfsHash] = projectId; + idToHash[projectId] = _ipfsHash; + _isApporovedByDao[projectId] = true; projectId++; }   - function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { + function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) - _isApporovedByDao[_projecID] = false; + _isApporovedByDao[_projecID] = false; }   - function _isapporoveFundingByDao(uint256 _projecID) + function _isApporoveFundingByDao(uint256 _projecID) external view returns (bool) { - return _isApporovedByDao[_projecID]; + return _isApporovedByDao[_projecID]; }   function _getHashOfProjectData(uint256 _projecID) @@ -233,12 +286,28 @@

return idToHash[_projecID]; }   - function _getProjectId(string memory _ipfsHash) + function _getProjectId(string memory _ipfsHash) + public + view + returns (uint256) + { + return hashToProjectId[_ipfsHash]; + } +  + function _getBalanceOfProject(uint256 _projecID) + public + view + returns (uint256) + { + return projectFunds[_projecID]; + } +  + function _getFundingGoalAmount(uint256 _projecID) public view returns (uint256) { - return hashToProjectId[_ipfsHash]; + return projectFundingGoalAmount[_projecID]; } }  

@@ -72,16 +72,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -129,7 +129,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 4ecbc13..4f4adf6 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,6 +1,6 @@ { "contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, -"contracts/FundProject.sol":{"l":{"17":0,"18":0,"19":0,"27":0,"32":0,"33":0,"34":0,"35":0,"40":0,"48":0,"56":0,"64":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"1":[0,0]},"f":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"fnMap":{"1":{"name":"isApporovedByDao","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":4}}},"2":{"name":"fund","line":25,"loc":{"start":{"line":22,"column":4},"end":{"line":28,"column":4}}},"3":{"name":"apporoveFundingByDao","line":30,"loc":{"start":{"line":30,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":38,"loc":{"start":{"line":38,"column":4},"end":{"line":41,"column":4}}},"5":{"name":"_isapporoveFundingByDao","line":43,"loc":{"start":{"line":43,"column":4},"end":{"line":49,"column":4}}},"6":{"name":"_getHashOfProjectData","line":51,"loc":{"start":{"line":51,"column":4},"end":{"line":57,"column":4}}},"7":{"name":"_getProjectId","line":59,"loc":{"start":{"line":59,"column":4},"end":{"line":65,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":563}},"2":{"start":{"line":27,"column":8},"end":{"line":27,"column":50}},"3":{"start":{"line":32,"column":8},"end":{"line":32,"column":45}},"4":{"start":{"line":33,"column":8},"end":{"line":33,"column":38}},"5":{"start":{"line":34,"column":8},"end":{"line":34,"column":42}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":43}},"7":{"start":{"line":48,"column":8},"end":{"line":48,"column":43}},"8":{"start":{"line":56,"column":8},"end":{"line":56,"column":34}},"9":{"start":{"line":64,"column":8},"end":{"line":64,"column":41}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, +"contracts/FundProject.sol":{"l":{"19":1,"20":0,"21":1,"29":1,"30":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"55":2,"63":0,"71":2,"79":1,"87":1},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":0,"11":2,"12":1,"13":1},"b":{"1":[0,1]},"f":{"1":1,"2":1,"3":1,"4":1,"5":2,"6":0,"7":2,"8":1,"9":1},"fnMap":{"1":{"name":"isApporovedByDao","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"fund","line":27,"loc":{"start":{"line":24,"column":4},"end":{"line":31,"column":4}}},"3":{"name":"apporoveFundingByDao","line":36,"loc":{"start":{"line":33,"column":4},"end":{"line":43,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"5":{"name":"_isApporoveFundingByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":56,"column":4}}},"6":{"name":"_getHashOfProjectData","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":4}}},"7":{"name":"_getProjectId","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":72,"column":4}}},"8":{"name":"_getBalanceOfProject","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":4}}},"9":{"name":"_getFundingGoalAmount","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":88,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":681}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":50}},"3":{"start":{"line":30,"column":8},"end":{"line":30,"column":43}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":63}},"5":{"start":{"line":39,"column":8},"end":{"line":39,"column":45}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":38}},"7":{"start":{"line":41,"column":8},"end":{"line":41,"column":42}},"8":{"start":{"line":47,"column":8},"end":{"line":47,"column":43}},"9":{"start":{"line":55,"column":8},"end":{"line":55,"column":43}},"10":{"start":{"line":63,"column":8},"end":{"line":63,"column":34}},"11":{"start":{"line":71,"column":8},"end":{"line":71,"column":41}},"12":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"13":{"start":{"line":87,"column":8},"end":{"line":87,"column":50}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}}, "contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, -"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":2,"64":2,"73":6,"82":14,"91":2,"100":2,"110":1,"119":0,"128":2,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":2,"3":2,"4":6,"5":14,"6":2,"7":2,"8":1,"9":0,"10":2,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":2,"4":2,"5":6,"6":14,"7":2,"8":2,"9":1,"10":0,"11":2,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}}, +"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":4,"64":4,"73":12,"82":29,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":4,"3":4,"4":12,"5":29,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":4,"4":4,"5":12,"6":29,"7":4,"8":4,"9":3,"10":0,"11":6,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index cf86e08..fb79b09 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,28 +20,28 @@

- 62.5% + 88.89% Statements - 20/32 + 32/36
- 33.33% + 50% Branches - 2/6 + 3/6
- 65.52% + 87.1% Functions - 19/29 + 27/31
- 55.26% + 83.33% Lines - 21/38 + 35/42
-
+
FundProject.sol
0%0/90%0/20%0/70%0/12FundProject.sol
92.31%12/1350%1/288.89%8/987.5%14/16
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/Box.sol.html b/coverage/lcov-report/contracts/Box.sol.html index c7b3214..649ed12 100644 --- a/coverage/lcov-report/contracts/Box.sol.html +++ b/coverage/lcov-report/contracts/Box.sol.html @@ -118,7 +118,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html index a3c4188..4c020dc 100644 --- a/coverage/lcov-report/contracts/FundProject.sol.html +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -20,28 +20,28 @@

- 0% + 92.31% Statements - 0/9 + 12/13
- 0% + 50% Branches - 0/2 + 1/2
- 0% + 88.89% Functions - 0/7 + 8/9
- 0% + 87.5% Lines - 0/12 + 14/16
-
+
contracts/
62.5%20/3233.33%2/665.52%19/2955.26%21/38contracts/
88.89%32/3650%3/687.1%27/3183.33%35/42
@@ -247,7 +316,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index 1b564af..abccd38 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -229,7 +229,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 9148424..4ed3a88 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -236,7 +236,7 @@

      - +       @@ -245,7 +245,7 @@

      - +       @@ -254,7 +254,7 @@

      - +12×       @@ -263,7 +263,7 @@

      -14× +29×       @@ -272,7 +272,7 @@

      - +       @@ -281,7 +281,7 @@

      - +       @@ -291,7 +291,7 @@

      - +       @@ -309,7 +309,7 @@

      - +       @@ -466,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index 67af6be..e59c2b3 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index 57728c0..a23d781 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,28 +20,28 @@

- 62.5% + 88.89% Statements - 20/32 + 32/36
- 33.33% + 50% Branches - 2/6 + 3/6
- 65.52% + 87.1% Functions - 19/29 + 27/31
- 55.26% + 83.33% Lines - 21/38 + 35/42
-
+
1 2 @@ -109,7 +109,30 @@

64 65 66 -67

  +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90        @@ -125,9 +148,11 @@

      +  +  +   -  -  +       @@ -135,28 +160,33 @@

      -  + +         -  -  -  -        + + + + +   -        +         -  +  +  +  +       @@ -172,7 +202,23 @@

      -  + +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +      

// SPDX-License-Identifier: MIT
@@ -188,41 +234,48 @@ 

mapping(string => uint256) public hashToProjectId; mapping(uint256 => string) public idToHash; mapping(uint256 => mapping(address => uint256)) public funders; + mapping(uint256 => uint256) public projectFunds; + mapping(uint256 => uint256) public projectFundingGoalAmount; mapping(uint256 => bool) public _isApporovedByDao;   - modifier isApporovedByDao(uint256 _projecID) { - if (!_isApporovedByDao[_projecID]) + modifier isApporovedByDao(uint256 _projecID) { + Iif (!_isApporovedByDao[_projecID]) revert FundProject__NotApporovedByDao(); _; }   - function fund(uint256 _projecID) + function fund(uint256 _projecID) public payable isApporovedByDao(_projecID) { - funders[_projecID][msg.sender] += msg.value; + funders[_projecID][msg.sender] += msg.value; + projectFunds[_projecID] += msg.value; }   - function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner { + function apporoveFundingByDao( + string memory _ipfsHash, + uint256 _fundingGoalAmount + ) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) - hashToProjectId[_ipfsHash] = projectId; - idToHash[projectId] = _ipfsHash; - _isApporovedByDao[projectId] = true; + projectFundingGoalAmount[projectId] = _fundingGoalAmount; + hashToProjectId[_ipfsHash] = projectId; + idToHash[projectId] = _ipfsHash; + _isApporovedByDao[projectId] = true; projectId++; }   - function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { + function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) - _isApporovedByDao[_projecID] = false; + _isApporovedByDao[_projecID] = false; }   - function _isapporoveFundingByDao(uint256 _projecID) + function _isApporoveFundingByDao(uint256 _projecID) external view returns (bool) { - return _isApporovedByDao[_projecID]; + return _isApporovedByDao[_projecID]; }   function _getHashOfProjectData(uint256 _projecID) @@ -233,12 +286,28 @@

return idToHash[_projecID]; }   - function _getProjectId(string memory _ipfsHash) + function _getProjectId(string memory _ipfsHash) + public + view + returns (uint256) + { + return hashToProjectId[_ipfsHash]; + } +  + function _getBalanceOfProject(uint256 _projecID) + public + view + returns (uint256) + { + return projectFunds[_projecID]; + } +  + function _getFundingGoalAmount(uint256 _projecID) public view returns (uint256) { - return hashToProjectId[_ipfsHash]; + return projectFundingGoalAmount[_projecID]; } }  

@@ -72,16 +72,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -129,7 +129,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index cf86e08..fb79b09 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,28 +20,28 @@

- 62.5% + 88.89% Statements - 20/32 + 32/36
- 33.33% + 50% Branches - 2/6 + 3/6
- 65.52% + 87.1% Functions - 19/29 + 27/31
- 55.26% + 83.33% Lines - 21/38 + 35/42
-
+
FundProject.sol
0%0/90%0/20%0/70%0/12FundProject.sol
92.31%12/1350%1/288.89%8/987.5%14/16
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 1f8b9d5..8e84067 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -16,40 +16,48 @@ BRH:0 end_of_record TN: SF:/home/furkansezal/dao/contracts/FundProject.sol -FN:16,isApporovedByDao -FN:25,fund -FN:30,apporoveFundingByDao -FN:38,cancelApporovelFundingByDao -FN:43,_isapporoveFundingByDao -FN:51,_getHashOfProjectData -FN:59,_getProjectId -FNF:7 -FNH:0 -FNDA:0,isApporovedByDao -FNDA:0,fund -FNDA:0,apporoveFundingByDao -FNDA:0,cancelApporovelFundingByDao -FNDA:0,_isapporoveFundingByDao +FN:18,isApporovedByDao +FN:27,fund +FN:36,apporoveFundingByDao +FN:45,cancelApporovelFundingByDao +FN:50,_isApporoveFundingByDao +FN:58,_getHashOfProjectData +FN:66,_getProjectId +FN:74,_getBalanceOfProject +FN:82,_getFundingGoalAmount +FNF:9 +FNH:8 +FNDA:1,isApporovedByDao +FNDA:1,fund +FNDA:1,apporoveFundingByDao +FNDA:1,cancelApporovelFundingByDao +FNDA:2,_isApporoveFundingByDao FNDA:0,_getHashOfProjectData -FNDA:0,_getProjectId -DA:17,0 -DA:18,0 -DA:19,0 -DA:27,0 -DA:32,0 -DA:33,0 -DA:34,0 -DA:35,0 -DA:40,0 -DA:48,0 -DA:56,0 -DA:64,0 -LF:12 -LH:0 -BRDA:17,1,0,0 -BRDA:17,1,1,0 +FNDA:2,_getProjectId +FNDA:1,_getBalanceOfProject +FNDA:1,_getFundingGoalAmount +DA:19,1 +DA:20,0 +DA:21,1 +DA:29,1 +DA:30,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:47,1 +DA:55,2 +DA:63,0 +DA:71,2 +DA:79,1 +DA:87,1 +LF:16 +LH:14 +BRDA:19,1,0,0 +BRDA:19,1,1,1 BRF:2 -BRH:0 +BRH:1 end_of_record TN: SF:/home/furkansezal/dao/contracts/GovernanceToken.sol @@ -104,28 +112,28 @@ FNF:12 FNH:9 FNDA:0,isApporovedByDaoFoundation FNDA:3,constructor -FNDA:2,votingDelay -FNDA:2,votingPeriod -FNDA:6,quorum -FNDA:14,state -FNDA:2,propose -FNDA:2,proposalThreshold -FNDA:1,_execute +FNDA:4,votingDelay +FNDA:4,votingPeriod +FNDA:12,quorum +FNDA:29,state +FNDA:4,propose +FNDA:4,proposalThreshold +FNDA:3,_execute FNDA:0,_cancel -FNDA:2,_executor +FNDA:6,_executor FNDA:0,supportsInterface DA:24,0 DA:25,0 DA:26,0 -DA:55,2 -DA:64,2 -DA:73,6 -DA:82,14 -DA:91,2 -DA:100,2 -DA:110,1 +DA:55,4 +DA:64,4 +DA:73,12 +DA:82,29 +DA:91,4 +DA:100,4 +DA:110,3 DA:119,0 -DA:128,2 +DA:128,6 DA:137,0 LF:13 LH:8 diff --git a/helper-config.js b/helper-config.js index 12434d6..19fd7f0 100644 --- a/helper-config.js +++ b/helper-config.js @@ -19,6 +19,7 @@ const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; const NEW_VALUE = 77; const FUNC = "store"; const FUNC_FUND = "apporoveFundingByDao"; +const FUNC_CANCEL_APPOROVEL = "cancelApporovelFundingByDao"; const PROPOSAL_DESCRIPTION = "Propasol #1: Store 77 in the Box!"; const proposalsFile = "./proposals.json"; const s_projectID = 1; @@ -53,4 +54,5 @@ module.exports = { s_roadMap, s_otherSources, FUNC_FUND, + FUNC_CANCEL_APPOROVEL, }; diff --git a/test/unit/fundProjectContract.test.js b/test/unit/fundProjectContract.test.js index f7acaec..762b6a5 100644 --- a/test/unit/fundProjectContract.test.js +++ b/test/unit/fundProjectContract.test.js @@ -10,7 +10,7 @@ const { proposalsFile, VOTING_PERIOD, MIN_DELAY, - INITIAL_SUPPLY, + FUNC_CANCEL_APPOROVEL, } = require("../../helper-config"); const { moveBlocks } = require("../../utils/move-blocks"); const { moveTime } = require("../../utils/move-time"); @@ -23,6 +23,7 @@ const fs = require("fs"); account1, account2, account3, + investor, governor, timeLock, fundProjectContract, @@ -32,6 +33,7 @@ const fs = require("fs"); account1 = (await ethers.getSigners())[1]; account2 = (await ethers.getSigners())[2]; account3 = (await ethers.getSigners())[3]; + investor = (await ethers.getSigners())[4]; deployer = (await getNamedAccounts()).deployer; await deployments.fixture("all"); @@ -120,12 +122,13 @@ const fs = require("fs"); blockNumber - 1 )}` ); - + const fundRaisingAmount = "1000"; const proposalDescription = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; const encodedFunctionCall = fundProjectContract.interface.encodeFunctionData(FUNC_FUND, [ proposalDescription, + fundRaisingAmount, ]); const proposalTx = await governor.propose( @@ -245,6 +248,7 @@ const fs = require("fs"); // getting to results const { againstVotes, forVotes, abstainVotes } = await governor.proposalVotes(proposalId); + console.log(`ProposalId = ${proposalId}`); console.log( `Vote on against: ${ethers.utils.formatEther(againstVotes)}` ); @@ -283,11 +287,149 @@ const fs = require("fs"); const projectId = await fundProjectContract._getProjectId( proposalDescription ); + console.log("Executed!"); const fundable = await fundProjectContract._isApporoveFundingByDao( projectId ); assert(fundable); + + // try to invest + console.log("Trying to invest..."); + const fundProject = await ethers.getContract("FundProject", investor); + const sendValue = ethers.utils.parseEther("0.1"); + + const tx = await fundProject.fund(projectId, { value: sendValue }); + await tx.wait(1); + + const balance = await fundProjectContract._getBalanceOfProject( + projectId + ); + const fundingGoal = await fundProjectContract._getFundingGoalAmount( + projectId + ); + console.log(`Funding goal amount: ${fundingGoal}`); + const balanceInEth = ethers.utils.formatEther(balance); + //console.log(balanceInEth); + assert.equal(balanceInEth, "0.1"); + console.log("Invested!"); + + // try to cancel the apporevel + + const encodedFunctionCallForCancelApprovevel = + fundProjectContract.interface.encodeFunctionData( + FUNC_CANCEL_APPOROVEL, + [projectId] + ); + + const proposalTxCancelApprovevel = await governor.propose( + [fundProjectContract.address], + [0], + [encodedFunctionCallForCancelApprovevel], + proposalDescription + ); + const proposeReceiptCancelApprovel = + await proposalTxCancelApprovevel.wait(1); + + console.log( + `Purposal start Block number= ${await ethers.provider.getBlockNumber()}` + ); + const proposalIdCancel = + proposeReceiptCancelApprovel.events[0].args.proposalId; + proposalState = await governor.state(proposalIdCancel); + console.log(`CancelProposalId = ${proposalIdCancel}`); + const deadlineCancel = await governor.proposalDeadline( + proposalIdCancel + ); + console.log( + `Proposal deadline on block ${deadlineCancel.toString()}` + ); + + console.log(`Current Proposal State: ${proposalState}`); + expect(proposalState == 1); + + await moveBlocks(VOTING_DELAY + 1); + proposalState = await governor.state(proposalIdCancel); + console.log(`Current Proposal State: ${proposalState}`); + // connect with account1 + governor = await ethers.getContract( + "GovernerContract", + account1.address + ); + // voting... + // 0 = Against, 1 = For, 2 = Abstain + voteTxResponse = await governor.castVote(proposalIdCancel, 1); + await voteTxResponse.wait(1); + + // voting with account 2 ************************************************ + + // connect with account2 + governor = await ethers.getContract( + "GovernerContract", + account2.address + ); + + voteTxResponse = await governor1.castVote(proposalIdCancel, 0); + await voteTxResponse.wait(1); + + // account3 is voting ********************************************************** */ + // connect with account3 + governor = await ethers.getContract( + "GovernerContract", + account3.address + ); + // voting... + // 0 = Against, 1 = For, 2 = Abstain + voteTxResponse = await governor.castVote(proposalIdCancel, 1); + + // finish the voting + await moveBlocks(VOTING_PERIOD + 1); + + proposalState = await governor.state(proposalIdCancel); + console.log(`Current Proposal State: ${proposalState}`); + + // getting to results + const { againstVotesCancel, forVotesCancel, abstainVotesCancel } = + await governor.proposalVotes(proposalIdCancel); + /* console.log(`Vote on against: ${againstVotesCancel}`); + console.log(`Vote on for: ${forVotesCancel}`); + console.log(`Vote on abstain: ${abstainVotesCancel}`); */ + + assert.equal(proposalState.toString(), "4"); + + // its time to queue & execute + + const descriptionHashCancel = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(proposalDescription) + ); + governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + + const queueTxCancel = await governor.queue( + [fundProjectContract.address], + [0], + [encodedFunctionCallForCancelApprovevel], + descriptionHashCancel + ); + await queueTxCancel.wait(1); + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + console.log("Executing..."); + const executeTxCancel = await governor.execute( + [fundProjectContract.address], + [0], + [encodedFunctionCallForCancelApprovevel], + descriptionHashCancel + ); + await executeTxCancel.wait(1); + const projectIdCancel = await fundProjectContract._getProjectId( + proposalDescription + ); + console.log("Executed!"); + const fundableCancel = + await fundProjectContract._isApporoveFundingByDao(projectId); + console.log(fundableCancel); + assert(!fundableCancel); }); }); }); From a658f3157db492699acaaca3c6cf4f3ec107728a Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Sun, 6 Nov 2022 10:51:26 +0300 Subject: [PATCH 12/28] Add more testing before chainlink keepers --- coverage.json | 2 +- coverage/contracts/Box.sol.html | 2 +- coverage/contracts/FundProject.sol.html | 34 +++++++++--------- coverage/contracts/GovernanceToken.sol.html | 2 +- coverage/contracts/GovernerContract.sol.html | 2 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 36 +++++++++---------- coverage/coverage-final.json | 2 +- coverage/index.html | 36 +++++++++---------- coverage/lcov-report/contracts/Box.sol.html | 2 +- .../contracts/FundProject.sol.html | 34 +++++++++--------- .../contracts/GovernanceToken.sol.html | 2 +- .../contracts/GovernerContract.sol.html | 2 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 36 +++++++++---------- coverage/lcov-report/index.html | 36 +++++++++---------- coverage/lcov.info | 30 ++++++++-------- test/unit/fundProjectContract.test.js | 11 +++++- 18 files changed, 141 insertions(+), 132 deletions(-) diff --git a/coverage.json b/coverage.json index 31a40b2..7b18863 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/FundProject.sol":{"l":{"19":1,"20":0,"21":1,"29":1,"30":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"55":2,"63":0,"71":2,"79":1,"87":1},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":0,"11":2,"12":1,"13":1},"b":{"1":[0,1]},"f":{"1":1,"2":1,"3":1,"4":1,"5":2,"6":0,"7":2,"8":1,"9":1},"fnMap":{"1":{"name":"isApporovedByDao","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"fund","line":27,"loc":{"start":{"line":24,"column":4},"end":{"line":31,"column":4}}},"3":{"name":"apporoveFundingByDao","line":36,"loc":{"start":{"line":33,"column":4},"end":{"line":43,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"5":{"name":"_isApporoveFundingByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":56,"column":4}}},"6":{"name":"_getHashOfProjectData","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":4}}},"7":{"name":"_getProjectId","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":72,"column":4}}},"8":{"name":"_getBalanceOfProject","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":4}}},"9":{"name":"_getFundingGoalAmount","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":88,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":681}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":50}},"3":{"start":{"line":30,"column":8},"end":{"line":30,"column":43}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":63}},"5":{"start":{"line":39,"column":8},"end":{"line":39,"column":45}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":38}},"7":{"start":{"line":41,"column":8},"end":{"line":41,"column":42}},"8":{"start":{"line":47,"column":8},"end":{"line":47,"column":43}},"9":{"start":{"line":55,"column":8},"end":{"line":55,"column":43}},"10":{"start":{"line":63,"column":8},"end":{"line":63,"column":34}},"11":{"start":{"line":71,"column":8},"end":{"line":71,"column":41}},"12":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"13":{"start":{"line":87,"column":8},"end":{"line":87,"column":50}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":4,"64":4,"73":12,"82":29,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":4,"3":4,"4":12,"5":29,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":4,"4":4,"5":12,"6":29,"7":4,"8":4,"9":3,"10":0,"11":6,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/FundProject.sol":{"l":{"19":2,"20":1,"21":1,"29":1,"30":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"55":2,"63":1,"71":3,"79":2,"87":2},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":2,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":1,"11":3,"12":2,"13":2},"b":{"1":[1,1]},"f":{"1":2,"2":1,"3":1,"4":1,"5":2,"6":1,"7":3,"8":2,"9":2},"fnMap":{"1":{"name":"isApporovedByDao","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"fund","line":27,"loc":{"start":{"line":24,"column":4},"end":{"line":31,"column":4}}},"3":{"name":"apporoveFundingByDao","line":36,"loc":{"start":{"line":33,"column":4},"end":{"line":43,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"5":{"name":"_isApporoveFundingByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":56,"column":4}}},"6":{"name":"_getHashOfProjectData","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":4}}},"7":{"name":"_getProjectId","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":72,"column":4}}},"8":{"name":"_getBalanceOfProject","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":4}}},"9":{"name":"_getFundingGoalAmount","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":88,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":681}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":50}},"3":{"start":{"line":30,"column":8},"end":{"line":30,"column":43}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":63}},"5":{"start":{"line":39,"column":8},"end":{"line":39,"column":45}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":38}},"7":{"start":{"line":41,"column":8},"end":{"line":41,"column":42}},"8":{"start":{"line":47,"column":8},"end":{"line":47,"column":43}},"9":{"start":{"line":55,"column":8},"end":{"line":55,"column":43}},"10":{"start":{"line":63,"column":8},"end":{"line":63,"column":34}},"11":{"start":{"line":71,"column":8},"end":{"line":71,"column":41}},"12":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"13":{"start":{"line":87,"column":8},"end":{"line":87,"column":50}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":4,"64":4,"73":12,"82":29,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":4,"3":4,"4":12,"5":29,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":4,"4":4,"5":12,"6":29,"7":4,"8":4,"9":3,"10":0,"11":6,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/Box.sol.html b/coverage/contracts/Box.sol.html index 649ed12..e5f48d1 100644 --- a/coverage/contracts/Box.sol.html +++ b/coverage/contracts/Box.sol.html @@ -118,7 +118,7 @@

diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html index 4c020dc..13ce459 100644 --- a/coverage/contracts/FundProject.sol.html +++ b/coverage/contracts/FundProject.sol.html @@ -20,24 +20,24 @@

- 92.31% + 100% Statements - 12/13 + 13/13
- 50% + 100% Branches - 1/2 + 2/2
- 88.89% + 100% Functions - 8/9 + 9/9
- 87.5% + 100% Lines - 14/16 + 16/16
@@ -150,8 +150,8 @@

      + -      @@ -194,7 +194,7 @@

      -  +       @@ -202,7 +202,7 @@

      - +       @@ -210,7 +210,7 @@

      - +       @@ -218,7 +218,7 @@

      - +      

- - - - - - - - - + + + + + + + + + @@ -129,7 +129,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 4f4adf6..ce2269d 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,6 +1,6 @@ { "contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, -"contracts/FundProject.sol":{"l":{"19":1,"20":0,"21":1,"29":1,"30":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"55":2,"63":0,"71":2,"79":1,"87":1},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":0,"11":2,"12":1,"13":1},"b":{"1":[0,1]},"f":{"1":1,"2":1,"3":1,"4":1,"5":2,"6":0,"7":2,"8":1,"9":1},"fnMap":{"1":{"name":"isApporovedByDao","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"fund","line":27,"loc":{"start":{"line":24,"column":4},"end":{"line":31,"column":4}}},"3":{"name":"apporoveFundingByDao","line":36,"loc":{"start":{"line":33,"column":4},"end":{"line":43,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"5":{"name":"_isApporoveFundingByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":56,"column":4}}},"6":{"name":"_getHashOfProjectData","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":4}}},"7":{"name":"_getProjectId","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":72,"column":4}}},"8":{"name":"_getBalanceOfProject","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":4}}},"9":{"name":"_getFundingGoalAmount","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":88,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":681}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":50}},"3":{"start":{"line":30,"column":8},"end":{"line":30,"column":43}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":63}},"5":{"start":{"line":39,"column":8},"end":{"line":39,"column":45}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":38}},"7":{"start":{"line":41,"column":8},"end":{"line":41,"column":42}},"8":{"start":{"line":47,"column":8},"end":{"line":47,"column":43}},"9":{"start":{"line":55,"column":8},"end":{"line":55,"column":43}},"10":{"start":{"line":63,"column":8},"end":{"line":63,"column":34}},"11":{"start":{"line":71,"column":8},"end":{"line":71,"column":41}},"12":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"13":{"start":{"line":87,"column":8},"end":{"line":87,"column":50}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}}, +"contracts/FundProject.sol":{"l":{"19":2,"20":1,"21":1,"29":1,"30":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"55":2,"63":1,"71":3,"79":2,"87":2},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":2,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":1,"11":3,"12":2,"13":2},"b":{"1":[1,1]},"f":{"1":2,"2":1,"3":1,"4":1,"5":2,"6":1,"7":3,"8":2,"9":2},"fnMap":{"1":{"name":"isApporovedByDao","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"fund","line":27,"loc":{"start":{"line":24,"column":4},"end":{"line":31,"column":4}}},"3":{"name":"apporoveFundingByDao","line":36,"loc":{"start":{"line":33,"column":4},"end":{"line":43,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"5":{"name":"_isApporoveFundingByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":56,"column":4}}},"6":{"name":"_getHashOfProjectData","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":4}}},"7":{"name":"_getProjectId","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":72,"column":4}}},"8":{"name":"_getBalanceOfProject","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":4}}},"9":{"name":"_getFundingGoalAmount","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":88,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":681}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":50}},"3":{"start":{"line":30,"column":8},"end":{"line":30,"column":43}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":63}},"5":{"start":{"line":39,"column":8},"end":{"line":39,"column":45}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":38}},"7":{"start":{"line":41,"column":8},"end":{"line":41,"column":42}},"8":{"start":{"line":47,"column":8},"end":{"line":47,"column":43}},"9":{"start":{"line":55,"column":8},"end":{"line":55,"column":43}},"10":{"start":{"line":63,"column":8},"end":{"line":63,"column":34}},"11":{"start":{"line":71,"column":8},"end":{"line":71,"column":41}},"12":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"13":{"start":{"line":87,"column":8},"end":{"line":87,"column":50}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}}, "contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, "contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":4,"64":4,"73":12,"82":29,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":4,"3":4,"4":12,"5":29,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":4,"4":4,"5":12,"6":29,"7":4,"8":4,"9":3,"10":0,"11":6,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index fb79b09..7f68b37 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,24 +20,24 @@

- 88.89% + 91.67% Statements - 32/36 + 33/36
- 50% + 66.67% Branches - 3/6 + 4/6
- 87.1% + 90.32% Functions - 27/31 + 28/31
- 83.33% + 88.1% Lines - 35/42 + 37/42
@@ -60,15 +60,15 @@

- - - - - - - - - + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/Box.sol.html b/coverage/lcov-report/contracts/Box.sol.html index 649ed12..e5f48d1 100644 --- a/coverage/lcov-report/contracts/Box.sol.html +++ b/coverage/lcov-report/contracts/Box.sol.html @@ -118,7 +118,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html index 4c020dc..13ce459 100644 --- a/coverage/lcov-report/contracts/FundProject.sol.html +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -20,24 +20,24 @@

- 92.31% + 100% Statements - 12/13 + 13/13
- 50% + 100% Branches - 1/2 + 2/2
- 88.89% + 100% Functions - 8/9 + 9/9
- 87.5% + 100% Lines - 14/16 + 16/16
@@ -150,8 +150,8 @@

      + -      @@ -194,7 +194,7 @@

      -  +       @@ -202,7 +202,7 @@

      - +       @@ -210,7 +210,7 @@

      - +       @@ -218,7 +218,7 @@

      - +      

- - - - - - - - - + + + + + + + + + @@ -129,7 +129,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index fb79b09..7f68b37 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,24 +20,24 @@

- 88.89% + 91.67% Statements - 32/36 + 33/36
- 50% + 66.67% Branches - 3/6 + 4/6
- 87.1% + 90.32% Functions - 27/31 + 28/31
- 83.33% + 88.1% Lines - 35/42 + 37/42
@@ -60,15 +60,15 @@

- - - - - - - - - + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 8e84067..2244c18 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -26,18 +26,18 @@ FN:66,_getProjectId FN:74,_getBalanceOfProject FN:82,_getFundingGoalAmount FNF:9 -FNH:8 -FNDA:1,isApporovedByDao +FNH:9 +FNDA:2,isApporovedByDao FNDA:1,fund FNDA:1,apporoveFundingByDao FNDA:1,cancelApporovelFundingByDao FNDA:2,_isApporoveFundingByDao -FNDA:0,_getHashOfProjectData -FNDA:2,_getProjectId -FNDA:1,_getBalanceOfProject -FNDA:1,_getFundingGoalAmount -DA:19,1 -DA:20,0 +FNDA:1,_getHashOfProjectData +FNDA:3,_getProjectId +FNDA:2,_getBalanceOfProject +FNDA:2,_getFundingGoalAmount +DA:19,2 +DA:20,1 DA:21,1 DA:29,1 DA:30,1 @@ -48,16 +48,16 @@ DA:41,1 DA:42,1 DA:47,1 DA:55,2 -DA:63,0 -DA:71,2 -DA:79,1 -DA:87,1 +DA:63,1 +DA:71,3 +DA:79,2 +DA:87,2 LF:16 -LH:14 -BRDA:19,1,0,0 +LH:16 +BRDA:19,1,0,1 BRDA:19,1,1,1 BRF:2 -BRH:1 +BRH:2 end_of_record TN: SF:/home/furkansezal/dao/contracts/GovernanceToken.sol diff --git a/test/unit/fundProjectContract.test.js b/test/unit/fundProjectContract.test.js index 762b6a5..adc6931 100644 --- a/test/unit/fundProjectContract.test.js +++ b/test/unit/fundProjectContract.test.js @@ -428,8 +428,17 @@ const fs = require("fs"); console.log("Executed!"); const fundableCancel = await fundProjectContract._isApporoveFundingByDao(projectId); - console.log(fundableCancel); + assert(!fundableCancel); + + assert(await fundProjectContract._getHashOfProjectData(projectId)); + assert(await fundProjectContract._getProjectId(proposalDescription)); + assert(await fundProjectContract._getBalanceOfProject(projectId)); + assert(await fundProjectContract._getFundingGoalAmount(projectId)); + + await expect( + fundProjectContract.fund(projectId + 1, { value: sendValue }) + ).to.be.revertedWith("FundProject__NotApporovedByDao"); }); }); }); From 74473f40afed6e0a7a9ded954227dfa10e76b251 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Mon, 7 Nov 2022 08:09:34 +0300 Subject: [PATCH 13/28] fix test --- package.json | 1 + test/unit/fundProjectContract.test.js | 18 ++++++--- yarn.lock | 58 +++++++++++++++++++++++++-- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index d9d1889..e4b3a0f 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "devDependencies": { + "@chainlink/contracts": "^0.5.1", "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers", "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.3", diff --git a/test/unit/fundProjectContract.test.js b/test/unit/fundProjectContract.test.js index adc6931..d2f14b4 100644 --- a/test/unit/fundProjectContract.test.js +++ b/test/unit/fundProjectContract.test.js @@ -246,7 +246,7 @@ const fs = require("fs"); console.log(`Current Proposal State: ${proposalState}`); // getting to results - const { againstVotes, forVotes, abstainVotes } = + let { againstVotes, forVotes, abstainVotes } = await governor.proposalVotes(proposalId); console.log(`ProposalId = ${proposalId}`); console.log( @@ -389,11 +389,17 @@ const fs = require("fs"); console.log(`Current Proposal State: ${proposalState}`); // getting to results - const { againstVotesCancel, forVotesCancel, abstainVotesCancel } = - await governor.proposalVotes(proposalIdCancel); - /* console.log(`Vote on against: ${againstVotesCancel}`); - console.log(`Vote on for: ${forVotesCancel}`); - console.log(`Vote on abstain: ${abstainVotesCancel}`); */ + [againstVotes, forVotes, abstainVotes] = await governor.proposalVotes( + proposalIdCancel + ); + + console.log( + `Vote on against: ${ethers.utils.formatEther(againstVotes)}` + ); + console.log(`Vote on for: ${ethers.utils.formatEther(forVotes)}`); + console.log( + `Vote on abstain: ${ethers.utils.formatEther(abstainVotes)}` + ); assert.equal(proposalState.toString(), "4"); diff --git a/yarn.lock b/yarn.lock index e3610fb..e59fdfc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@chainlink/contracts@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@chainlink/contracts/-/contracts-0.5.1.tgz#68e7447ba8c1eccfbb760bacc93aced2eef60945" + integrity sha512-3PDBJ38Sd6Ml9h7FNK/tZQti+kTCdXUq1qzE6E59CnlzycsV9ElPvf2hTvs9Mi9C6pEx2Mmw9yhZMfBktYUInQ== + dependencies: + "@eth-optimism/contracts" "^0.5.21" + "@openzeppelin/contracts" "^4.3.3" + "@openzeppelin/contracts-v0.7" "npm:@openzeppelin/contracts@v3.4.2" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -44,6 +53,37 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== +"@eth-optimism/contracts@^0.5.21": + version "0.5.38" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.38.tgz#9c55725a253a0c6be351b4823ec1f0af62df8315" + integrity sha512-VvPvTD6AKFIPZVwGRK1eDuhRS+WyUGemIiu7h9txpKitkXKpTqb4DscR6cul5Dl+JhonX36ZvnJmDIfF+KBY5A== + dependencies: + "@eth-optimism/core-utils" "0.11.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + +"@eth-optimism/core-utils@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.11.0.tgz#cc0ac24fc49a6f5f411e3947d2d3bb5f49333d5a" + integrity sha512-/oTyC1sqZ/R97pRk+7cQJpZ6qwmJvqcym9coy9fZaqmIuFaZkjXQKz04lWUPL0zzh9zTN+2nMSB+kZReccmong== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/providers" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bufio "^1.0.7" + chai "^4.3.4" + "@ethereum-waffle/chai@^3.4.4": version "3.4.4" resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" @@ -216,7 +256,7 @@ dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -319,7 +359,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.0": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -744,7 +784,12 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" -"@openzeppelin/contracts@^4.7.3": +"@openzeppelin/contracts-v0.7@npm:@openzeppelin/contracts@v3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" + integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== + +"@openzeppelin/contracts@^4.3.3", "@openzeppelin/contracts@^4.7.3": version "4.7.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== @@ -2375,6 +2420,11 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +bufio@^1.0.7: + version "1.1.3" + resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.1.3.tgz#7f8e524fd719ced2caa563a09d50550f283f745f" + integrity sha512-W0ydG8t+ST+drUpEwl1N+dU9Ije06g8+43CLtvEIzfKo9nPFLXbKqDYE2XSg4w6RugsBcCj7pEU7jOpBC6BqrA== + busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -2526,7 +2576,7 @@ cbor@^5.0.2: bignumber.js "^9.0.1" nofilter "^1.0.4" -chai@^4.3.6: +chai@^4.3.4, chai@^4.3.6: version "4.3.6" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== From 15bd11e7798e56392fa5207884166b5098602598 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Tue, 8 Nov 2022 14:32:16 +0300 Subject: [PATCH 14/28] Add chainlink automation without testing. This will break old test for now. --- contracts/FundProject.sol | 84 +++++++++++++++++++++++++++++++++- contracts/GovernerContract.sol | 16 ++++--- 2 files changed, 92 insertions(+), 8 deletions(-) diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index be0cf7f..32316d5 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -2,18 +2,34 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; +import "@chainlink/contracts/src/v0.8/AutomationCompatible.sol"; -contract FundProject is Ownable { +contract FundProject is Ownable, AutomationCompatibleInterface { error FundProject__NotApporovedByDao(); + error FundProject__UpkeepNeeded(); + error FundProject__TransferFailed(uint256 _projectId); + error FundProject__NotEnoughPayment(); uint256 public projectId = 1; + uint public lastTimeStamp; + uint256 public daoPercentage; + uint256 public enteranceFee; + address payable projectOwners; + + mapping(uint256 => bool) public _isFunding; + mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add + mapping(uint256 => uint256) public time; + mapping(string => uint256) public hashToProjectId; mapping(uint256 => string) public idToHash; mapping(uint256 => mapping(address => uint256)) public funders; mapping(uint256 => uint256) public projectFunds; mapping(uint256 => uint256) public projectFundingGoalAmount; mapping(uint256 => bool) public _isApporovedByDao; + mapping(uint256 => address) public projectOwnerAddress; + + event projectSuccessfullyFunded(uint256 indexed _projectId); modifier isApporovedByDao(uint256 _projecID) { if (!_isApporovedByDao[_projecID]) @@ -21,6 +37,12 @@ contract FundProject is Ownable { _; } + constructor(uint256 _enteranceFee, uint256 _daoPercentage) { + lastTimeStamp = block.timestamp; + daoPercentage = _daoPercentage; + enteranceFee = _enteranceFee; + } + function fund(uint256 _projecID) public payable @@ -32,19 +54,73 @@ contract FundProject is Ownable { function apporoveFundingByDao( string memory _ipfsHash, - uint256 _fundingGoalAmount + uint256 _fundingGoalAmount, + uint256 _time, + address _projectOwnerAddress ) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) + projectToTime[projectId][_time] = block.timestamp; + time[projectId] = _time; projectFundingGoalAmount[projectId] = _fundingGoalAmount; hashToProjectId[_ipfsHash] = projectId; idToHash[projectId] = _ipfsHash; + projectOwnerAddress[projectId] = _projectOwnerAddress; _isApporovedByDao[projectId] = true; + _isFunding[projectId] = true; projectId++; } function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) _isApporovedByDao[_projecID] = false; + _isFunding[projectId] = false; + } + + function checkUpkeep( + bytes memory /* checkData */ + ) + public + view + override + returns ( + bool upkeepNeeded, + bytes memory /* performData */ + ) + { + upkeepNeeded = (_isFunding[projectId] && + (block.timestamp - projectToTime[projectId][time[projectId]]) > + projectToTime[projectId][time[projectId]]); + } + + function performUpkeep( + bytes calldata /* performData */ + ) external override { + (bool upkeepNeeded, ) = checkUpkeep(""); + if (!upkeepNeeded) { + revert FundProject__UpkeepNeeded(); + } + _isFunding[projectId] = false; + _isApporovedByDao[projectId] = false; + + if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) { + uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) / + 100; + (bool success, ) = (projectOwnerAddress[projectId]).call{ + value: fundsToSent + }(""); + if (!success) { + revert FundProject__TransferFailed(projectFunds[projectId]); + } + + emit projectSuccessfullyFunded(projectId); + } + } + + function paySubmitFee() public payable { + if (msg.value < enteranceFee) { + revert FundProject__NotEnoughPayment(); + } + projectOwners = payable(msg.sender); } function _isApporoveFundingByDao(uint256 _projecID) @@ -86,4 +162,8 @@ contract FundProject is Ownable { { return projectFundingGoalAmount[_projecID]; } + + function is_funding(uint256 _projectID) public view returns (bool) { + return _isFunding[_projectID]; + } } diff --git a/contracts/GovernerContract.sol b/contracts/GovernerContract.sol index 3f7979c..c946b35 100644 --- a/contracts/GovernerContract.sol +++ b/contracts/GovernerContract.sol @@ -7,6 +7,7 @@ import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; +import "./FundProject.sol"; contract GovernerContract is Governor, @@ -14,15 +15,15 @@ contract GovernerContract is GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, - GovernorTimelockControl + GovernorTimelockControl, + FundProject { error GovernerContract__NotApporovedByDaoFoundation(); mapping(address => bool) public inWhiteList; - modifier isApporovedByDaoFoundation() { - if (!inWhiteList[msg.sender]) - revert GovernerContract__NotApporovedByDaoFoundation(); + modifier isSubmitFeePaid() { + paySubmitFee(); _; } @@ -31,7 +32,9 @@ contract GovernerContract is TimelockController _timelock, uint256 _votingDelay, uint256 _votingPeriod, - uint256 _quorumPercentage + uint256 _quorumPercentage, + uint256 _enteranceFee, + uint256 _daoPercentage ) Governor("GovernerContract") GovernorSettings( @@ -42,6 +45,7 @@ contract GovernerContract is GovernorVotes(_token) GovernorVotesQuorumFraction(_quorumPercentage) GovernorTimelockControl(_timelock) + FundProject(_enteranceFee, _daoPercentage) {} // The following functions are overrides required by Solidity. @@ -87,7 +91,7 @@ contract GovernerContract is uint256[] memory values, bytes[] memory calldatas, string memory description - ) public override(Governor, IGovernor) returns (uint256) { + ) public override(Governor, IGovernor) isSubmitFeePaid returns (uint256) { return super.propose(targets, values, calldatas, description); } From b38e71141a9a40432a6bce9c84a5e6d08afe6dce Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Tue, 8 Nov 2022 15:05:47 +0300 Subject: [PATCH 15/28] Add chainlink automation without testing V2. This will break old test for now. --- contracts/FundProject.sol | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index 32316d5..51814fa 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -9,6 +9,15 @@ contract FundProject is Ownable, AutomationCompatibleInterface { error FundProject__UpkeepNeeded(); error FundProject__TransferFailed(uint256 _projectId); error FundProject__NotEnoughPayment(); + error FundProject__withdrawFund(); + error FundProject__WithdrawTransferFailed(); + + enum ProjectFundingStatus { + ONPROGRESS, + SUCCESS, + FAILED, + CANCELED + } uint256 public projectId = 1; @@ -28,6 +37,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { mapping(uint256 => uint256) public projectFundingGoalAmount; mapping(uint256 => bool) public _isApporovedByDao; mapping(uint256 => address) public projectOwnerAddress; + mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus; event projectSuccessfullyFunded(uint256 indexed _projectId); @@ -60,6 +70,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { ) external onlyOwner { // only dao can call this function (after deployement we will transfer ownership to dao) projectToTime[projectId][_time] = block.timestamp; + _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS; time[projectId] = _time; projectFundingGoalAmount[projectId] = _fundingGoalAmount; hashToProjectId[_ipfsHash] = projectId; @@ -74,6 +85,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { // only dao can call this function (after deployement we will transfer ownership to dao) _isApporovedByDao[_projecID] = false; _isFunding[projectId] = false; + _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; } function checkUpkeep( @@ -103,6 +115,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { _isApporovedByDao[projectId] = false; if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) { + _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS; uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) / 100; (bool success, ) = (projectOwnerAddress[projectId]).call{ @@ -113,6 +126,8 @@ contract FundProject is Ownable, AutomationCompatibleInterface { } emit projectSuccessfullyFunded(projectId); + } else { + _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED; } } @@ -123,6 +138,20 @@ contract FundProject is Ownable, AutomationCompatibleInterface { projectOwners = payable(msg.sender); } + function withdrawFund(uint256 _projectID) public { + if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) { + uint256 fundToSent = funders[_projectID][msg.sender]; + (bool success, ) = (payable(msg.sender)).call{value: fundToSent}( + "" + ); + if (!success) { + revert FundProject__WithdrawTransferFailed(); + } + } else { + revert FundProject__withdrawFund(); + } + } + function _isApporoveFundingByDao(uint256 _projecID) external view @@ -166,4 +195,12 @@ contract FundProject is Ownable, AutomationCompatibleInterface { function is_funding(uint256 _projectID) public view returns (bool) { return _isFunding[_projectID]; } + + function _getProjectStatus(uint256 _projectID) + public + view + returns (ProjectFundingStatus) + { + return _ProjectFundingStatus[_projectID]; + } } From 9aa568aba49961422ccf78877ae9127dffee8ebd Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Tue, 8 Nov 2022 20:16:22 +0300 Subject: [PATCH 16/28] Add chainlink automation without testing V3. This will break old test for now. Fixed some bugs. --- scripts/submit_and_propose.js | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/scripts/submit_and_propose.js b/scripts/submit_and_propose.js index f4c97b4..669c33e 100644 --- a/scripts/submit_and_propose.js +++ b/scripts/submit_and_propose.js @@ -17,6 +17,7 @@ const { VOTING_DELAY, proposalsFile, FUNC_FUND, + s_fundingTime, } = require("../helper-config"); const { moveBlocks } = require("../utils/move-blocks"); @@ -79,17 +80,28 @@ async function submitAndPropose( const proposalDescription = ProjectMetadataUploadResponse.IpfsHash; + const nodeAccount2 = "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"; // account2 from node const governor = await ethers.getContract("GovernerContract"); - const fundProjectContract = await ethers.getContract("FundProject"); const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; - const encodedFunctionCall = fundProjectContract.interface.encodeFunctionData( - FUNC_FUND, - [args] + + const encodedFunctionCall = governor.interface.encodeFunctionData(FUNC_FUND, [ + args, + s_fundRaisingGoalAmount, + s_fundingTime, + nodeAccount2, + ]); + + const enteranceFee = await governor.getEnteranceFee(); + + /* console.log( + ethers.utils.formatEther(await ethers.provider.getBalance(nodeAccount2)) ); + */ + const options = { value: ethers.utils.parseEther("1.0") }; const proposalTx = await governor.propose( - [fundProjectContract.address], + [governor.address], [0], [encodedFunctionCall], args @@ -104,7 +116,7 @@ async function submitAndPropose( proposals[network.config.chainId.toString()].push(proposalId.toString()); fs.writeFileSync(proposalsFile, JSON.stringify(proposals)); - console.log(`Proposing ${FUNC_FUND} on ${fundProjectContract.address}`); + console.log(`Proposing ${FUNC_FUND} on ${governor.address}`); console.log(`Proposal description: \n ${proposalDescription}`); return ProjectMetadataUploadResponse.IpfsHash; @@ -117,7 +129,8 @@ submitAndPropose( s_video, s_fundRaisingGoalAmount, s_roadMap, - s_otherSources + s_otherSources, + s_fundingTime ) .then(() => process.exit(0)) .catch((error) => { From 0a4c9841efb3e8cc411f0b4f7b62970ffa5c68aa Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Tue, 8 Nov 2022 20:18:00 +0300 Subject: [PATCH 17/28] Add chainlink automation without testing V3. This will break old test for now. Fix bugs --- contracts/Box.sol | 23 - contracts/FundProject.sol | 40 +- contracts/GovernanceToken.sol | 10 +- contracts/GovernerContract.sol | 18 +- ...ploy-timelock.js => 01-deploy-timelock.js} | 0 ...nerToken.js => 02-deploy-GovernerToken.js} | 17 +- deploy/03-deploy-governorContract.js | 7 + deploy/05-deploy-box.js | 32 - deploy/06-deploy-fundProject.js | 37 - deployments/localhost/Box.json | 185 --- deployments/localhost/FundProject.json | 423 ----- deployments/localhost/GovernanceToken.json | 181 ++- deployments/localhost/GovernerContract.json | 1419 ++++++++++++++--- deployments/localhost/TimeLock.json | 92 +- .../0934ff3c9c2ecd6d365975d91fef7cb5.json | 41 - ... => 865f8451b79a875f15c7120a0497c47b.json} | 129 +- ... => f3989c9674956bada0a1ffc4cf72c075.json} | 79 +- helper-config.js | 6 + proposals.json | 2 +- test/unit/dao.test.js | 2 - 20 files changed, 1499 insertions(+), 1244 deletions(-) delete mode 100644 contracts/Box.sol rename deploy/{02-deploy-timelock.js => 01-deploy-timelock.js} (100%) rename deploy/{01-deploy-GovernerToken.js => 02-deploy-GovernerToken.js} (67%) delete mode 100644 deploy/05-deploy-box.js delete mode 100644 deploy/06-deploy-fundProject.js delete mode 100644 deployments/localhost/Box.json delete mode 100644 deployments/localhost/FundProject.json delete mode 100644 deployments/localhost/solcInputs/0934ff3c9c2ecd6d365975d91fef7cb5.json rename deployments/localhost/solcInputs/{66f18b8ec322110c2dd2cceea16c0aca.json => 865f8451b79a875f15c7120a0497c47b.json} (93%) rename deployments/localhost/solcInputs/{c3bd0fff8e093c1104055db0ec135b98.json => f3989c9674956bada0a1ffc4cf72c075.json} (92%) diff --git a/contracts/Box.sol b/contracts/Box.sol deleted file mode 100644 index 3905910..0000000 --- a/contracts/Box.sol +++ /dev/null @@ -1,23 +0,0 @@ -// contracts/Box.sol -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/access/Ownable.sol"; - -contract Box is Ownable { - uint256 private value; - - // Emitted when the stored value changes - event ValueChanged(uint256 newValue); - - // Stores a new value in the contract - function store(uint256 newValue) public onlyOwner { - value = newValue; - emit ValueChanged(newValue); - } - - // Reads the last stored value - function retrieve() public view returns (uint256) { - return value; - } -} diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index 51814fa..503d9d6 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -11,6 +11,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { error FundProject__NotEnoughPayment(); error FundProject__withdrawFund(); error FundProject__WithdrawTransferFailed(); + error FundProject__EnteranceFeeNeeded(); enum ProjectFundingStatus { ONPROGRESS, @@ -24,7 +25,6 @@ contract FundProject is Ownable, AutomationCompatibleInterface { uint public lastTimeStamp; uint256 public daoPercentage; uint256 public enteranceFee; - address payable projectOwners; mapping(uint256 => bool) public _isFunding; mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add @@ -38,8 +38,10 @@ contract FundProject is Ownable, AutomationCompatibleInterface { mapping(uint256 => bool) public _isApporovedByDao; mapping(uint256 => address) public projectOwnerAddress; mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus; + mapping(address => bool) public _isEnteranceFeePaid; event projectSuccessfullyFunded(uint256 indexed _projectId); + event projectFundingFailed(uint256 indexed _projectId); modifier isApporovedByDao(uint256 _projecID) { if (!_isApporovedByDao[_projecID]) @@ -68,21 +70,25 @@ contract FundProject is Ownable, AutomationCompatibleInterface { uint256 _time, address _projectOwnerAddress ) external onlyOwner { - // only dao can call this function (after deployement we will transfer ownership to dao) - projectToTime[projectId][_time] = block.timestamp; - _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS; - time[projectId] = _time; - projectFundingGoalAmount[projectId] = _fundingGoalAmount; - hashToProjectId[_ipfsHash] = projectId; - idToHash[projectId] = _ipfsHash; - projectOwnerAddress[projectId] = _projectOwnerAddress; - _isApporovedByDao[projectId] = true; - _isFunding[projectId] = true; - projectId++; + // only dao can call it + if (!_isEnteranceFeePaid[_projectOwnerAddress]) { + revert FundProject__EnteranceFeeNeeded(); + } else { + projectToTime[projectId][_time] = block.timestamp; + _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS; + time[projectId] = _time; + projectFundingGoalAmount[projectId] = _fundingGoalAmount; + hashToProjectId[_ipfsHash] = projectId; + idToHash[projectId] = _ipfsHash; + projectOwnerAddress[projectId] = _projectOwnerAddress; + _isApporovedByDao[projectId] = true; + _isFunding[projectId] = true; + projectId++; + } } function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { - // only dao can call this function (after deployement we will transfer ownership to dao) + // only dao can call it _isApporovedByDao[_projecID] = false; _isFunding[projectId] = false; _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; @@ -128,14 +134,16 @@ contract FundProject is Ownable, AutomationCompatibleInterface { emit projectSuccessfullyFunded(projectId); } else { _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED; + emit projectFundingFailed(projectId); } } function paySubmitFee() public payable { if (msg.value < enteranceFee) { revert FundProject__NotEnoughPayment(); + } else { + _isEnteranceFeePaid[msg.sender] = true; } - projectOwners = payable(msg.sender); } function withdrawFund(uint256 _projectID) public { @@ -203,4 +211,8 @@ contract FundProject is Ownable, AutomationCompatibleInterface { { return _ProjectFundingStatus[_projectID]; } + + function getEnteranceFee() public view returns (uint256) { + return enteranceFee; + } } diff --git a/contracts/GovernanceToken.sol b/contracts/GovernanceToken.sol index a9bbf38..cabdaf6 100644 --- a/contracts/GovernanceToken.sol +++ b/contracts/GovernanceToken.sol @@ -2,10 +2,10 @@ pragma solidity ^0.8.7; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; -contract GovernanceToken is ERC20Votes { +contract GovernanceToken is ERC20Votes, Ownable { uint256 public s_initialSupply = 1000000e18; - address private immutable i_owner; event TokenTransfer( address indexed _from, @@ -13,16 +13,10 @@ contract GovernanceToken is ERC20Votes { uint256 _amount ); - modifier onlyOwner() { - require(i_owner == msg.sender, "Ownable: caller is not the owner"); - _; - } - constructor() ERC20("GovernanceToken", "GT") ERC20Permit("GovernanceToken") { - i_owner = msg.sender; _mint(msg.sender, s_initialSupply); } diff --git a/contracts/GovernerContract.sol b/contracts/GovernerContract.sol index c946b35..8b6b870 100644 --- a/contracts/GovernerContract.sol +++ b/contracts/GovernerContract.sol @@ -7,7 +7,7 @@ import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; -import "./FundProject.sol"; + contract GovernerContract is Governor, @@ -16,25 +16,15 @@ contract GovernerContract is GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl, - FundProject + { - error GovernerContract__NotApporovedByDaoFoundation(); - - mapping(address => bool) public inWhiteList; - - modifier isSubmitFeePaid() { - paySubmitFee(); - _; - } - constructor( IVotes _token, TimelockController _timelock, uint256 _votingDelay, uint256 _votingPeriod, uint256 _quorumPercentage, - uint256 _enteranceFee, - uint256 _daoPercentage + ) Governor("GovernerContract") GovernorSettings( @@ -91,7 +81,7 @@ contract GovernerContract is uint256[] memory values, bytes[] memory calldatas, string memory description - ) public override(Governor, IGovernor) isSubmitFeePaid returns (uint256) { + ) public override(Governor, IGovernor) returns (uint256) { return super.propose(targets, values, calldatas, description); } diff --git a/deploy/02-deploy-timelock.js b/deploy/01-deploy-timelock.js similarity index 100% rename from deploy/02-deploy-timelock.js rename to deploy/01-deploy-timelock.js diff --git a/deploy/01-deploy-GovernerToken.js b/deploy/02-deploy-GovernerToken.js similarity index 67% rename from deploy/01-deploy-GovernerToken.js rename to deploy/02-deploy-GovernerToken.js index a526178..5d739ba 100644 --- a/deploy/01-deploy-GovernerToken.js +++ b/deploy/02-deploy-GovernerToken.js @@ -12,8 +12,6 @@ module.exports = async ({ getNamedAccounts, deployments }) => { waitConfirmations: network.config.blockConfirmations || 1, }); log(`governanceToken deployed at ${governanceToken.address}`); - await delegate(governanceToken.address, deployer); - console.log(`Delegated!`); if ( !developmentChains.includes(network.name) && @@ -21,18 +19,17 @@ module.exports = async ({ getNamedAccounts, deployments }) => { ) { await verify(governanceToken.address, []); } -}; -const delegate = async (governanceTokenAddress, delegatedAccount) => { - const governanceToken = await ethers.getContractAt( + const timeLock = await ethers.getContract("TimeLock"); + const governanceTokenContract = await ethers.getContractAt( "GovernanceToken", - governanceTokenAddress + governanceToken.address ); - const tx = await governanceToken.delegate(delegatedAccount); - await tx.wait(1); - console.log( - `Checkpoint ${await governanceToken.numCheckpoints(delegatedAccount)}` + const transferOwnerTx = await governanceTokenContract.transferOwnership( + timeLock.address ); + await transferOwnerTx.wait(1); + log("governanceTokenContract Ownership transfered!"); }; module.exports.tags = ["all", "governanceToken"]; diff --git a/deploy/03-deploy-governorContract.js b/deploy/03-deploy-governorContract.js index 3b1bf91..c54523b 100644 --- a/deploy/03-deploy-governorContract.js +++ b/deploy/03-deploy-governorContract.js @@ -4,6 +4,7 @@ const { VOTING_PERIOD, VOTING_DELAY, QUORUM_PERCENTAGE, + networkConfig, } = require("../helper-config"); const { verify } = require("../utils/verify"); @@ -13,12 +14,18 @@ module.exports = async ({ getNamedAccounts, deployments }) => { const governanceToken = await ethers.getContract("GovernanceToken"); const timelock = await ethers.getContract("TimeLock"); + const chainId = network.config.chainId; + const enteranceFee = networkConfig[chainId]["enteranceFee"]; + const daoPercentage = networkConfig[chainId]["daoPercentage"]; + args = [ governanceToken.address, timelock.address, VOTING_DELAY, VOTING_PERIOD, QUORUM_PERCENTAGE, + enteranceFee, + daoPercentage, ]; const governorContract = await deploy("GovernerContract", { from: deployer, diff --git a/deploy/05-deploy-box.js b/deploy/05-deploy-box.js deleted file mode 100644 index 19ea5b2..0000000 --- a/deploy/05-deploy-box.js +++ /dev/null @@ -1,32 +0,0 @@ -const { getNamedAccounts, deployments, network, ethers } = require("hardhat"); -const { developmentChains } = require("../helper-config"); -const { verify } = require("../utils/verify"); - -module.exports = async ({ getNamedAccounts, deployments }) => { - const { deploy, log } = deployments; - const { deployer } = await getNamedAccounts(); - - args = []; - log("deploying box contract..."); - const box = await deploy("Box", { - from: deployer, - args: args, - log: true, - waitConfirmations: network.config.blockConfirmations || 1, - }); - log(`Box deployed at ${box.address}`); - - if ( - !developmentChains.includes(network.name) && - process.env.ETHERSCAN_API_KEY - ) { - await verify(box.address, args); - } - const timeLock = await ethers.getContract("TimeLock"); - const boxContract = await ethers.getContractAt("Box", box.address); - const transferOwnerTx = await boxContract.transferOwnership(timeLock.address); - await transferOwnerTx.wait(1); - log("Ownership transfered!"); -}; - -module.exports.tags = ["all", "box"]; diff --git a/deploy/06-deploy-fundProject.js b/deploy/06-deploy-fundProject.js deleted file mode 100644 index 7c39e6b..0000000 --- a/deploy/06-deploy-fundProject.js +++ /dev/null @@ -1,37 +0,0 @@ -const { getNamedAccounts, deployments, network, ethers } = require("hardhat"); -const { developmentChains } = require("../helper-config"); -const { verify } = require("../utils/verify"); - -module.exports = async ({ getNamedAccounts, deployments }) => { - const { deploy, log } = deployments; - const { deployer } = await getNamedAccounts(); - - args = []; - log("deploying FundProject contract..."); - const fundProject = await deploy("FundProject", { - from: deployer, - args: args, - log: true, - waitConfirmations: network.config.blockConfirmations || 1, - }); - log(`FundProject deployed at ${fundProject.address}`); - - if ( - !developmentChains.includes(network.name) && - process.env.ETHERSCAN_API_KEY - ) { - await verify(fundProject.address, args); - } - const timeLock = await ethers.getContract("TimeLock"); - const fundProjectContract = await ethers.getContractAt( - "FundProject", - fundProject.address - ); - const transferOwnerTx = await fundProjectContract.transferOwnership( - timeLock.address - ); - await transferOwnerTx.wait(1); - log("fundProjectContract Ownership transfered!"); -}; - -module.exports.tags = ["all", "funding"]; diff --git a/deployments/localhost/Box.json b/deployments/localhost/Box.json deleted file mode 100644 index 83e52ea..0000000 --- a/deployments/localhost/Box.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "abi": [ - { - "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": "newValue", - "type": "uint256" - } - ], - "name": "ValueChanged", - "type": "event" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "retrieve", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newValue", - "type": "uint256" - } - ], - "name": "store", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xe52a23bbee8a7d102c1dff9f98c6709834b8ab8101884a3f7b3c47e91636b841", - "receipt": { - "to": null, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "transactionIndex": 0, - "gasUsed": "398269", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000010000000010000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x2d7e9a6ce2b344890bbb1afd12e6386e8fdcc146f51d75ed41e318fd503d5765", - "transactionHash": "0xe52a23bbee8a7d102c1dff9f98c6709834b8ab8101884a3f7b3c47e91636b841", - "logs": [ - { - "transactionIndex": 0, - "blockNumber": 8, - "transactionHash": "0xe52a23bbee8a7d102c1dff9f98c6709834b8ab8101884a3f7b3c47e91636b841", - "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ], - "data": "0x", - "logIndex": 0, - "blockHash": "0x2d7e9a6ce2b344890bbb1afd12e6386e8fdcc146f51d75ed41e318fd503d5765" - } - ], - "blockNumber": 8, - "cumulativeGasUsed": "398269", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "66f18b8ec322110c2dd2cceea16c0aca", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"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\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"ValueChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"retrieve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newValue\",\"type\":\"uint256\"}],\"name\":\"store\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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/Box.sol\":\"Box\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/Box.sol\":{\"content\":\"// contracts/Box.sol\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract Box is Ownable {\\n uint256 private value;\\n\\n // Emitted when the stored value changes\\n event ValueChanged(uint256 newValue);\\n\\n // Stores a new value in the contract\\n function store(uint256 newValue) public onlyOwner {\\n value = newValue;\\n emit ValueChanged(newValue);\\n }\\n\\n // Reads the last stored value\\n function retrieve() public view returns (uint256) {\\n return value;\\n }\\n}\\n\",\"keccak256\":\"0x40a0d691a6280d5bb9416106951c86399591fd77ea274f1e02b6baa7d68a29af\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5061002d61002261003260201b60201c565b61003a60201b60201c565b6100fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6105c38061010d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632e64cec11461005c5780636057361d1461007a578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b6100646100da565b6040516100719190610350565b60405180910390f35b610094600480360381019061008f919061039c565b6100e4565b005b61009e61012d565b005b6100a8610141565b6040516100b5919061040a565b60405180910390f35b6100d860048036038101906100d39190610451565b61016a565b005b6000600154905090565b6100ec6101ed565b806001819055507f93fe6d397c74fdf1402a8b72e47b68512f0510d7b98a4bc4cbdf6ac7108b3c59816040516101229190610350565b60405180910390a150565b6101356101ed565b61013f600061026b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101726101ed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d890610501565b60405180910390fd5b6101ea8161026b565b50565b6101f561032f565b73ffffffffffffffffffffffffffffffffffffffff16610213610141565b73ffffffffffffffffffffffffffffffffffffffff1614610269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609061056d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b600080fd5b61037981610337565b811461038457600080fd5b50565b60008135905061039681610370565b92915050565b6000602082840312156103b2576103b161036b565b5b60006103c084828501610387565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103f4826103c9565b9050919050565b610404816103e9565b82525050565b600060208201905061041f60008301846103fb565b92915050565b61042e816103e9565b811461043957600080fd5b50565b60008135905061044b81610425565b92915050565b6000602082840312156104675761046661036b565b5b60006104758482850161043c565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006104eb60268361047e565b91506104f68261048f565b604082019050919050565b6000602082019050818103600083015261051a816104de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061055760208361047e565b915061056282610521565b602082019050919050565b600060208201905081810360008301526105868161054a565b905091905056fea2646970667358221220934c0892f5e2c6e47639ed174f5093dcdc2264c605fc741014286f50f87e0e5064736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80632e64cec11461005c5780636057361d1461007a578063715018a6146100965780638da5cb5b146100a0578063f2fde38b146100be575b600080fd5b6100646100da565b6040516100719190610350565b60405180910390f35b610094600480360381019061008f919061039c565b6100e4565b005b61009e61012d565b005b6100a8610141565b6040516100b5919061040a565b60405180910390f35b6100d860048036038101906100d39190610451565b61016a565b005b6000600154905090565b6100ec6101ed565b806001819055507f93fe6d397c74fdf1402a8b72e47b68512f0510d7b98a4bc4cbdf6ac7108b3c59816040516101229190610350565b60405180910390a150565b6101356101ed565b61013f600061026b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6101726101ed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d890610501565b60405180910390fd5b6101ea8161026b565b50565b6101f561032f565b73ffffffffffffffffffffffffffffffffffffffff16610213610141565b73ffffffffffffffffffffffffffffffffffffffff1614610269576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609061056d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b600080fd5b61037981610337565b811461038457600080fd5b50565b60008135905061039681610370565b92915050565b6000602082840312156103b2576103b161036b565b5b60006103c084828501610387565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103f4826103c9565b9050919050565b610404816103e9565b82525050565b600060208201905061041f60008301846103fb565b92915050565b61042e816103e9565b811461043957600080fd5b50565b60008135905061044b81610425565b92915050565b6000602082840312156104675761046661036b565b5b60006104758482850161043c565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006104eb60268361047e565b91506104f68261048f565b604082019050919050565b6000602082019050818103600083015261051a816104de565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061055760208361047e565b915061056282610521565b602082019050919050565b600060208201905081810360008301526105868161054a565b905091905056fea2646970667358221220934c0892f5e2c6e47639ed174f5093dcdc2264c605fc741014286f50f87e0e5064736f6c63430008110033", - "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": 400, - "contract": "contracts/Box.sol:Box", - "label": "_owner", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 10088, - "contract": "contracts/Box.sol:Box", - "label": "value", - "offset": 0, - "slot": "1", - "type": "t_uint256" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/deployments/localhost/FundProject.json b/deployments/localhost/FundProject.json deleted file mode 100644 index 51e2b34..0000000 --- a/deployments/localhost/FundProject.json +++ /dev/null @@ -1,423 +0,0 @@ -{ - "address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", - "abi": [ - { - "inputs": [], - "name": "FundProject__NotApporovedByDao", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_projecID", - "type": "uint256" - } - ], - "name": "_getHashOfProjectData", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_ipfsHash", - "type": "string" - } - ], - "name": "_getProjectId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "_isApporovedByDao", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_projecID", - "type": "uint256" - } - ], - "name": "_isapporoveFundingByDao", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "_ipfsHash", - "type": "string" - } - ], - "name": "apporoveFundingByDao", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_projecID", - "type": "uint256" - } - ], - "name": "cancelApporovelFundingByDao", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_projecID", - "type": "uint256" - } - ], - "name": "fund", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "funders", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "name": "hashToProjectId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "idToHash", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "projectId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0xeafb7064c744cc0b86689488030c47d02dfd9cb63f88ee013618d681050b0123", - "receipt": { - "to": null, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", - "transactionIndex": 0, - "gasUsed": "1111209", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000002000000000000000000000008000000000000000000000000000000000000000000000000000200000000000000000040000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x67c7a9186622193f122f0770f99aee44cf7a884bf7fd2ea113f6b1b6bc39e053", - "transactionHash": "0xeafb7064c744cc0b86689488030c47d02dfd9cb63f88ee013618d681050b0123", - "logs": [ - { - "transactionIndex": 0, - "blockNumber": 10, - "transactionHash": "0xeafb7064c744cc0b86689488030c47d02dfd9cb63f88ee013618d681050b0123", - "address": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ], - "data": "0x", - "logIndex": 0, - "blockHash": "0x67c7a9186622193f122f0770f99aee44cf7a884bf7fd2ea113f6b1b6bc39e053" - } - ], - "blockNumber": 10, - "cumulativeGasUsed": "1111209", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "0934ff3c9c2ecd6d365975d91fef7cb5", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isapporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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/FundProject.sol\":\"FundProject\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract FundProject is Ownable {\\n error FundProject__NotApporovedByDao();\\n\\n uint256 public projectId = 1;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n }\\n\\n function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n _isApporovedByDao[projectId] = true;\\n projectId++;\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n _isApporovedByDao[_projecID] = false;\\n }\\n\\n function _isapporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n}\\n\",\"keccak256\":\"0x3d41ee36a763ea6697823208c87e02c74dd811980c78abc5a52ae1191f70f08e\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040526001805534801561001457600080fd5b5061003161002661003660201b60201c565b61003e60201b60201c565b610102565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61124a806101116000396000f3fe6080604052600436106100dd5760003560e01c80638da5cb5b1161007f578063ca1d209d11610059578063ca1d209d146102d2578063cf686259146102ee578063e983c2761461032b578063f2fde38b14610368576100dd565b80638da5cb5b1461022d5780638fb5548f14610258578063abe1aae614610295576100dd565b80634fac2bb7116100bb5780634fac2bb714610187578063715018a6146101c457806374c121b2146101db57806387030f4d14610204576100dd565b8063141a6c22146100e2578063148038b01461011f5780633fafa1271461015c575b600080fd5b3480156100ee57600080fd5b5061010960048036038101906101049190610a98565b610391565b6040516101169190610afa565b60405180910390f35b34801561012b57600080fd5b5061014660048036038101906101419190610b9f565b6103b9565b6040516101539190610afa565b60405180910390f35b34801561016857600080fd5b506101716103de565b60405161017e9190610afa565b60405180910390f35b34801561019357600080fd5b506101ae60048036038101906101a99190610bdf565b6103e4565b6040516101bb9190610c27565b60405180910390f35b3480156101d057600080fd5b506101d9610404565b005b3480156101e757600080fd5b5061020260048036038101906101fd9190610a98565b610418565b005b34801561021057600080fd5b5061022b60048036038101906102269190610bdf565b6104b1565b005b34801561023957600080fd5b506102426104e8565b60405161024f9190610c51565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a9190610bdf565b610511565b60405161028c9190610ceb565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190610bdf565b6105b1565b6040516102c99190610ceb565b60405180910390f35b6102ec60048036038101906102e79190610bdf565b610656565b005b3480156102fa57600080fd5b5061031560048036038101906103109190610a98565b610719565b6040516103229190610afa565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190610bdf565b610747565b60405161035f9190610c27565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190610d0d565b610771565b005b60006002826040516103a39190610d76565b9081526020016040518091039020549050919050565b6004602052816000526040600020602052806000526040600020600091509150505481565b60015481565b60056020528060005260406000206000915054906101000a900460ff1681565b61040c6107f4565b6104166000610872565b565b6104206107f4565b6001546002826040516104339190610d76565b9081526020016040518091039020819055508060036000600154815260200190815260200160002090816104679190610f99565b50600160056000600154815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008154809291906104a99061109a565b919050555050565b6104b96107f4565b60006005600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6003602052806000526040600020600091509050805461053090610dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461055c90610dbc565b80156105a95780601f1061057e576101008083540402835291602001916105a9565b820191906000526020600020905b81548152906001019060200180831161058c57829003601f168201915b505050505081565b60606003600083815260200190815260200160002080546105d190610dbc565b80601f01602080910402602001604051908101604052809291908181526020018280546105fd90610dbc565b801561064a5780601f1061061f5761010080835404028352916020019161064a565b820191906000526020600020905b81548152906001019060200180831161062d57829003601f168201915b50505050509050919050565b806005600082815260200190815260200160002060009054906101000a900460ff166106ae576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461070e91906110e2565b925050819055505050565b6002818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60006005600083815260200190815260200160002060009054906101000a900460ff169050919050565b6107796107f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611188565b60405180910390fd5b6107f181610872565b50565b6107fc610936565b73ffffffffffffffffffffffffffffffffffffffff1661081a6104e8565b73ffffffffffffffffffffffffffffffffffffffff1614610870576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610867906111f4565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6109a58261095c565b810181811067ffffffffffffffff821117156109c4576109c361096d565b5b80604052505050565b60006109d761093e565b90506109e3828261099c565b919050565b600067ffffffffffffffff821115610a0357610a0261096d565b5b610a0c8261095c565b9050602081019050919050565b82818337600083830152505050565b6000610a3b610a36846109e8565b6109cd565b905082815260208101848484011115610a5757610a56610957565b5b610a62848285610a19565b509392505050565b600082601f830112610a7f57610a7e610952565b5b8135610a8f848260208601610a28565b91505092915050565b600060208284031215610aae57610aad610948565b5b600082013567ffffffffffffffff811115610acc57610acb61094d565b5b610ad884828501610a6a565b91505092915050565b6000819050919050565b610af481610ae1565b82525050565b6000602082019050610b0f6000830184610aeb565b92915050565b610b1e81610ae1565b8114610b2957600080fd5b50565b600081359050610b3b81610b15565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6c82610b41565b9050919050565b610b7c81610b61565b8114610b8757600080fd5b50565b600081359050610b9981610b73565b92915050565b60008060408385031215610bb657610bb5610948565b5b6000610bc485828601610b2c565b9250506020610bd585828601610b8a565b9150509250929050565b600060208284031215610bf557610bf4610948565b5b6000610c0384828501610b2c565b91505092915050565b60008115159050919050565b610c2181610c0c565b82525050565b6000602082019050610c3c6000830184610c18565b92915050565b610c4b81610b61565b82525050565b6000602082019050610c666000830184610c42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ca6578082015181840152602081019050610c8b565b60008484015250505050565b6000610cbd82610c6c565b610cc78185610c77565b9350610cd7818560208601610c88565b610ce08161095c565b840191505092915050565b60006020820190508181036000830152610d058184610cb2565b905092915050565b600060208284031215610d2357610d22610948565b5b6000610d3184828501610b8a565b91505092915050565b600081905092915050565b6000610d5082610c6c565b610d5a8185610d3a565b9350610d6a818560208601610c88565b80840191505092915050565b6000610d828284610d45565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dd457607f821691505b602082108103610de757610de6610d8d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302610e4f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610e12565b610e598683610e12565b95508019841693508086168417925050509392505050565b6000819050919050565b6000610e96610e91610e8c84610ae1565b610e71565b610ae1565b9050919050565b6000819050919050565b610eb083610e7b565b610ec4610ebc82610e9d565b848454610e1f565b825550505050565b600090565b610ed9610ecc565b610ee4818484610ea7565b505050565b5b81811015610f0857610efd600082610ed1565b600181019050610eea565b5050565b601f821115610f4d57610f1e81610ded565b610f2784610e02565b81016020851015610f36578190505b610f4a610f4285610e02565b830182610ee9565b50505b505050565b600082821c905092915050565b6000610f7060001984600802610f52565b1980831691505092915050565b6000610f898383610f5f565b9150826002028217905092915050565b610fa282610c6c565b67ffffffffffffffff811115610fbb57610fba61096d565b5b610fc58254610dbc565b610fd0828285610f0c565b600060209050601f8311600181146110035760008415610ff1578287015190505b610ffb8582610f7d565b865550611063565b601f19841661101186610ded565b60005b8281101561103957848901518255600182019150602085019450602081019050611014565b868310156110565784890151611052601f891682610f5f565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006110a582610ae1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036110d7576110d661106b565b5b600182019050919050565b60006110ed82610ae1565b91506110f883610ae1565b92508282019050808211156111105761110f61106b565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611172602683610c77565b915061117d82611116565b604082019050919050565b600060208201905081810360008301526111a181611165565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006111de602083610c77565b91506111e9826111a8565b602082019050919050565b6000602082019050818103600083015261120d816111d1565b905091905056fea264697066735822122068e9250b9ff0fb4d5389f090651a4b0f2725e27ac47b7d2efd97167c68cac4c264736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106100dd5760003560e01c80638da5cb5b1161007f578063ca1d209d11610059578063ca1d209d146102d2578063cf686259146102ee578063e983c2761461032b578063f2fde38b14610368576100dd565b80638da5cb5b1461022d5780638fb5548f14610258578063abe1aae614610295576100dd565b80634fac2bb7116100bb5780634fac2bb714610187578063715018a6146101c457806374c121b2146101db57806387030f4d14610204576100dd565b8063141a6c22146100e2578063148038b01461011f5780633fafa1271461015c575b600080fd5b3480156100ee57600080fd5b5061010960048036038101906101049190610a98565b610391565b6040516101169190610afa565b60405180910390f35b34801561012b57600080fd5b5061014660048036038101906101419190610b9f565b6103b9565b6040516101539190610afa565b60405180910390f35b34801561016857600080fd5b506101716103de565b60405161017e9190610afa565b60405180910390f35b34801561019357600080fd5b506101ae60048036038101906101a99190610bdf565b6103e4565b6040516101bb9190610c27565b60405180910390f35b3480156101d057600080fd5b506101d9610404565b005b3480156101e757600080fd5b5061020260048036038101906101fd9190610a98565b610418565b005b34801561021057600080fd5b5061022b60048036038101906102269190610bdf565b6104b1565b005b34801561023957600080fd5b506102426104e8565b60405161024f9190610c51565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a9190610bdf565b610511565b60405161028c9190610ceb565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190610bdf565b6105b1565b6040516102c99190610ceb565b60405180910390f35b6102ec60048036038101906102e79190610bdf565b610656565b005b3480156102fa57600080fd5b5061031560048036038101906103109190610a98565b610719565b6040516103229190610afa565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190610bdf565b610747565b60405161035f9190610c27565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190610d0d565b610771565b005b60006002826040516103a39190610d76565b9081526020016040518091039020549050919050565b6004602052816000526040600020602052806000526040600020600091509150505481565b60015481565b60056020528060005260406000206000915054906101000a900460ff1681565b61040c6107f4565b6104166000610872565b565b6104206107f4565b6001546002826040516104339190610d76565b9081526020016040518091039020819055508060036000600154815260200190815260200160002090816104679190610f99565b50600160056000600154815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008154809291906104a99061109a565b919050555050565b6104b96107f4565b60006005600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6003602052806000526040600020600091509050805461053090610dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461055c90610dbc565b80156105a95780601f1061057e576101008083540402835291602001916105a9565b820191906000526020600020905b81548152906001019060200180831161058c57829003601f168201915b505050505081565b60606003600083815260200190815260200160002080546105d190610dbc565b80601f01602080910402602001604051908101604052809291908181526020018280546105fd90610dbc565b801561064a5780601f1061061f5761010080835404028352916020019161064a565b820191906000526020600020905b81548152906001019060200180831161062d57829003601f168201915b50505050509050919050565b806005600082815260200190815260200160002060009054906101000a900460ff166106ae576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461070e91906110e2565b925050819055505050565b6002818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b60006005600083815260200190815260200160002060009054906101000a900460ff169050919050565b6107796107f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611188565b60405180910390fd5b6107f181610872565b50565b6107fc610936565b73ffffffffffffffffffffffffffffffffffffffff1661081a6104e8565b73ffffffffffffffffffffffffffffffffffffffff1614610870576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610867906111f4565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6109a58261095c565b810181811067ffffffffffffffff821117156109c4576109c361096d565b5b80604052505050565b60006109d761093e565b90506109e3828261099c565b919050565b600067ffffffffffffffff821115610a0357610a0261096d565b5b610a0c8261095c565b9050602081019050919050565b82818337600083830152505050565b6000610a3b610a36846109e8565b6109cd565b905082815260208101848484011115610a5757610a56610957565b5b610a62848285610a19565b509392505050565b600082601f830112610a7f57610a7e610952565b5b8135610a8f848260208601610a28565b91505092915050565b600060208284031215610aae57610aad610948565b5b600082013567ffffffffffffffff811115610acc57610acb61094d565b5b610ad884828501610a6a565b91505092915050565b6000819050919050565b610af481610ae1565b82525050565b6000602082019050610b0f6000830184610aeb565b92915050565b610b1e81610ae1565b8114610b2957600080fd5b50565b600081359050610b3b81610b15565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6c82610b41565b9050919050565b610b7c81610b61565b8114610b8757600080fd5b50565b600081359050610b9981610b73565b92915050565b60008060408385031215610bb657610bb5610948565b5b6000610bc485828601610b2c565b9250506020610bd585828601610b8a565b9150509250929050565b600060208284031215610bf557610bf4610948565b5b6000610c0384828501610b2c565b91505092915050565b60008115159050919050565b610c2181610c0c565b82525050565b6000602082019050610c3c6000830184610c18565b92915050565b610c4b81610b61565b82525050565b6000602082019050610c666000830184610c42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ca6578082015181840152602081019050610c8b565b60008484015250505050565b6000610cbd82610c6c565b610cc78185610c77565b9350610cd7818560208601610c88565b610ce08161095c565b840191505092915050565b60006020820190508181036000830152610d058184610cb2565b905092915050565b600060208284031215610d2357610d22610948565b5b6000610d3184828501610b8a565b91505092915050565b600081905092915050565b6000610d5082610c6c565b610d5a8185610d3a565b9350610d6a818560208601610c88565b80840191505092915050565b6000610d828284610d45565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dd457607f821691505b602082108103610de757610de6610d8d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302610e4f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610e12565b610e598683610e12565b95508019841693508086168417925050509392505050565b6000819050919050565b6000610e96610e91610e8c84610ae1565b610e71565b610ae1565b9050919050565b6000819050919050565b610eb083610e7b565b610ec4610ebc82610e9d565b848454610e1f565b825550505050565b600090565b610ed9610ecc565b610ee4818484610ea7565b505050565b5b81811015610f0857610efd600082610ed1565b600181019050610eea565b5050565b601f821115610f4d57610f1e81610ded565b610f2784610e02565b81016020851015610f36578190505b610f4a610f4285610e02565b830182610ee9565b50505b505050565b600082821c905092915050565b6000610f7060001984600802610f52565b1980831691505092915050565b6000610f898383610f5f565b9150826002028217905092915050565b610fa282610c6c565b67ffffffffffffffff811115610fbb57610fba61096d565b5b610fc58254610dbc565b610fd0828285610f0c565b600060209050601f8311600181146110035760008415610ff1578287015190505b610ffb8582610f7d565b865550611063565b601f19841661101186610ded565b60005b8281101561103957848901518255600182019150602085019450602081019050611014565b868310156110565784890151611052601f891682610f5f565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006110a582610ae1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036110d7576110d661106b565b5b600182019050919050565b60006110ed82610ae1565b91506110f883610ae1565b92508282019050808211156111105761110f61106b565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611172602683610c77565b915061117d82611116565b604082019050919050565b600060208201905081810360008301526111a181611165565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006111de602083610c77565b91506111e9826111a8565b602082019050919050565b6000602082019050818103600083015261120d816111d1565b905091905056fea264697066735822122068e9250b9ff0fb4d5389f090651a4b0f2725e27ac47b7d2efd97167c68cac4c264736f6c63430008110033", - "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": 7, - "contract": "contracts/FundProject.sol:FundProject", - "label": "_owner", - "offset": 0, - "slot": "0", - "type": "t_address" - }, - { - "astId": 144, - "contract": "contracts/FundProject.sol:FundProject", - "label": "projectId", - "offset": 0, - "slot": "1", - "type": "t_uint256" - }, - { - "astId": 148, - "contract": "contracts/FundProject.sol:FundProject", - "label": "hashToProjectId", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_string_memory_ptr,t_uint256)" - }, - { - "astId": 152, - "contract": "contracts/FundProject.sol:FundProject", - "label": "idToHash", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_uint256,t_string_storage)" - }, - { - "astId": 158, - "contract": "contracts/FundProject.sol:FundProject", - "label": "funders", - "offset": 0, - "slot": "4", - "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" - }, - { - "astId": 162, - "contract": "contracts/FundProject.sol:FundProject", - "label": "_isApporovedByDao", - "offset": 0, - "slot": "5", - "type": "t_mapping(t_uint256,t_bool)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_string_memory_ptr,t_uint256)": { - "encoding": "mapping", - "key": "t_string_memory_ptr", - "label": "mapping(string => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_uint256,t_bool)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => bool)", - "numberOfBytes": "32", - "value": "t_bool" - }, - "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_mapping(t_uint256,t_string_storage)": { - "encoding": "mapping", - "key": "t_uint256", - "label": "mapping(uint256 => string)", - "numberOfBytes": "32", - "value": "t_string_storage" - }, - "t_string_memory_ptr": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - } - } - } -} \ No newline at end of file diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index 5097bd9..8152f4e 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -1,5 +1,5 @@ { - "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "abi": [ { "inputs": [], @@ -81,6 +81,25 @@ "name": "DelegateVotesChanged", "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": [ @@ -527,6 +546,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -570,6 +602,13 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "s_initialSupply", @@ -661,59 +700,86 @@ ], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], - "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", + "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "transactionIndex": 0, - "gasUsed": "3606454", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000410000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000008000000000020000000000000000000000000200000000000000000000000000000000000000000", - "blockHash": "0x4b926420f3f972c69a385274ba00055d9c5bb46d1bc930ce20e9ac94d823005a", - "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", + "gasUsed": "3780772", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000410000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000001000000000002000000008000000000020000000000000000000000000200000000000000000000000800000000000000000", + "blockHash": "0x14a20147e8e5d17e8e2c574d64f5d52a86318524af00f8d351404b1cf0cf2a14", + "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", "logs": [ { "transactionIndex": 0, - "blockNumber": 1, - "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", - "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "blockNumber": 2, + "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x14a20147e8e5d17e8e2c574d64f5d52a86318524af00f8d351404b1cf0cf2a14" + }, + { + "transactionIndex": 0, + "blockNumber": 2, + "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", - "logIndex": 0, - "blockHash": "0x4b926420f3f972c69a385274ba00055d9c5bb46d1bc930ce20e9ac94d823005a" + "logIndex": 1, + "blockHash": "0x14a20147e8e5d17e8e2c574d64f5d52a86318524af00f8d351404b1cf0cf2a14" }, { "transactionIndex": 0, - "blockNumber": 1, - "transactionHash": "0x7491f45824d6f62c87c47665e3fbf6032de93feae5a40ca17e1d3c37bbb93b40", - "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "blockNumber": 2, + "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "topics": [ "0xd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", - "logIndex": 1, - "blockHash": "0x4b926420f3f972c69a385274ba00055d9c5bb46d1bc930ce20e9ac94d823005a" + "logIndex": 2, + "blockHash": "0x14a20147e8e5d17e8e2c574d64f5d52a86318524af00f8d351404b1cf0cf2a14" } ], - "blockNumber": 1, - "cumulativeGasUsed": "3606454", + "blockNumber": 2, + "cumulativeGasUsed": "3780772", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "66f18b8ec322110c2dd2cceea16c0aca", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_initialSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes {\\n uint256 public s_initialSupply = 1000000e18;\\n address private immutable i_owner;\\n\\n event TokenTransfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n modifier onlyOwner() {\\n require(i_owner == msg.sender, \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n i_owner = msg.sender;\\n _mint(msg.sender, s_initialSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n emit TokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount)\\n internal\\n override(ERC20Votes)\\n onlyOwner\\n {\\n super._mint(to, amount);\\n }\\n\\n function mintToken(address to, uint256 amount) external {\\n _mint(to, amount);\\n }\\n\\n function burnToken(address account, uint256 amount) external {\\n _burn(account, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0x50615b1158220c5c6d5ac9ebf9507f9f4ea531e0ef593c65b50ebc91a9eaf1ff\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x61016060405269d3c21bcecceda1000000600a553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000eda565b5080600490816200011d919062000eda565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001898184846200022260201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050503373ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff16815250506200021c33600a546200025e60201b60201c565b6200146a565b600083838346306040516020016200023f95949392919062001032565b6040516020818303038152906040528051906020012090509392505050565b3373ffffffffffffffffffffffffffffffffffffffff166101405173ffffffffffffffffffffffffffffffffffffffff1614620002d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c990620010f0565b60405180910390fd5b620002e98282620002ed60201b62000f241760201c565b5050565b620003048282620003ab60201b62000fb11760201c565b620003146200052360201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620003426200054760201b60201c565b111562000386576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037d9062001188565b60405180910390fd5b620003a560096200055160201b6200111017836200056960201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200041d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041490620011fa565b60405180910390fd5b62000431600083836200081a60201b60201c565b80600260008282546200044591906200124b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200049c91906200124b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000503919062001286565b60405180910390a36200051f600083836200081f60201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b600081836200056191906200124b565b905092915050565b60008060008580549050905060008114620005de57856001826200058e9190620012a3565b81548110620005a257620005a1620012de565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620005e1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200060d83858760201c565b915060008111801562000666575043866001836200062c9190620012a3565b8154811062000640576200063f620012de565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1562000707576200068282620008a360201b620011261760201c565b86600183620006929190620012a3565b81548110620006a657620006a5620012de565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000811565b85604051806040016040528062000729436200091160201b620011911760201c565b63ffffffff1681526020016200074a85620008a360201b620011261760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b620008378383836200096760201b620011e41760201c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de68360405162000896919062001286565b60405180910390a3505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000909576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009009062001383565b60405180910390fd5b819050919050565b600063ffffffff80168211156200095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000956906200141b565b60405180910390fd5b819050919050565b6200097f838383620009b760201b6200120f1760201c565b620009b26200099484620009bc60201b60201c565b620009a584620009bc60201b60201c565b8362000a2560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000a625750600081115b1562000c4357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000b555760008062000afc600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000c4860201b6200121417856200056960201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000b4a9291906200143d565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000c425760008062000be9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200055160201b6200111017856200056960201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c379291906200143d565b60405180910390a250505b5b505050565b6000818362000c589190620012a3565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ce257607f821691505b60208210810362000cf85762000cf762000c9a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000d627fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d23565b62000d6e868362000d23565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000dbb62000db562000daf8462000d86565b62000d90565b62000d86565b9050919050565b6000819050919050565b62000dd78362000d9a565b62000def62000de68262000dc2565b84845462000d30565b825550505050565b600090565b62000e0662000df7565b62000e1381848462000dcc565b505050565b5b8181101562000e3b5762000e2f60008262000dfc565b60018101905062000e19565b5050565b601f82111562000e8a5762000e548162000cfe565b62000e5f8462000d13565b8101602085101562000e6f578190505b62000e8762000e7e8562000d13565b83018262000e18565b50505b505050565b600082821c905092915050565b600062000eaf6000198460080262000e8f565b1980831691505092915050565b600062000eca838362000e9c565b9150826002028217905092915050565b62000ee58262000c60565b67ffffffffffffffff81111562000f015762000f0062000c6b565b5b62000f0d825462000cc9565b62000f1a82828562000e3f565b600060209050601f83116001811462000f52576000841562000f3d578287015190505b62000f49858262000ebc565b86555062000fb9565b601f19841662000f628662000cfe565b60005b8281101562000f8c5784890151825560018201915060208501945060208101905062000f65565b8683101562000fac578489015162000fa8601f89168262000e9c565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000fd68162000fc1565b82525050565b62000fe78162000d86565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200101a8262000fed565b9050919050565b6200102c816200100d565b82525050565b600060a08201905062001049600083018862000fcb565b62001058602083018762000fcb565b62001067604083018662000fcb565b62001076606083018562000fdc565b62001085608083018462001021565b9695505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620010d86020836200108f565b9150620010e582620010a0565b602082019050919050565b600060208201905081810360008301526200110b81620010c9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000620011706030836200108f565b91506200117d8262001112565b604082019050919050565b60006020820190508181036000830152620011a38162001161565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620011e2601f836200108f565b9150620011ef82620011aa565b602082019050919050565b600060208201905081810360008301526200121581620011d3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620012588262000d86565b9150620012658362000d86565b925082820190508082111562001280576200127f6200121c565b5b92915050565b60006020820190506200129d600083018462000fdc565b92915050565b6000620012b08262000d86565b9150620012bd8362000d86565b9250828203905081811115620012d857620012d76200121c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200136b6027836200108f565b915062001378826200130d565b604082019050919050565b600060208201905081810360008301526200139e816200135c565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620014036026836200108f565b91506200141082620013a5565b604082019050919050565b600060208201905081810360008301526200143681620013f4565b9050919050565b600060408201905062001454600083018562000fdc565b62001463602083018462000fdc565b9392505050565b60805160a05160c05160e051610100516101205161014051613c30620014c56000396000611a5f015260006117b4015260006117f6015260006117d50152600061170a01526000611760015260006117890152613c306000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a457c2d711610097578063d1df306c11610071578063d1df306c146104c0578063d505accf146104dc578063dd62ed3e146104f8578063f1127ed81461052857610173565b8063a457c2d714610444578063a9059cbb14610474578063c3cda520146104a457610173565b806370a082311461034a57806379c650681461037a5780637ecebe00146103965780638e539e8c146103c657806395d89b41146103f65780639ab24eb01461041457610173565b80633644e515116101305780633644e51514610250578063395093511461026e5780633a46b1a81461029e578063587cde1e146102ce5780635c19a95c146102fe5780636fcfff451461031a57610173565b806306fdde0314610178578063095ea7b314610196578063096b34cf146101c657806318160ddd146101e457806323b872dd14610202578063313ce56714610232575b600080fd5b610180610558565b60405161018d91906126f3565b60405180910390f35b6101b060048036038101906101ab91906127ae565b6105ea565b6040516101bd9190612809565b60405180910390f35b6101ce61060d565b6040516101db9190612833565b60405180910390f35b6101ec610613565b6040516101f99190612833565b60405180910390f35b61021c6004803603810190610217919061284e565b61061d565b6040516102299190612809565b60405180910390f35b61023a61064c565b60405161024791906128bd565b60405180910390f35b610258610655565b60405161026591906128f1565b60405180910390f35b610288600480360381019061028391906127ae565b610664565b6040516102959190612809565b60405180910390f35b6102b860048036038101906102b391906127ae565b61069b565b6040516102c59190612833565b60405180910390f35b6102e860048036038101906102e3919061290c565b61072f565b6040516102f59190612948565b60405180910390f35b6103186004803603810190610313919061290c565b610798565b005b610334600480360381019061032f919061290c565b6107ac565b6040516103419190612982565b60405180910390f35b610364600480360381019061035f919061290c565b610800565b6040516103719190612833565b60405180910390f35b610394600480360381019061038f91906127ae565b610848565b005b6103b060048036038101906103ab919061290c565b610856565b6040516103bd9190612833565b60405180910390f35b6103e060048036038101906103db919061299d565b6108a6565b6040516103ed9190612833565b60405180910390f35b6103fe6108fc565b60405161040b91906126f3565b60405180910390f35b61042e6004803603810190610429919061290c565b61098e565b60405161043b9190612833565b60405180910390f35b61045e600480360381019061045991906127ae565b610a9f565b60405161046b9190612809565b60405180910390f35b61048e600480360381019061048991906127ae565b610b16565b60405161049b9190612809565b60405180910390f35b6104be60048036038101906104b99190612a22565b610b39565b005b6104da60048036038101906104d591906127ae565b610c3d565b005b6104f660048036038101906104f19190612aaf565b610c4b565b005b610512600480360381019061050d9190612b51565b610d8d565b60405161051f9190612833565b60405180910390f35b610542600480360381019061053d9190612bbd565b610e14565b60405161054f9190612c72565b60405180910390f35b60606003805461056790612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461059390612cbc565b80156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b5050505050905090565b6000806105f561122a565b9050610602818585611232565b600191505092915050565b600a5481565b6000600254905090565b60008061062861122a565b90506106358582856113fb565b610640858585611487565b60019150509392505050565b60006012905090565b600061065f611706565b905090565b60008061066f61122a565b90506106908185856106818589610d8d565b61068b9190612d1c565b611232565b600191505092915050565b60004382106106df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d690612d9c565b60405180910390fd5b610727600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611820565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6107a96107a361122a565b8261192c565b50565b60006107f9600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611191565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108528282611a46565b5050565b600061089f600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ae2565b9050919050565b60004382106108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190612d9c565b60405180910390fd5b6108f5600983611820565b9050919050565b60606004805461090b90612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461093790612cbc565b80156109845780601f1061095957610100808354040283529160200191610984565b820191906000526020600020905b81548152906001019060200180831161096757829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a7657600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610a2a9190612dbc565b81548110610a3b57610a3a612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a79565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610aaa61122a565b90506000610ab88286610d8d565b905083811015610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af490612e91565b60405180910390fd5b610b0a8286868403611232565b60019250505092915050565b600080610b2161122a565b9050610b2e818585611487565b600191505092915050565b83421115610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612efd565b60405180910390fd5b6000610bde610bd67fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610bbb9493929190612f1d565b60405160208183030381529060405280519060200120611af0565b858585611b0a565b9050610be981611b35565b8614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190612fae565b60405180910390fd5b610c34818861192c565b50505050505050565b610c478282611b93565b5050565b83421115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c859061301a565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610cbd8c611b35565b89604051602001610cd39695949392919061303a565b6040516020818303038152906040528051906020012090506000610cf682611af0565b90506000610d0682878787611b0a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906130e7565b60405180910390fd5b610d818a8a8a611232565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e1c612625565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610e7357610e72612df0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610f2e8282610fb1565b610f36611ba1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f5c610613565b1115610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613179565b60405180910390fd5b610fab600961111083611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611017906131e5565b60405180910390fd5b61102c60008383611e3d565b806002600082825461103e9190612d1c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110939190612d1c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110f89190612833565b60405180910390a361110c60008383611e42565b5050565b6000818361111e9190612d1c565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613277565b60405180910390fd5b819050919050565b600063ffffffff80168211156111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613309565b60405180910390fd5b819050919050565b6111ef83838361120f565b61120a6111fb8461072f565b6112048461072f565b83611eb7565b505050565b505050565b600081836112229190612dbc565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112989061339b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061342d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113ee9190612833565b60405180910390a3505050565b60006114078484610d8d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114815781811015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613499565b60405180910390fd5b6114808484848403611232565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed9061352b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c906135bd565b60405180910390fd5b611570838383611e3d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed9061364f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116899190612d1c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116ed9190612833565b60405180910390a3611700848484611e42565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561178257507f000000000000000000000000000000000000000000000000000000000000000046145b156117af577f0000000000000000000000000000000000000000000000000000000000000000905061181d565b61181a7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006120b0565b90505b90565b6000808380549050905060005b8181101561189f57600061184182846120ea565b90508486828154811061185757611856612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561188957809250611899565b6001816118969190612d1c565b91505b5061182d565b6000821461190157846001836118b59190612dbc565b815481106118c6576118c5612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611904565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006119378361072f565b9050600061194484610800565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611a40828483611eb7565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb906136bb565b60405180910390fd5b611ade8282610f24565b5050565b600081600001549050919050565b6000611b03611afd611706565b83612110565b9050919050565b6000806000611b1b87878787612143565b91509150611b288161224f565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b8281611ae2565b9150611b8d8161241b565b50919050565b611b9d8282612431565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611c335785600182611be79190612dbc565b81548110611bf857611bf7612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c36565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611c6483858763ffffffff16565b9150600081118015611cb757504386600183611c809190612dbc565b81548110611c9157611c90612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611d4457611cc582611126565b86600183611cd39190612dbc565b81548110611ce457611ce3612df0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611e34565b856040518060400160405280611d5943611191565b63ffffffff168152602001611d6d85611126565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611e4d8383836111e4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051611eaa9190612833565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ef35750600081115b156120ab57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fd157600080611f7a600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061121485611bc5565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611fc69291906136db565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120aa57600080612053600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061111085611bc5565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161209f9291906136db565b60405180910390a250505b5b505050565b600083838346306040516020016120cb959493929190613704565b6040516020818303038152906040528051906020012090509392505050565b600060028284186120fb9190613786565b8284166121089190612d1c565b905092915050565b6000828260405160200161212592919061382f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561217e576000600391509150612246565b601b8560ff16141580156121965750601c8560ff1614155b156121a8576000600491509150612246565b6000600187878787604051600081526020016040526040516121cd9493929190613866565b6020604051602081039080840390855afa1580156121ef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223d57600060019250925050612246565b80600092509250505b94509492505050565b60006004811115612263576122626138ab565b5b816004811115612276576122756138ab565b5b031561241857600160048111156122905761228f6138ab565b5b8160048111156122a3576122a26138ab565b5b036122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613926565b60405180910390fd5b600260048111156122f7576122f66138ab565b5b81600481111561230a576123096138ab565b5b0361234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190613992565b60405180910390fd5b6003600481111561235e5761235d6138ab565b5b816004811115612371576123706138ab565b5b036123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890613a24565b60405180910390fd5b6004808111156123c4576123c36138ab565b5b8160048111156123d7576123d66138ab565b5b03612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90613ab6565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61243b828261244f565b612449600961121483611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590613b48565b60405180910390fd5b6124ca82600083611e3d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254790613bda565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546125a79190612dbc565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161260c9190612833565b60405180910390a361262083600084611e42565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561269d578082015181840152602081019050612682565b60008484015250505050565b6000601f19601f8301169050919050565b60006126c582612663565b6126cf818561266e565b93506126df81856020860161267f565b6126e8816126a9565b840191505092915050565b6000602082019050818103600083015261270d81846126ba565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127458261271a565b9050919050565b6127558161273a565b811461276057600080fd5b50565b6000813590506127728161274c565b92915050565b6000819050919050565b61278b81612778565b811461279657600080fd5b50565b6000813590506127a881612782565b92915050565b600080604083850312156127c5576127c4612715565b5b60006127d385828601612763565b92505060206127e485828601612799565b9150509250929050565b60008115159050919050565b612803816127ee565b82525050565b600060208201905061281e60008301846127fa565b92915050565b61282d81612778565b82525050565b60006020820190506128486000830184612824565b92915050565b60008060006060848603121561286757612866612715565b5b600061287586828701612763565b935050602061288686828701612763565b925050604061289786828701612799565b9150509250925092565b600060ff82169050919050565b6128b7816128a1565b82525050565b60006020820190506128d260008301846128ae565b92915050565b6000819050919050565b6128eb816128d8565b82525050565b600060208201905061290660008301846128e2565b92915050565b60006020828403121561292257612921612715565b5b600061293084828501612763565b91505092915050565b6129428161273a565b82525050565b600060208201905061295d6000830184612939565b92915050565b600063ffffffff82169050919050565b61297c81612963565b82525050565b60006020820190506129976000830184612973565b92915050565b6000602082840312156129b3576129b2612715565b5b60006129c184828501612799565b91505092915050565b6129d3816128a1565b81146129de57600080fd5b50565b6000813590506129f0816129ca565b92915050565b6129ff816128d8565b8114612a0a57600080fd5b50565b600081359050612a1c816129f6565b92915050565b60008060008060008060c08789031215612a3f57612a3e612715565b5b6000612a4d89828a01612763565b9650506020612a5e89828a01612799565b9550506040612a6f89828a01612799565b9450506060612a8089828a016129e1565b9350506080612a9189828a01612a0d565b92505060a0612aa289828a01612a0d565b9150509295509295509295565b600080600080600080600060e0888a031215612ace57612acd612715565b5b6000612adc8a828b01612763565b9750506020612aed8a828b01612763565b9650506040612afe8a828b01612799565b9550506060612b0f8a828b01612799565b9450506080612b208a828b016129e1565b93505060a0612b318a828b01612a0d565b92505060c0612b428a828b01612a0d565b91505092959891949750929550565b60008060408385031215612b6857612b67612715565b5b6000612b7685828601612763565b9250506020612b8785828601612763565b9150509250929050565b612b9a81612963565b8114612ba557600080fd5b50565b600081359050612bb781612b91565b92915050565b60008060408385031215612bd457612bd3612715565b5b6000612be285828601612763565b9250506020612bf385828601612ba8565b9150509250929050565b612c0681612963565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612c3d81612c0c565b82525050565b604082016000820151612c596000850182612bfd565b506020820151612c6c6020850182612c34565b50505050565b6000604082019050612c876000830184612c43565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd457607f821691505b602082108103612ce757612ce6612c8d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d2782612778565b9150612d3283612778565b9250828201905080821115612d4a57612d49612ced565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612d86601f8361266e565b9150612d9182612d50565b602082019050919050565b60006020820190508181036000830152612db581612d79565b9050919050565b6000612dc782612778565b9150612dd283612778565b9250828203905081811115612dea57612de9612ced565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e7b60258361266e565b9150612e8682612e1f565b604082019050919050565b60006020820190508181036000830152612eaa81612e6e565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612ee7601d8361266e565b9150612ef282612eb1565b602082019050919050565b60006020820190508181036000830152612f1681612eda565b9050919050565b6000608082019050612f3260008301876128e2565b612f3f6020830186612939565b612f4c6040830185612824565b612f596060830184612824565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612f9860198361266e565b9150612fa382612f62565b602082019050919050565b60006020820190508181036000830152612fc781612f8b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613004601d8361266e565b915061300f82612fce565b602082019050919050565b6000602082019050818103600083015261303381612ff7565b9050919050565b600060c08201905061304f60008301896128e2565b61305c6020830188612939565b6130696040830187612939565b6130766060830186612824565b6130836080830185612824565b61309060a0830184612824565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006130d1601e8361266e565b91506130dc8261309b565b602082019050919050565b60006020820190508181036000830152613100816130c4565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b600061316360308361266e565b915061316e82613107565b604082019050919050565b6000602082019050818103600083015261319281613156565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006131cf601f8361266e565b91506131da82613199565b602082019050919050565b600060208201905081810360008301526131fe816131c2565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061326160278361266e565b915061326c82613205565b604082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006132f360268361266e565b91506132fe82613297565b604082019050919050565b60006020820190508181036000830152613322816132e6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061338560248361266e565b915061339082613329565b604082019050919050565b600060208201905081810360008301526133b481613378565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061341760228361266e565b9150613422826133bb565b604082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613483601d8361266e565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061351560258361266e565b9150613520826134b9565b604082019050919050565b6000602082019050818103600083015261354481613508565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006135a760238361266e565b91506135b28261354b565b604082019050919050565b600060208201905081810360008301526135d68161359a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061363960268361266e565b9150613644826135dd565b604082019050919050565b600060208201905081810360008301526136688161362c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136a560208361266e565b91506136b08261366f565b602082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b60006040820190506136f06000830185612824565b6136fd6020830184612824565b9392505050565b600060a08201905061371960008301886128e2565b61372660208301876128e2565b61373360408301866128e2565b6137406060830185612824565b61374d6080830184612939565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061379182612778565b915061379c83612778565b9250826137ac576137ab613757565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006137f86002836137b7565b9150613803826137c2565b600282019050919050565b6000819050919050565b613829613824826128d8565b61380e565b82525050565b600061383a826137eb565b91506138468285613818565b6020820191506138568284613818565b6020820191508190509392505050565b600060808201905061387b60008301876128e2565b61388860208301866128ae565b61389560408301856128e2565b6138a260608301846128e2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061391060188361266e565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061397c601f8361266e565b915061398782613946565b602082019050919050565b600060208201905081810360008301526139ab8161396f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0e60228361266e565b9150613a19826139b2565b604082019050919050565b60006020820190508181036000830152613a3d81613a01565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613aa060228361266e565b9150613aab82613a44565b604082019050919050565b60006020820190508181036000830152613acf81613a93565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b3260218361266e565b9150613b3d82613ad6565b604082019050919050565b60006020820190508181036000830152613b6181613b25565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc460228361266e565b9150613bcf82613b68565b604082019050919050565b60006020820190508181036000830152613bf381613bb7565b905091905056fea26469706673582212208cef1b9fdc7e68a76433516319a5957edfb8b21989789d9b16fd80e4cfe8088d64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a457c2d711610097578063d1df306c11610071578063d1df306c146104c0578063d505accf146104dc578063dd62ed3e146104f8578063f1127ed81461052857610173565b8063a457c2d714610444578063a9059cbb14610474578063c3cda520146104a457610173565b806370a082311461034a57806379c650681461037a5780637ecebe00146103965780638e539e8c146103c657806395d89b41146103f65780639ab24eb01461041457610173565b80633644e515116101305780633644e51514610250578063395093511461026e5780633a46b1a81461029e578063587cde1e146102ce5780635c19a95c146102fe5780636fcfff451461031a57610173565b806306fdde0314610178578063095ea7b314610196578063096b34cf146101c657806318160ddd146101e457806323b872dd14610202578063313ce56714610232575b600080fd5b610180610558565b60405161018d91906126f3565b60405180910390f35b6101b060048036038101906101ab91906127ae565b6105ea565b6040516101bd9190612809565b60405180910390f35b6101ce61060d565b6040516101db9190612833565b60405180910390f35b6101ec610613565b6040516101f99190612833565b60405180910390f35b61021c6004803603810190610217919061284e565b61061d565b6040516102299190612809565b60405180910390f35b61023a61064c565b60405161024791906128bd565b60405180910390f35b610258610655565b60405161026591906128f1565b60405180910390f35b610288600480360381019061028391906127ae565b610664565b6040516102959190612809565b60405180910390f35b6102b860048036038101906102b391906127ae565b61069b565b6040516102c59190612833565b60405180910390f35b6102e860048036038101906102e3919061290c565b61072f565b6040516102f59190612948565b60405180910390f35b6103186004803603810190610313919061290c565b610798565b005b610334600480360381019061032f919061290c565b6107ac565b6040516103419190612982565b60405180910390f35b610364600480360381019061035f919061290c565b610800565b6040516103719190612833565b60405180910390f35b610394600480360381019061038f91906127ae565b610848565b005b6103b060048036038101906103ab919061290c565b610856565b6040516103bd9190612833565b60405180910390f35b6103e060048036038101906103db919061299d565b6108a6565b6040516103ed9190612833565b60405180910390f35b6103fe6108fc565b60405161040b91906126f3565b60405180910390f35b61042e6004803603810190610429919061290c565b61098e565b60405161043b9190612833565b60405180910390f35b61045e600480360381019061045991906127ae565b610a9f565b60405161046b9190612809565b60405180910390f35b61048e600480360381019061048991906127ae565b610b16565b60405161049b9190612809565b60405180910390f35b6104be60048036038101906104b99190612a22565b610b39565b005b6104da60048036038101906104d591906127ae565b610c3d565b005b6104f660048036038101906104f19190612aaf565b610c4b565b005b610512600480360381019061050d9190612b51565b610d8d565b60405161051f9190612833565b60405180910390f35b610542600480360381019061053d9190612bbd565b610e14565b60405161054f9190612c72565b60405180910390f35b60606003805461056790612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461059390612cbc565b80156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b5050505050905090565b6000806105f561122a565b9050610602818585611232565b600191505092915050565b600a5481565b6000600254905090565b60008061062861122a565b90506106358582856113fb565b610640858585611487565b60019150509392505050565b60006012905090565b600061065f611706565b905090565b60008061066f61122a565b90506106908185856106818589610d8d565b61068b9190612d1c565b611232565b600191505092915050565b60004382106106df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d690612d9c565b60405180910390fd5b610727600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611820565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6107a96107a361122a565b8261192c565b50565b60006107f9600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611191565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108528282611a46565b5050565b600061089f600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611ae2565b9050919050565b60004382106108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190612d9c565b60405180910390fd5b6108f5600983611820565b9050919050565b60606004805461090b90612cbc565b80601f016020809104026020016040519081016040528092919081815260200182805461093790612cbc565b80156109845780601f1061095957610100808354040283529160200191610984565b820191906000526020600020905b81548152906001019060200180831161096757829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610a7657600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610a2a9190612dbc565b81548110610a3b57610a3a612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610a79565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610aaa61122a565b90506000610ab88286610d8d565b905083811015610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af490612e91565b60405180910390fd5b610b0a8286868403611232565b60019250505092915050565b600080610b2161122a565b9050610b2e818585611487565b600191505092915050565b83421115610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7390612efd565b60405180910390fd5b6000610bde610bd67fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610bbb9493929190612f1d565b60405160208183030381529060405280519060200120611af0565b858585611b0a565b9050610be981611b35565b8614610c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2190612fae565b60405180910390fd5b610c34818861192c565b50505050505050565b610c478282611b93565b5050565b83421115610c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c859061301a565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610cbd8c611b35565b89604051602001610cd39695949392919061303a565b6040516020818303038152906040528051906020012090506000610cf682611af0565b90506000610d0682878787611b0a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906130e7565b60405180910390fd5b610d818a8a8a611232565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e1c612625565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610e7357610e72612df0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610f2e8282610fb1565b610f36611ba1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f5c610613565b1115610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490613179565b60405180910390fd5b610fab600961111083611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611020576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611017906131e5565b60405180910390fd5b61102c60008383611e3d565b806002600082825461103e9190612d1c565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110939190612d1c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516110f89190612833565b60405180910390a361110c60008383611e42565b5050565b6000818361111e9190612d1c565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613277565b60405180910390fd5b819050919050565b600063ffffffff80168211156111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613309565b60405180910390fd5b819050919050565b6111ef83838361120f565b61120a6111fb8461072f565b6112048461072f565b83611eb7565b505050565b505050565b600081836112229190612dbc565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112989061339b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061342d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516113ee9190612833565b60405180910390a3505050565b60006114078484610d8d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114815781811015611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613499565b60405180910390fd5b6114808484848403611232565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed9061352b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c906135bd565b60405180910390fd5b611570838383611e3d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed9061364f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116899190612d1c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516116ed9190612833565b60405180910390a3611700848484611e42565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561178257507f000000000000000000000000000000000000000000000000000000000000000046145b156117af577f0000000000000000000000000000000000000000000000000000000000000000905061181d565b61181a7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006120b0565b90505b90565b6000808380549050905060005b8181101561189f57600061184182846120ea565b90508486828154811061185757611856612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561188957809250611899565b6001816118969190612d1c565b91505b5061182d565b6000821461190157846001836118b59190612dbc565b815481106118c6576118c5612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611904565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006119378361072f565b9050600061194484610800565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611a40828483611eb7565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb906136bb565b60405180910390fd5b611ade8282610f24565b5050565b600081600001549050919050565b6000611b03611afd611706565b83612110565b9050919050565b6000806000611b1b87878787612143565b91509150611b288161224f565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b8281611ae2565b9150611b8d8161241b565b50919050565b611b9d8282612431565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611c335785600182611be79190612dbc565b81548110611bf857611bf7612df0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c36565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611c6483858763ffffffff16565b9150600081118015611cb757504386600183611c809190612dbc565b81548110611c9157611c90612df0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611d4457611cc582611126565b86600183611cd39190612dbc565b81548110611ce457611ce3612df0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611e34565b856040518060400160405280611d5943611191565b63ffffffff168152602001611d6d85611126565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611e4d8383836111e4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051611eaa9190612833565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611ef35750600081115b156120ab57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fd157600080611f7a600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061121485611bc5565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611fc69291906136db565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120aa57600080612053600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061111085611bc5565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161209f9291906136db565b60405180910390a250505b5b505050565b600083838346306040516020016120cb959493929190613704565b6040516020818303038152906040528051906020012090509392505050565b600060028284186120fb9190613786565b8284166121089190612d1c565b905092915050565b6000828260405160200161212592919061382f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561217e576000600391509150612246565b601b8560ff16141580156121965750601c8560ff1614155b156121a8576000600491509150612246565b6000600187878787604051600081526020016040526040516121cd9493929190613866565b6020604051602081039080840390855afa1580156121ef573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223d57600060019250925050612246565b80600092509250505b94509492505050565b60006004811115612263576122626138ab565b5b816004811115612276576122756138ab565b5b031561241857600160048111156122905761228f6138ab565b5b8160048111156122a3576122a26138ab565b5b036122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da90613926565b60405180910390fd5b600260048111156122f7576122f66138ab565b5b81600481111561230a576123096138ab565b5b0361234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190613992565b60405180910390fd5b6003600481111561235e5761235d6138ab565b5b816004811115612371576123706138ab565b5b036123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890613a24565b60405180910390fd5b6004808111156123c4576123c36138ab565b5b8160048111156123d7576123d66138ab565b5b03612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90613ab6565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61243b828261244f565b612449600961121483611bc5565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590613b48565b60405180910390fd5b6124ca82600083611e3d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254790613bda565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546125a79190612dbc565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161260c9190612833565b60405180910390a361262083600084611e42565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561269d578082015181840152602081019050612682565b60008484015250505050565b6000601f19601f8301169050919050565b60006126c582612663565b6126cf818561266e565b93506126df81856020860161267f565b6126e8816126a9565b840191505092915050565b6000602082019050818103600083015261270d81846126ba565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127458261271a565b9050919050565b6127558161273a565b811461276057600080fd5b50565b6000813590506127728161274c565b92915050565b6000819050919050565b61278b81612778565b811461279657600080fd5b50565b6000813590506127a881612782565b92915050565b600080604083850312156127c5576127c4612715565b5b60006127d385828601612763565b92505060206127e485828601612799565b9150509250929050565b60008115159050919050565b612803816127ee565b82525050565b600060208201905061281e60008301846127fa565b92915050565b61282d81612778565b82525050565b60006020820190506128486000830184612824565b92915050565b60008060006060848603121561286757612866612715565b5b600061287586828701612763565b935050602061288686828701612763565b925050604061289786828701612799565b9150509250925092565b600060ff82169050919050565b6128b7816128a1565b82525050565b60006020820190506128d260008301846128ae565b92915050565b6000819050919050565b6128eb816128d8565b82525050565b600060208201905061290660008301846128e2565b92915050565b60006020828403121561292257612921612715565b5b600061293084828501612763565b91505092915050565b6129428161273a565b82525050565b600060208201905061295d6000830184612939565b92915050565b600063ffffffff82169050919050565b61297c81612963565b82525050565b60006020820190506129976000830184612973565b92915050565b6000602082840312156129b3576129b2612715565b5b60006129c184828501612799565b91505092915050565b6129d3816128a1565b81146129de57600080fd5b50565b6000813590506129f0816129ca565b92915050565b6129ff816128d8565b8114612a0a57600080fd5b50565b600081359050612a1c816129f6565b92915050565b60008060008060008060c08789031215612a3f57612a3e612715565b5b6000612a4d89828a01612763565b9650506020612a5e89828a01612799565b9550506040612a6f89828a01612799565b9450506060612a8089828a016129e1565b9350506080612a9189828a01612a0d565b92505060a0612aa289828a01612a0d565b9150509295509295509295565b600080600080600080600060e0888a031215612ace57612acd612715565b5b6000612adc8a828b01612763565b9750506020612aed8a828b01612763565b9650506040612afe8a828b01612799565b9550506060612b0f8a828b01612799565b9450506080612b208a828b016129e1565b93505060a0612b318a828b01612a0d565b92505060c0612b428a828b01612a0d565b91505092959891949750929550565b60008060408385031215612b6857612b67612715565b5b6000612b7685828601612763565b9250506020612b8785828601612763565b9150509250929050565b612b9a81612963565b8114612ba557600080fd5b50565b600081359050612bb781612b91565b92915050565b60008060408385031215612bd457612bd3612715565b5b6000612be285828601612763565b9250506020612bf385828601612ba8565b9150509250929050565b612c0681612963565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612c3d81612c0c565b82525050565b604082016000820151612c596000850182612bfd565b506020820151612c6c6020850182612c34565b50505050565b6000604082019050612c876000830184612c43565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd457607f821691505b602082108103612ce757612ce6612c8d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d2782612778565b9150612d3283612778565b9250828201905080821115612d4a57612d49612ced565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612d86601f8361266e565b9150612d9182612d50565b602082019050919050565b60006020820190508181036000830152612db581612d79565b9050919050565b6000612dc782612778565b9150612dd283612778565b9250828203905081811115612dea57612de9612ced565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612e7b60258361266e565b9150612e8682612e1f565b604082019050919050565b60006020820190508181036000830152612eaa81612e6e565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612ee7601d8361266e565b9150612ef282612eb1565b602082019050919050565b60006020820190508181036000830152612f1681612eda565b9050919050565b6000608082019050612f3260008301876128e2565b612f3f6020830186612939565b612f4c6040830185612824565b612f596060830184612824565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612f9860198361266e565b9150612fa382612f62565b602082019050919050565b60006020820190508181036000830152612fc781612f8b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613004601d8361266e565b915061300f82612fce565b602082019050919050565b6000602082019050818103600083015261303381612ff7565b9050919050565b600060c08201905061304f60008301896128e2565b61305c6020830188612939565b6130696040830187612939565b6130766060830186612824565b6130836080830185612824565b61309060a0830184612824565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006130d1601e8361266e565b91506130dc8261309b565b602082019050919050565b60006020820190508181036000830152613100816130c4565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b600061316360308361266e565b915061316e82613107565b604082019050919050565b6000602082019050818103600083015261319281613156565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006131cf601f8361266e565b91506131da82613199565b602082019050919050565b600060208201905081810360008301526131fe816131c2565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061326160278361266e565b915061326c82613205565b604082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006132f360268361266e565b91506132fe82613297565b604082019050919050565b60006020820190508181036000830152613322816132e6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061338560248361266e565b915061339082613329565b604082019050919050565b600060208201905081810360008301526133b481613378565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061341760228361266e565b9150613422826133bb565b604082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613483601d8361266e565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061351560258361266e565b9150613520826134b9565b604082019050919050565b6000602082019050818103600083015261354481613508565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006135a760238361266e565b91506135b28261354b565b604082019050919050565b600060208201905081810360008301526135d68161359a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061363960268361266e565b9150613644826135dd565b604082019050919050565b600060208201905081810360008301526136688161362c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136a560208361266e565b91506136b08261366f565b602082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b60006040820190506136f06000830185612824565b6136fd6020830184612824565b9392505050565b600060a08201905061371960008301886128e2565b61372660208301876128e2565b61373360408301866128e2565b6137406060830185612824565b61374d6080830184612939565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061379182612778565b915061379c83612778565b9250826137ac576137ab613757565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006137f86002836137b7565b9150613803826137c2565b600282019050919050565b6000819050919050565b613829613824826128d8565b61380e565b82525050565b600061383a826137eb565b91506138468285613818565b6020820191506138568284613818565b6020820191508190509392505050565b600060808201905061387b60008301876128e2565b61388860208301866128ae565b61389560408301856128e2565b6138a260608301846128e2565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061391060188361266e565b915061391b826138da565b602082019050919050565b6000602082019050818103600083015261393f81613903565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061397c601f8361266e565b915061398782613946565b602082019050919050565b600060208201905081810360008301526139ab8161396f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a0e60228361266e565b9150613a19826139b2565b604082019050919050565b60006020820190508181036000830152613a3d81613a01565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613aa060228361266e565b9150613aab82613a44565b604082019050919050565b60006020820190508181036000830152613acf81613a93565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b3260218361266e565b9150613b3d82613ad6565b604082019050919050565b60006020820190508181036000830152613b6181613b25565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bc460228361266e565b9150613bcf82613b68565b604082019050919050565b60006020820190508181036000830152613bf381613bb7565b905091905056fea26469706673582212208cef1b9fdc7e68a76433516319a5957edfb8b21989789d9b16fd80e4cfe8088d64736f6c63430008110033", + "solcInputHash": "865f8451b79a875f15c7120a0497c47b", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"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\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_initialSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"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.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"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/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes, Ownable {\\n uint256 public s_initialSupply = 1000000e18;\\n\\n event TokenTransfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n _mint(msg.sender, s_initialSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n emit TokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount)\\n internal\\n override(ERC20Votes)\\n onlyOwner\\n {\\n super._mint(to, amount);\\n }\\n\\n function mintToken(address to, uint256 amount) external {\\n _mint(to, amount);\\n }\\n\\n function burnToken(address account, uint256 amount) external {\\n _burn(account, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xa092abf2f4621743762f91889e716f2f475be65a32165fca151a4741f2c58ca3\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x61014060405269d3c21bcecceda1000000600b553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000fea565b5080600490816200011d919062000fea565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001898184846200020d60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505050620001f3620001e76200024960201b60201c565b6200025160201b60201c565b6200020733600b546200031760201b60201c565b6200157a565b600083838346306040516020016200022a95949392919062001142565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003276200034260201b60201c565b6200033e8282620003d360201b6200107a1760201c565b5050565b620003526200024960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003786200049160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c89062001200565b60405180910390fd5b565b620003ea8282620004bb60201b620011071760201c565b620003fa6200063360201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620004286200065760201b60201c565b11156200046c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004639062001298565b60405180910390fd5b6200048b60096200066160201b6200126617836200067960201b60201c565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000524906200130a565b60405180910390fd5b62000541600083836200092a60201b60201c565b80600260008282546200055591906200135b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005ac91906200135b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000613919062001396565b60405180910390a36200062f600083836200092f60201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b600081836200067191906200135b565b905092915050565b60008060008580549050905060008114620006ee57856001826200069e9190620013b3565b81548110620006b257620006b1620013ee565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620006f1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200071d83858760201c565b915060008111801562000776575043866001836200073c9190620013b3565b8154811062000750576200074f620013ee565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1562000817576200079282620009b360201b6200127c1760201c565b86600183620007a29190620013b3565b81548110620007b657620007b5620013ee565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000921565b856040518060400160405280620008394362000a2160201b620012e71760201c565b63ffffffff1681526020016200085a85620009b360201b6200127c1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b6200094783838362000a7760201b6200133a1760201c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051620009a6919062001396565b60405180910390a3505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a109062001493565b60405180910390fd5b819050919050565b600063ffffffff801682111562000a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a66906200152b565b60405180910390fd5b819050919050565b62000a8f83838362000ac760201b620013651760201c565b62000ac262000aa48462000acc60201b60201c565b62000ab58462000acc60201b60201c565b8362000b3560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000b725750600081115b1562000d5357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000c655760008062000c0c600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000d5860201b6200136a17856200067960201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c5a9291906200154d565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000d525760008062000cf9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200066160201b6200126617856200067960201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000d479291906200154d565b60405180910390a250505b5b505050565b6000818362000d689190620013b3565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000df257607f821691505b60208210810362000e085762000e0762000daa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000e727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000e33565b62000e7e868362000e33565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ecb62000ec562000ebf8462000e96565b62000ea0565b62000e96565b9050919050565b6000819050919050565b62000ee78362000eaa565b62000eff62000ef68262000ed2565b84845462000e40565b825550505050565b600090565b62000f1662000f07565b62000f2381848462000edc565b505050565b5b8181101562000f4b5762000f3f60008262000f0c565b60018101905062000f29565b5050565b601f82111562000f9a5762000f648162000e0e565b62000f6f8462000e23565b8101602085101562000f7f578190505b62000f9762000f8e8562000e23565b83018262000f28565b50505b505050565b600082821c905092915050565b600062000fbf6000198460080262000f9f565b1980831691505092915050565b600062000fda838362000fac565b9150826002028217905092915050565b62000ff58262000d70565b67ffffffffffffffff81111562001011576200101062000d7b565b5b6200101d825462000dd9565b6200102a82828562000f4f565b600060209050601f8311600181146200106257600084156200104d578287015190505b62001059858262000fcc565b865550620010c9565b601f198416620010728662000e0e565b60005b828110156200109c5784890151825560018201915060208501945060208101905062001075565b86831015620010bc5784890151620010b8601f89168262000fac565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b620010e681620010d1565b82525050565b620010f78162000e96565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200112a82620010fd565b9050919050565b6200113c816200111d565b82525050565b600060a082019050620011596000830188620010db565b620011686020830187620010db565b620011776040830186620010db565b620011866060830185620010ec565b62001195608083018462001131565b9695505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620011e86020836200119f565b9150620011f582620011b0565b602082019050919050565b600060208201905081810360008301526200121b81620011d9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000620012806030836200119f565b91506200128d8262001222565b604082019050919050565b60006020820190508181036000830152620012b38162001271565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620012f2601f836200119f565b9150620012ff82620012ba565b602082019050919050565b600060208201905081810360008301526200132581620012e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013688262000e96565b9150620013758362000e96565b925082820190508082111562001390576200138f6200132c565b5b92915050565b6000602082019050620013ad6000830184620010ec565b92915050565b6000620013c08262000e96565b9150620013cd8362000e96565b9250828203905081811115620013e857620013e76200132c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200147b6027836200119f565b915062001488826200141d565b604082019050919050565b60006020820190508181036000830152620014ae816200146c565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620015136026836200119f565b91506200152082620014b5565b604082019050919050565b60006020820190508181036000830152620015468162001504565b9050919050565b6000604082019050620015646000830185620010ec565b620015736020830184620010ec565b9392505050565b60805160a05160c05160e0516101005161012051613ed6620015ca600039600061190a0152600061194c0152600061192b01526000611860015260006118b6015260006118df0152613ed66000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610555578063dd62ed3e14610571578063f1127ed8146105a1578063f2fde38b146105d1576101c4565b8063a9059cbb146104ed578063c3cda5201461051d578063d1df306c14610539576101c4565b80638e539e8c116100d35780638e539e8c1461043f57806395d89b411461046f5780639ab24eb01461048d578063a457c2d7146104bd576101c4565b806379c65068146103d55780637ecebe00146103f15780638da5cb5b14610421576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461034f5780636fcfff451461036b57806370a082311461039b578063715018a6146103cb576101c4565b806339509351146102bf5780633a46b1a8146102ef578063587cde1e1461031f576101c4565b806318160ddd116101a257806318160ddd1461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf14610217575b600080fd5b6101d16105ed565b6040516101de9190612907565b60405180910390f35b61020160048036038101906101fc91906129c2565b61067f565b60405161020e9190612a1d565b60405180910390f35b61021f6106a2565b60405161022c9190612a47565b60405180910390f35b61023d6106a8565b60405161024a9190612a47565b60405180910390f35b61026d60048036038101906102689190612a62565b6106b2565b60405161027a9190612a1d565b60405180910390f35b61028b6106e1565b6040516102989190612ad1565b60405180910390f35b6102a96106ea565b6040516102b69190612b05565b60405180910390f35b6102d960048036038101906102d491906129c2565b6106f9565b6040516102e69190612a1d565b60405180910390f35b610309600480360381019061030491906129c2565b610730565b6040516103169190612a47565b60405180910390f35b61033960048036038101906103349190612b20565b6107c4565b6040516103469190612b5c565b60405180910390f35b61036960048036038101906103649190612b20565b61082d565b005b61038560048036038101906103809190612b20565b610841565b6040516103929190612b96565b60405180910390f35b6103b560048036038101906103b09190612b20565b610895565b6040516103c29190612a47565b60405180910390f35b6103d36108dd565b005b6103ef60048036038101906103ea91906129c2565b6108f1565b005b61040b60048036038101906104069190612b20565b6108ff565b6040516104189190612a47565b60405180910390f35b61042961094f565b6040516104369190612b5c565b60405180910390f35b61045960048036038101906104549190612bb1565b610979565b6040516104669190612a47565b60405180910390f35b6104776109cf565b6040516104849190612907565b60405180910390f35b6104a760048036038101906104a29190612b20565b610a61565b6040516104b49190612a47565b60405180910390f35b6104d760048036038101906104d291906129c2565b610b72565b6040516104e49190612a1d565b60405180910390f35b610507600480360381019061050291906129c2565b610be9565b6040516105149190612a1d565b60405180910390f35b61053760048036038101906105329190612c36565b610c0c565b005b610553600480360381019061054e91906129c2565b610d10565b005b61056f600480360381019061056a9190612cc3565b610d1e565b005b61058b60048036038101906105869190612d65565b610e60565b6040516105989190612a47565b60405180910390f35b6105bb60048036038101906105b69190612dd1565b610ee7565b6040516105c89190612e86565b60405180910390f35b6105eb60048036038101906105e69190612b20565b610ff7565b005b6060600380546105fc90612ed0565b80601f016020809104026020016040519081016040528092919081815260200182805461062890612ed0565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60008061068a611380565b9050610697818585611388565b600191505092915050565b600b5481565b6000600254905090565b6000806106bd611380565b90506106ca858285611551565b6106d58585856115dd565b60019150509392505050565b60006012905090565b60006106f461185c565b905090565b600080610704611380565b90506107258185856107168589610e60565b6107209190612f30565b611388565b600191505092915050565b6000438210610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90612fb0565b60405180910390fd5b6107bc600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611976565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61083e610838611380565b82611a82565b50565b600061088e600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506112e7565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108e5611b9c565b6108ef6000611c1a565b565b6108fb8282611ce0565b5050565b6000610948600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cf6565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612fb0565b60405180910390fd5b6109c8600983611976565b9050919050565b6060600480546109de90612ed0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90612ed0565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b4957600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610afd9190612fd0565b81548110610b0e57610b0d613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b4c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610b7d611380565b90506000610b8b8286610e60565b905083811015610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906130a5565b60405180910390fd5b610bdd8286868403611388565b60019250505092915050565b600080610bf4611380565b9050610c018185856115dd565b600191505092915050565b83421115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613111565b60405180910390fd5b6000610cb1610ca97fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610c8e9493929190613131565b60405160208183030381529060405280519060200120611d04565b858585611d1e565b9050610cbc81611d49565b8614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906131c2565b60405180910390fd5b610d078188611a82565b50505050505050565b610d1a8282611da7565b5050565b83421115610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061322e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d908c611d49565b89604051602001610da69695949392919061324e565b6040516020818303038152906040528051906020012090506000610dc982611d04565b90506000610dd982878787611d1e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906132fb565b60405180910390fd5b610e548a8a8a611388565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610eef612839565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f4657610f45613004565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610fff611b9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110659061338d565b60405180910390fd5b61107781611c1a565b50565b6110848282611107565b61108c611db5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110b26106a8565b11156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061341f565b60405180910390fd5b611101600961126683611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061348b565b60405180910390fd5b61118260008383612051565b80600260008282546111949190612f30565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e99190612f30565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124e9190612a47565b60405180910390a361126260008383612056565b5050565b600081836112749190612f30565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061351d565b60405180910390fd5b819050919050565b600063ffffffff8016821115611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906135af565b60405180910390fd5b819050919050565b611345838383611365565b611360611351846107c4565b61135a846107c4565b836120cb565b505050565b505050565b600081836113789190612fd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90613641565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906136d3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115449190612a47565b60405180910390a3505050565b600061155d8484610e60565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115d757818110156115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061373f565b60405180910390fd5b6115d68484848403611388565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906137d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613863565b60405180910390fd5b6116c6838383612051565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906138f5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117df9190612f30565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118439190612a47565b60405180910390a3611856848484612056565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156118d857507f000000000000000000000000000000000000000000000000000000000000000046145b15611905577f00000000000000000000000000000000000000000000000000000000000000009050611973565b6119707f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122c4565b90505b90565b6000808380549050905060005b818110156119f557600061199782846122fe565b9050848682815481106119ad576119ac613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156119df578092506119ef565b6001816119ec9190612f30565b91505b50611983565b60008214611a575784600183611a0b9190612fd0565b81548110611a1c57611a1b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611a5a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000611a8d836107c4565b90506000611a9a84610895565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b968284836120cb565b50505050565b611ba4611380565b73ffffffffffffffffffffffffffffffffffffffff16611bc261094f565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613961565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ce8611b9c565b611cf2828261107a565b5050565b600081600001549050919050565b6000611d17611d1161185c565b83612324565b9050919050565b6000806000611d2f87878787612357565b91509150611d3c81612463565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9681611cf6565b9150611da18161262f565b50919050565b611db18282612645565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611e475785600182611dfb9190612fd0565b81548110611e0c57611e0b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611e4a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611e7883858763ffffffff16565b9150600081118015611ecb57504386600183611e949190612fd0565b81548110611ea557611ea4613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f5857611ed98261127c565b86600183611ee79190612fd0565b81548110611ef857611ef7613004565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612048565b856040518060400160405280611f6d436112e7565b63ffffffff168152602001611f818561127c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b61206183838361133a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516120be9190612a47565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121075750600081115b156122bf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121e55760008061218e600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136a85611dd9565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121da929190613981565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122be57600080612267600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061126685611dd9565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122b3929190613981565b60405180910390a250505b5b505050565b600083838346306040516020016122df9594939291906139aa565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861230f9190613a2c565b82841661231c9190612f30565b905092915050565b60008282604051602001612339929190613ad5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561239257600060039150915061245a565b601b8560ff16141580156123aa5750601c8560ff1614155b156123bc57600060049150915061245a565b6000600187878787604051600081526020016040526040516123e19493929190613b0c565b6020604051602081039080840390855afa158015612403573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124515760006001925092505061245a565b80600092509250505b94509492505050565b6000600481111561247757612476613b51565b5b81600481111561248a57612489613b51565b5b031561262c57600160048111156124a4576124a3613b51565b5b8160048111156124b7576124b6613b51565b5b036124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90613bcc565b60405180910390fd5b6002600481111561250b5761250a613b51565b5b81600481111561251e5761251d613b51565b5b0361255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613c38565b60405180910390fd5b6003600481111561257257612571613b51565b5b81600481111561258557612584613b51565b5b036125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc90613cca565b60405180910390fd5b6004808111156125d8576125d7613b51565b5b8160048111156125eb576125ea613b51565b5b0361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290613d5c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61264f8282612663565b61265d600961136a83611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990613dee565b60405180910390fd5b6126de82600083612051565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613e80565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127bb9190612fd0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128209190612a47565b60405180910390a361283483600084612056565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b1578082015181840152602081019050612896565b60008484015250505050565b6000601f19601f8301169050919050565b60006128d982612877565b6128e38185612882565b93506128f3818560208601612893565b6128fc816128bd565b840191505092915050565b6000602082019050818103600083015261292181846128ce565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129598261292e565b9050919050565b6129698161294e565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b6000819050919050565b61299f8161298c565b81146129aa57600080fd5b50565b6000813590506129bc81612996565b92915050565b600080604083850312156129d9576129d8612929565b5b60006129e785828601612977565b92505060206129f8858286016129ad565b9150509250929050565b60008115159050919050565b612a1781612a02565b82525050565b6000602082019050612a326000830184612a0e565b92915050565b612a418161298c565b82525050565b6000602082019050612a5c6000830184612a38565b92915050565b600080600060608486031215612a7b57612a7a612929565b5b6000612a8986828701612977565b9350506020612a9a86828701612977565b9250506040612aab868287016129ad565b9150509250925092565b600060ff82169050919050565b612acb81612ab5565b82525050565b6000602082019050612ae66000830184612ac2565b92915050565b6000819050919050565b612aff81612aec565b82525050565b6000602082019050612b1a6000830184612af6565b92915050565b600060208284031215612b3657612b35612929565b5b6000612b4484828501612977565b91505092915050565b612b568161294e565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600063ffffffff82169050919050565b612b9081612b77565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b600060208284031215612bc757612bc6612929565b5b6000612bd5848285016129ad565b91505092915050565b612be781612ab5565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b612c1381612aec565b8114612c1e57600080fd5b50565b600081359050612c3081612c0a565b92915050565b60008060008060008060c08789031215612c5357612c52612929565b5b6000612c6189828a01612977565b9650506020612c7289828a016129ad565b9550506040612c8389828a016129ad565b9450506060612c9489828a01612bf5565b9350506080612ca589828a01612c21565b92505060a0612cb689828a01612c21565b9150509295509295509295565b600080600080600080600060e0888a031215612ce257612ce1612929565b5b6000612cf08a828b01612977565b9750506020612d018a828b01612977565b9650506040612d128a828b016129ad565b9550506060612d238a828b016129ad565b9450506080612d348a828b01612bf5565b93505060a0612d458a828b01612c21565b92505060c0612d568a828b01612c21565b91505092959891949750929550565b60008060408385031215612d7c57612d7b612929565b5b6000612d8a85828601612977565b9250506020612d9b85828601612977565b9150509250929050565b612dae81612b77565b8114612db957600080fd5b50565b600081359050612dcb81612da5565b92915050565b60008060408385031215612de857612de7612929565b5b6000612df685828601612977565b9250506020612e0785828601612dbc565b9150509250929050565b612e1a81612b77565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612e5181612e20565b82525050565b604082016000820151612e6d6000850182612e11565b506020820151612e806020850182612e48565b50505050565b6000604082019050612e9b6000830184612e57565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ee857607f821691505b602082108103612efb57612efa612ea1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f3b8261298c565b9150612f468361298c565b9250828201905080821115612f5e57612f5d612f01565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612f9a601f83612882565b9150612fa582612f64565b602082019050919050565b60006020820190508181036000830152612fc981612f8d565b9050919050565b6000612fdb8261298c565b9150612fe68361298c565b9250828203905081811115612ffe57612ffd612f01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061308f602583612882565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006130fb601d83612882565b9150613106826130c5565b602082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b60006080820190506131466000830187612af6565b6131536020830186612b4d565b6131606040830185612a38565b61316d6060830184612a38565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006131ac601983612882565b91506131b782613176565b602082019050919050565b600060208201905081810360008301526131db8161319f565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613218601d83612882565b9150613223826131e2565b602082019050919050565b600060208201905081810360008301526132478161320b565b9050919050565b600060c0820190506132636000830189612af6565b6132706020830188612b4d565b61327d6040830187612b4d565b61328a6060830186612a38565b6132976080830185612a38565b6132a460a0830184612a38565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006132e5601e83612882565b91506132f0826132af565b602082019050919050565b60006020820190508181036000830152613314816132d8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613377602683612882565b91506133828261331b565b604082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613409603083612882565b9150613414826133ad565b604082019050919050565b60006020820190508181036000830152613438816133fc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613475601f83612882565b91506134808261343f565b602082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000613507602783612882565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613599602683612882565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362b602483612882565b9150613636826135cf565b604082019050919050565b6000602082019050818103600083015261365a8161361e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136bd602283612882565b91506136c882613661565b604082019050919050565b600060208201905081810360008301526136ec816136b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613729601d83612882565b9150613734826136f3565b602082019050919050565b600060208201905081810360008301526137588161371c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bb602583612882565b91506137c68261375f565b604082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061384d602383612882565b9150613858826137f1565b604082019050919050565b6000602082019050818103600083015261387c81613840565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138df602683612882565b91506138ea82613883565b604082019050919050565b6000602082019050818103600083015261390e816138d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061394b602083612882565b915061395682613915565b602082019050919050565b6000602082019050818103600083015261397a8161393e565b9050919050565b60006040820190506139966000830185612a38565b6139a36020830184612a38565b9392505050565b600060a0820190506139bf6000830188612af6565b6139cc6020830187612af6565b6139d96040830186612af6565b6139e66060830185612a38565b6139f36080830184612b4d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a378261298c565b9150613a428361298c565b925082613a5257613a516139fd565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a9e600283613a5d565b9150613aa982613a68565b600282019050919050565b6000819050919050565b613acf613aca82612aec565b613ab4565b82525050565b6000613ae082613a91565b9150613aec8285613abe565b602082019150613afc8284613abe565b6020820191508190509392505050565b6000608082019050613b216000830187612af6565b613b2e6020830186612ac2565b613b3b6040830185612af6565b613b486060830184612af6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bb6601883612882565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c22601f83612882565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cb4602283612882565b9150613cbf82613c58565b604082019050919050565b60006020820190508181036000830152613ce381613ca7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d46602283612882565b9150613d5182613cea565b604082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd8602183612882565b9150613de382613d7c565b604082019050919050565b60006020820190508181036000830152613e0781613dcb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6a602283612882565b9150613e7582613e0e565b604082019050919050565b60006020820190508181036000830152613e9981613e5d565b905091905056fea264697066735822122017be51580e499600e196331255d1b51b80dc95152f4ab3928e0760c4b3acb21e64736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610555578063dd62ed3e14610571578063f1127ed8146105a1578063f2fde38b146105d1576101c4565b8063a9059cbb146104ed578063c3cda5201461051d578063d1df306c14610539576101c4565b80638e539e8c116100d35780638e539e8c1461043f57806395d89b411461046f5780639ab24eb01461048d578063a457c2d7146104bd576101c4565b806379c65068146103d55780637ecebe00146103f15780638da5cb5b14610421576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461034f5780636fcfff451461036b57806370a082311461039b578063715018a6146103cb576101c4565b806339509351146102bf5780633a46b1a8146102ef578063587cde1e1461031f576101c4565b806318160ddd116101a257806318160ddd1461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf14610217575b600080fd5b6101d16105ed565b6040516101de9190612907565b60405180910390f35b61020160048036038101906101fc91906129c2565b61067f565b60405161020e9190612a1d565b60405180910390f35b61021f6106a2565b60405161022c9190612a47565b60405180910390f35b61023d6106a8565b60405161024a9190612a47565b60405180910390f35b61026d60048036038101906102689190612a62565b6106b2565b60405161027a9190612a1d565b60405180910390f35b61028b6106e1565b6040516102989190612ad1565b60405180910390f35b6102a96106ea565b6040516102b69190612b05565b60405180910390f35b6102d960048036038101906102d491906129c2565b6106f9565b6040516102e69190612a1d565b60405180910390f35b610309600480360381019061030491906129c2565b610730565b6040516103169190612a47565b60405180910390f35b61033960048036038101906103349190612b20565b6107c4565b6040516103469190612b5c565b60405180910390f35b61036960048036038101906103649190612b20565b61082d565b005b61038560048036038101906103809190612b20565b610841565b6040516103929190612b96565b60405180910390f35b6103b560048036038101906103b09190612b20565b610895565b6040516103c29190612a47565b60405180910390f35b6103d36108dd565b005b6103ef60048036038101906103ea91906129c2565b6108f1565b005b61040b60048036038101906104069190612b20565b6108ff565b6040516104189190612a47565b60405180910390f35b61042961094f565b6040516104369190612b5c565b60405180910390f35b61045960048036038101906104549190612bb1565b610979565b6040516104669190612a47565b60405180910390f35b6104776109cf565b6040516104849190612907565b60405180910390f35b6104a760048036038101906104a29190612b20565b610a61565b6040516104b49190612a47565b60405180910390f35b6104d760048036038101906104d291906129c2565b610b72565b6040516104e49190612a1d565b60405180910390f35b610507600480360381019061050291906129c2565b610be9565b6040516105149190612a1d565b60405180910390f35b61053760048036038101906105329190612c36565b610c0c565b005b610553600480360381019061054e91906129c2565b610d10565b005b61056f600480360381019061056a9190612cc3565b610d1e565b005b61058b60048036038101906105869190612d65565b610e60565b6040516105989190612a47565b60405180910390f35b6105bb60048036038101906105b69190612dd1565b610ee7565b6040516105c89190612e86565b60405180910390f35b6105eb60048036038101906105e69190612b20565b610ff7565b005b6060600380546105fc90612ed0565b80601f016020809104026020016040519081016040528092919081815260200182805461062890612ed0565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60008061068a611380565b9050610697818585611388565b600191505092915050565b600b5481565b6000600254905090565b6000806106bd611380565b90506106ca858285611551565b6106d58585856115dd565b60019150509392505050565b60006012905090565b60006106f461185c565b905090565b600080610704611380565b90506107258185856107168589610e60565b6107209190612f30565b611388565b600191505092915050565b6000438210610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90612fb0565b60405180910390fd5b6107bc600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611976565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61083e610838611380565b82611a82565b50565b600061088e600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506112e7565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108e5611b9c565b6108ef6000611c1a565b565b6108fb8282611ce0565b5050565b6000610948600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cf6565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612fb0565b60405180910390fd5b6109c8600983611976565b9050919050565b6060600480546109de90612ed0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90612ed0565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b4957600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610afd9190612fd0565b81548110610b0e57610b0d613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b4c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610b7d611380565b90506000610b8b8286610e60565b905083811015610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906130a5565b60405180910390fd5b610bdd8286868403611388565b60019250505092915050565b600080610bf4611380565b9050610c018185856115dd565b600191505092915050565b83421115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613111565b60405180910390fd5b6000610cb1610ca97fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610c8e9493929190613131565b60405160208183030381529060405280519060200120611d04565b858585611d1e565b9050610cbc81611d49565b8614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906131c2565b60405180910390fd5b610d078188611a82565b50505050505050565b610d1a8282611da7565b5050565b83421115610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061322e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d908c611d49565b89604051602001610da69695949392919061324e565b6040516020818303038152906040528051906020012090506000610dc982611d04565b90506000610dd982878787611d1e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906132fb565b60405180910390fd5b610e548a8a8a611388565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610eef612839565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f4657610f45613004565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610fff611b9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110659061338d565b60405180910390fd5b61107781611c1a565b50565b6110848282611107565b61108c611db5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110b26106a8565b11156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061341f565b60405180910390fd5b611101600961126683611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061348b565b60405180910390fd5b61118260008383612051565b80600260008282546111949190612f30565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e99190612f30565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124e9190612a47565b60405180910390a361126260008383612056565b5050565b600081836112749190612f30565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061351d565b60405180910390fd5b819050919050565b600063ffffffff8016821115611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906135af565b60405180910390fd5b819050919050565b611345838383611365565b611360611351846107c4565b61135a846107c4565b836120cb565b505050565b505050565b600081836113789190612fd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90613641565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906136d3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115449190612a47565b60405180910390a3505050565b600061155d8484610e60565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115d757818110156115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061373f565b60405180910390fd5b6115d68484848403611388565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906137d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613863565b60405180910390fd5b6116c6838383612051565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906138f5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117df9190612f30565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118439190612a47565b60405180910390a3611856848484612056565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156118d857507f000000000000000000000000000000000000000000000000000000000000000046145b15611905577f00000000000000000000000000000000000000000000000000000000000000009050611973565b6119707f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122c4565b90505b90565b6000808380549050905060005b818110156119f557600061199782846122fe565b9050848682815481106119ad576119ac613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156119df578092506119ef565b6001816119ec9190612f30565b91505b50611983565b60008214611a575784600183611a0b9190612fd0565b81548110611a1c57611a1b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611a5a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000611a8d836107c4565b90506000611a9a84610895565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b968284836120cb565b50505050565b611ba4611380565b73ffffffffffffffffffffffffffffffffffffffff16611bc261094f565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613961565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ce8611b9c565b611cf2828261107a565b5050565b600081600001549050919050565b6000611d17611d1161185c565b83612324565b9050919050565b6000806000611d2f87878787612357565b91509150611d3c81612463565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9681611cf6565b9150611da18161262f565b50919050565b611db18282612645565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611e475785600182611dfb9190612fd0565b81548110611e0c57611e0b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611e4a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611e7883858763ffffffff16565b9150600081118015611ecb57504386600183611e949190612fd0565b81548110611ea557611ea4613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f5857611ed98261127c565b86600183611ee79190612fd0565b81548110611ef857611ef7613004565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612048565b856040518060400160405280611f6d436112e7565b63ffffffff168152602001611f818561127c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b61206183838361133a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516120be9190612a47565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121075750600081115b156122bf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121e55760008061218e600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136a85611dd9565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121da929190613981565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122be57600080612267600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061126685611dd9565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122b3929190613981565b60405180910390a250505b5b505050565b600083838346306040516020016122df9594939291906139aa565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861230f9190613a2c565b82841661231c9190612f30565b905092915050565b60008282604051602001612339929190613ad5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561239257600060039150915061245a565b601b8560ff16141580156123aa5750601c8560ff1614155b156123bc57600060049150915061245a565b6000600187878787604051600081526020016040526040516123e19493929190613b0c565b6020604051602081039080840390855afa158015612403573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124515760006001925092505061245a565b80600092509250505b94509492505050565b6000600481111561247757612476613b51565b5b81600481111561248a57612489613b51565b5b031561262c57600160048111156124a4576124a3613b51565b5b8160048111156124b7576124b6613b51565b5b036124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90613bcc565b60405180910390fd5b6002600481111561250b5761250a613b51565b5b81600481111561251e5761251d613b51565b5b0361255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613c38565b60405180910390fd5b6003600481111561257257612571613b51565b5b81600481111561258557612584613b51565b5b036125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc90613cca565b60405180910390fd5b6004808111156125d8576125d7613b51565b5b8160048111156125eb576125ea613b51565b5b0361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290613d5c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61264f8282612663565b61265d600961136a83611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990613dee565b60405180910390fd5b6126de82600083612051565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613e80565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127bb9190612fd0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128209190612a47565b60405180910390a361283483600084612056565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b1578082015181840152602081019050612896565b60008484015250505050565b6000601f19601f8301169050919050565b60006128d982612877565b6128e38185612882565b93506128f3818560208601612893565b6128fc816128bd565b840191505092915050565b6000602082019050818103600083015261292181846128ce565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129598261292e565b9050919050565b6129698161294e565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b6000819050919050565b61299f8161298c565b81146129aa57600080fd5b50565b6000813590506129bc81612996565b92915050565b600080604083850312156129d9576129d8612929565b5b60006129e785828601612977565b92505060206129f8858286016129ad565b9150509250929050565b60008115159050919050565b612a1781612a02565b82525050565b6000602082019050612a326000830184612a0e565b92915050565b612a418161298c565b82525050565b6000602082019050612a5c6000830184612a38565b92915050565b600080600060608486031215612a7b57612a7a612929565b5b6000612a8986828701612977565b9350506020612a9a86828701612977565b9250506040612aab868287016129ad565b9150509250925092565b600060ff82169050919050565b612acb81612ab5565b82525050565b6000602082019050612ae66000830184612ac2565b92915050565b6000819050919050565b612aff81612aec565b82525050565b6000602082019050612b1a6000830184612af6565b92915050565b600060208284031215612b3657612b35612929565b5b6000612b4484828501612977565b91505092915050565b612b568161294e565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600063ffffffff82169050919050565b612b9081612b77565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b600060208284031215612bc757612bc6612929565b5b6000612bd5848285016129ad565b91505092915050565b612be781612ab5565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b612c1381612aec565b8114612c1e57600080fd5b50565b600081359050612c3081612c0a565b92915050565b60008060008060008060c08789031215612c5357612c52612929565b5b6000612c6189828a01612977565b9650506020612c7289828a016129ad565b9550506040612c8389828a016129ad565b9450506060612c9489828a01612bf5565b9350506080612ca589828a01612c21565b92505060a0612cb689828a01612c21565b9150509295509295509295565b600080600080600080600060e0888a031215612ce257612ce1612929565b5b6000612cf08a828b01612977565b9750506020612d018a828b01612977565b9650506040612d128a828b016129ad565b9550506060612d238a828b016129ad565b9450506080612d348a828b01612bf5565b93505060a0612d458a828b01612c21565b92505060c0612d568a828b01612c21565b91505092959891949750929550565b60008060408385031215612d7c57612d7b612929565b5b6000612d8a85828601612977565b9250506020612d9b85828601612977565b9150509250929050565b612dae81612b77565b8114612db957600080fd5b50565b600081359050612dcb81612da5565b92915050565b60008060408385031215612de857612de7612929565b5b6000612df685828601612977565b9250506020612e0785828601612dbc565b9150509250929050565b612e1a81612b77565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612e5181612e20565b82525050565b604082016000820151612e6d6000850182612e11565b506020820151612e806020850182612e48565b50505050565b6000604082019050612e9b6000830184612e57565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ee857607f821691505b602082108103612efb57612efa612ea1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f3b8261298c565b9150612f468361298c565b9250828201905080821115612f5e57612f5d612f01565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612f9a601f83612882565b9150612fa582612f64565b602082019050919050565b60006020820190508181036000830152612fc981612f8d565b9050919050565b6000612fdb8261298c565b9150612fe68361298c565b9250828203905081811115612ffe57612ffd612f01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061308f602583612882565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006130fb601d83612882565b9150613106826130c5565b602082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b60006080820190506131466000830187612af6565b6131536020830186612b4d565b6131606040830185612a38565b61316d6060830184612a38565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006131ac601983612882565b91506131b782613176565b602082019050919050565b600060208201905081810360008301526131db8161319f565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613218601d83612882565b9150613223826131e2565b602082019050919050565b600060208201905081810360008301526132478161320b565b9050919050565b600060c0820190506132636000830189612af6565b6132706020830188612b4d565b61327d6040830187612b4d565b61328a6060830186612a38565b6132976080830185612a38565b6132a460a0830184612a38565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006132e5601e83612882565b91506132f0826132af565b602082019050919050565b60006020820190508181036000830152613314816132d8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613377602683612882565b91506133828261331b565b604082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613409603083612882565b9150613414826133ad565b604082019050919050565b60006020820190508181036000830152613438816133fc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613475601f83612882565b91506134808261343f565b602082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000613507602783612882565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613599602683612882565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362b602483612882565b9150613636826135cf565b604082019050919050565b6000602082019050818103600083015261365a8161361e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136bd602283612882565b91506136c882613661565b604082019050919050565b600060208201905081810360008301526136ec816136b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613729601d83612882565b9150613734826136f3565b602082019050919050565b600060208201905081810360008301526137588161371c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bb602583612882565b91506137c68261375f565b604082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061384d602383612882565b9150613858826137f1565b604082019050919050565b6000602082019050818103600083015261387c81613840565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138df602683612882565b91506138ea82613883565b604082019050919050565b6000602082019050818103600083015261390e816138d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061394b602083612882565b915061395682613915565b602082019050919050565b6000602082019050818103600083015261397a8161393e565b9050919050565b60006040820190506139966000830185612a38565b6139a36020830184612a38565b9392505050565b600060a0820190506139bf6000830188612af6565b6139cc6020830187612af6565b6139d96040830186612af6565b6139e66060830185612a38565b6139f36080830184612b4d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a378261298c565b9150613a428361298c565b925082613a5257613a516139fd565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a9e600283613a5d565b9150613aa982613a68565b600282019050919050565b6000819050919050565b613acf613aca82612aec565b613ab4565b82525050565b6000613ae082613a91565b9150613aec8285613abe565b602082019150613afc8284613abe565b6020820191508190509392505050565b6000608082019050613b216000830187612af6565b613b2e6020830186612ac2565b613b3b6040830185612af6565b613b486060830184612af6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bb6601883612882565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c22601f83612882565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cb4602283612882565b9150613cbf82613c58565b604082019050919050565b60006020820190508181036000830152613ce381613ca7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d46602283612882565b9150613d5182613cea565b604082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd8602183612882565b9150613de382613d7c565b604082019050919050565b60006020820190508181036000830152613e0781613dcb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6a602283612882565b9150613e7582613e0e565b604082019050919050565b60006020820190508181036000830152613e9981613e5d565b905091905056fea264697066735822122017be51580e499600e196331255d1b51b80dc95152f4ab3928e0760c4b3acb21e64736f6c63430008110033", "devdoc": { "kind": "dev", "methods": { @@ -768,9 +834,15 @@ "numCheckpoints(address)": { "details": "Get number of checkpoints for `account`." }, + "owner()": { + "details": "Returns the address of the current owner." + }, "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": { "details": "See {IERC20Permit-permit}." }, + "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." + }, "symbol()": { "details": "Returns the symbol of the token, usually a shorter version of the name." }, @@ -782,6 +854,9 @@ }, "transferFrom(address,address,uint256)": { "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." } }, "version": 1 @@ -794,7 +869,7 @@ "storageLayout": { "storage": [ { - "astId": 4206, + "astId": 4264, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_balances", "offset": 0, @@ -802,7 +877,7 @@ "type": "t_mapping(t_address,t_uint256)" }, { - "astId": 4212, + "astId": 4270, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_allowances", "offset": 0, @@ -810,7 +885,7 @@ "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" }, { - "astId": 4214, + "astId": 4272, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_totalSupply", "offset": 0, @@ -818,7 +893,7 @@ "type": "t_uint256" }, { - "astId": 4216, + "astId": 4274, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_name", "offset": 0, @@ -826,7 +901,7 @@ "type": "t_string_storage" }, { - "astId": 4218, + "astId": 4276, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_symbol", "offset": 0, @@ -834,15 +909,15 @@ "type": "t_string_storage" }, { - "astId": 5539, + "astId": 5597, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_nonces", "offset": 0, "slot": "5", - "type": "t_mapping(t_address,t_struct(Counter)6299_storage)" + "type": "t_mapping(t_address,t_struct(Counter)6357_storage)" }, { - "astId": 5547, + "astId": 5605, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT", "offset": 0, @@ -850,7 +925,7 @@ "type": "t_bytes32" }, { - "astId": 4880, + "astId": 4938, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_delegates", "offset": 0, @@ -858,27 +933,35 @@ "type": "t_mapping(t_address,t_address)" }, { - "astId": 4886, + "astId": 4944, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_checkpoints", "offset": 0, "slot": "8", - "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)4871_storage)dyn_storage)" + "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)4929_storage)dyn_storage)" }, { - "astId": 4890, + "astId": 4948, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_totalSupplyCheckpoints", "offset": 0, "slot": "9", - "type": "t_array(t_struct(Checkpoint)4871_storage)dyn_storage" + "type": "t_array(t_struct(Checkpoint)4929_storage)dyn_storage" }, { - "astId": 10125, + "astId": 458, "contract": "contracts/GovernanceToken.sol:GovernanceToken", - "label": "s_initialSupply", + "label": "_owner", "offset": 0, "slot": "10", + "type": "t_address" + }, + { + "astId": 10706, + "contract": "contracts/GovernanceToken.sol:GovernanceToken", + "label": "s_initialSupply", + "offset": 0, + "slot": "11", "type": "t_uint256" } ], @@ -888,8 +971,8 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)4871_storage)dyn_storage": { - "base": "t_struct(Checkpoint)4871_storage", + "t_array(t_struct(Checkpoint)4929_storage)dyn_storage": { + "base": "t_struct(Checkpoint)4929_storage", "encoding": "dynamic_array", "label": "struct ERC20Votes.Checkpoint[]", "numberOfBytes": "32" @@ -906,12 +989,12 @@ "numberOfBytes": "32", "value": "t_address" }, - "t_mapping(t_address,t_array(t_struct(Checkpoint)4871_storage)dyn_storage)": { + "t_mapping(t_address,t_array(t_struct(Checkpoint)4929_storage)dyn_storage)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => struct ERC20Votes.Checkpoint[])", "numberOfBytes": "32", - "value": "t_array(t_struct(Checkpoint)4871_storage)dyn_storage" + "value": "t_array(t_struct(Checkpoint)4929_storage)dyn_storage" }, "t_mapping(t_address,t_mapping(t_address,t_uint256))": { "encoding": "mapping", @@ -920,12 +1003,12 @@ "numberOfBytes": "32", "value": "t_mapping(t_address,t_uint256)" }, - "t_mapping(t_address,t_struct(Counter)6299_storage)": { + "t_mapping(t_address,t_struct(Counter)6357_storage)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => struct Counters.Counter)", "numberOfBytes": "32", - "value": "t_struct(Counter)6299_storage" + "value": "t_struct(Counter)6357_storage" }, "t_mapping(t_address,t_uint256)": { "encoding": "mapping", @@ -939,12 +1022,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Checkpoint)4871_storage": { + "t_struct(Checkpoint)4929_storage": { "encoding": "inplace", "label": "struct ERC20Votes.Checkpoint", "members": [ { - "astId": 4868, + "astId": 4926, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "fromBlock", "offset": 0, @@ -952,7 +1035,7 @@ "type": "t_uint32" }, { - "astId": 4870, + "astId": 4928, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "votes", "offset": 4, @@ -962,12 +1045,12 @@ ], "numberOfBytes": "32" }, - "t_struct(Counter)6299_storage": { + "t_struct(Counter)6357_storage": { "encoding": "inplace", "label": "struct Counters.Counter", "members": [ { - "astId": 6298, + "astId": 6356, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "_value", "offset": 0, diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json index b6a0103..46ae64d 100644 --- a/deployments/localhost/GovernerContract.json +++ b/deployments/localhost/GovernerContract.json @@ -27,6 +27,16 @@ "internalType": "uint256", "name": "_quorumPercentage", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_enteranceFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_daoPercentage", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -37,11 +47,66 @@ "name": "Empty", "type": "error" }, + { + "inputs": [], + "name": "FundProject__NotApporovedByDao", + "type": "error" + }, + { + "inputs": [], + "name": "FundProject__NotEnoughPayment", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_projectId", + "type": "uint256" + } + ], + "name": "FundProject__TransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "FundProject__UpkeepNeeded", + "type": "error" + }, + { + "inputs": [], + "name": "FundProject__WithdrawTransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "FundProject__withdrawFund", + "type": "error" + }, { "inputs": [], "name": "GovernerContract__NotApporovedByDaoFoundation", "type": "error" }, + { + "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": [ @@ -323,6 +388,32 @@ "name": "VotingPeriodSet", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_projectId", + "type": "uint256" + } + ], + "name": "projectFundingFailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_projectId", + "type": "uint256" + } + ], + "name": "projectSuccessfullyFunded", + "type": "event" + }, { "inputs": [], "name": "BALLOT_TYPEHASH", @@ -366,55 +457,30 @@ "inputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "", "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" } ], - "name": "castVote", + "name": "_ProjectFundingStatus", "outputs": [ { - "internalType": "uint256", + "internalType": "enum FundProject.ProjectFundingStatus", "name": "", - "type": "uint256" + "type": "uint8" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "_projecID", "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" } ], - "name": "castVoteBySig", + "name": "_getBalanceOfProject", "outputs": [ { "internalType": "uint256", @@ -422,28 +488,18 @@ "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "_projecID", "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" } ], - "name": "castVoteWithReason", + "name": "_getFundingGoalAmount", "outputs": [ { "internalType": "uint256", @@ -451,82 +507,37 @@ "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "_projecID", "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" } ], - "name": "castVoteWithReasonAndParams", + "name": "_getHashOfProjectData", "outputs": [ { - "internalType": "uint256", + "internalType": "string", "name": "", - "type": "uint256" + "type": "string" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "uint256", - "name": "proposalId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "support", - "type": "uint8" - }, { "internalType": "string", - "name": "reason", + "name": "_ipfsHash", "type": "string" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" } ], - "name": "castVoteWithReasonAndParamsBySig", + "name": "_getProjectId", "outputs": [ { "internalType": "uint256", @@ -534,62 +545,42 @@ "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address[]", - "name": "targets", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "calldatas", - "type": "bytes[]" - }, - { - "internalType": "bytes32", - "name": "descriptionHash", - "type": "bytes32" + "internalType": "uint256", + "name": "_projectID", + "type": "uint256" } ], - "name": "execute", + "name": "_getProjectStatus", "outputs": [ { - "internalType": "uint256", + "internalType": "enum FundProject.ProjectFundingStatus", "name": "", - "type": "uint256" + "type": "uint8" } ], - "stateMutability": "payable", + "stateMutability": "view", "type": "function" }, { "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, { "internalType": "uint256", - "name": "blockNumber", + "name": "_projecID", "type": "uint256" } ], - "name": "getVotes", + "name": "_isApporoveFundingByDao", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -597,28 +588,18 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, { "internalType": "uint256", - "name": "blockNumber", + "name": "", "type": "uint256" - }, - { - "internalType": "bytes", - "name": "params", - "type": "bytes" } ], - "name": "getVotesWithParams", + "name": "_isApporovedByDao", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -628,16 +609,11 @@ "inputs": [ { "internalType": "uint256", - "name": "proposalId", + "name": "", "type": "uint256" - }, - { - "internalType": "address", - "name": "account", - "type": "address" } ], - "name": "hasVoted", + "name": "_isFunding", "outputs": [ { "internalType": "bool", @@ -651,17 +627,444 @@ { "inputs": [ { - "internalType": "address[]", - "name": "targets", - "type": "address[]" + "internalType": "string", + "name": "_ipfsHash", + "type": "string" }, { - "internalType": "uint256[]", - "name": "values", - "type": "uint256[]" + "internalType": "uint256", + "name": "_fundingGoalAmount", + "type": "uint256" }, { - "internalType": "bytes[]", + "internalType": "uint256", + "name": "_time", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_projectOwnerAddress", + "type": "address" + } + ], + "name": "apporoveFundingByDao", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_projecID", + "type": "uint256" + } + ], + "name": "cancelApporovelFundingByDao", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + } + ], + "name": "castVote", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + } + ], + "name": "castVoteWithReason", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "castVoteWithReasonAndParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "support", + "type": "uint8" + }, + { + "internalType": "string", + "name": "reason", + "type": "string" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "castVoteWithReasonAndParamsBySig", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "checkUpkeep", + "outputs": [ + { + "internalType": "bool", + "name": "upkeepNeeded", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "daoPercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "enteranceFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", + "name": "calldatas", + "type": "bytes[]" + }, + { + "internalType": "bytes32", + "name": "descriptionHash", + "type": "bytes32" + } + ], + "name": "execute", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_projecID", + "type": "uint256" + } + ], + "name": "fund", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "funders", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEnteranceFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "getVotes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "params", + "type": "bytes" + } + ], + "name": "getVotesWithParams", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "proposalId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasVoted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "targets", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, @@ -682,6 +1085,44 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "hashToProjectId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "idToHash", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -701,6 +1142,38 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_projectID", + "type": "uint256" + } + ], + "name": "is_funding", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastTimeStamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "name", @@ -742,88 +1215,215 @@ "type": "bytes" } ], - "name": "onERC1155BatchReceived", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "onERC721Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "paySubmitFee", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "performUpkeep", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" - }, + "type": "uint256" + } + ], + "name": "projectFundingGoalAmount", + "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" - }, + } + ], + "name": "projectFunds", + "outputs": [ { - "internalType": "bytes", + "internalType": "uint256", "name": "", - "type": "bytes" + "type": "uint256" } ], - "name": "onERC1155Received", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "projectId", "outputs": [ { - "internalType": "bytes4", + "internalType": "uint256", "name": "", - "type": "bytes4" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" - }, + "type": "uint256" + } + ], + "name": "projectOwnerAddress", + "outputs": [ { "internalType": "address", "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { - "internalType": "bytes", + "internalType": "uint256", "name": "", - "type": "bytes" + "type": "uint256" } ], - "name": "onERC721Received", + "name": "projectToTime", "outputs": [ { - "internalType": "bytes4", + "internalType": "uint256", "name": "", - "type": "bytes4" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -1080,6 +1680,13 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1157,6 +1764,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "time", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "timelock", @@ -1183,6 +1809,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1248,100 +1887,129 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_projectID", + "type": "uint256" + } + ], + "name": "withdrawFund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "stateMutability": "payable", "type": "receive" } ], - "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "transactionIndex": 0, - "gasUsed": "6161333", - "logsBloom": "0x00000000000000000100000000001000000000000000000000000000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000000000000000000000010000000000000000000000000080002000000000000000000000000000000000000000000001000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000001000000000080000800000000000000000000000000000000000000000000000000000000000000000002000", - "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4", - "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "gasUsed": "7895230", + "logsBloom": "0x00000000000000000100000000001000000000000000000000800000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000001000000000000000010000000000000000000020000080002000100000800000000000000000000000000000000401000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000200000000000000000000000003000000000080000800020000000000000000000000000000000000000000000000000000000000000002000", + "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755", + "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", "logs": [ { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 0, - "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" + "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" ], "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8", "logIndex": 1, - "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" + "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 2, - "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" + "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 3, - "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" + "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x65a481747c719333347d27fafe634cb55203888313992cf38ded5e2cf149a54f", + "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0", + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3", "logIndex": 4, - "blockHash": "0x63ee4323e40ee0415ae975b28dd10ee563248d529b501d3d45156d03accd2be4" + "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" + }, + { + "transactionIndex": 0, + "blockNumber": 4, + "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x", + "logIndex": 5, + "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" } ], "blockNumber": 4, - "cumulativeGasUsed": "6161333", + "cumulativeGasUsed": "7895230", "status": 1, "byzantium": true }, "args": [ + "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", 0, 200, - 0 + 0, + "10000000000000000", + "10" ], "numDeployments": 1, - "solcInputHash": "c3bd0fff8e093c1104055db0ec135b98", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NotApporovedByDaoFoundation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"inWhiteList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl\\n{\\n error GovernerContract__NotApporovedByDaoFoundation();\\n\\n mapping(address => bool) public inWhiteList;\\n\\n modifier isApporovedByDaoFoundation() {\\n if (!inWhiteList[msg.sender])\\n revert GovernerContract__NotApporovedByDaoFoundation();\\n _;\\n }\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x9c54ad803a57f8d4b6b3c7cdcf26172e7c2d820ac9935e9684dc12146ef81c9d\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6101606040523480156200001257600080fd5b5060405162007ea938038062007ea9833981810160405281019062000038919062000af1565b838186858560006040518060400160405280601081526020017f476f7665726e6572436f6e7472616374000000000000000000000000000000008152508062000086620001e660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000ef8184846200022360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000149919062000de9565b50506200015c836200025f60201b60201c565b6200016d82620002a660201b60201c565b6200017e816200033360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001c8816200037a60201b60201c565b50620001da816200055960201b60201c565b505050505050620012f4565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200024095949392919062000f0d565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516200029492919062000f6a565b60405180910390a18060048190555050565b60008111620002ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e3906200101e565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828600554826040516200032192919062000f6a565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516200036892919062000f6a565b60405180910390a18060068190555050565b6200038a620005fa60201b60201c565b811115620003cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c690620010dc565b60405180910390fd5b6000620003e16200060360201b60201c565b905060008114158015620003fd57506000600960000180549050145b15620004fd5760096000016040518060400160405280600063ffffffff16815260200162000436846200063b60201b62001e961760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000518826009620006a960201b62001f011790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200054d92919062000f6a565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ae929190620010fe565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006064905090565b6000806009600001805490501462000632576200062c6009620008e760201b620021031760201c565b62000636565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620006a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069890620011a1565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620006cb86620008e760201b60201c565b90506000821180156200072757504386600001600184620006ed9190620011f2565b815481106200070157620007006200122d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620007cb5762000743856200063b60201b62001e961760201c565b86600001600184620007569190620011f2565b815481106200076a57620007696200122d565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620008d8565b856000016040518060400160405280620007f0436200098960201b6200219e1760201c565b63ffffffff16815260200162000811886200063b60201b62001e961760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114620009605782600001600182620009109190620011f2565b815481106200092457620009236200122d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000963565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115620009d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009ce90620012d2565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a1182620009e4565b9050919050565b600062000a258262000a04565b9050919050565b62000a378162000a18565b811462000a4357600080fd5b50565b60008151905062000a578162000a2c565b92915050565b600062000a6a82620009e4565b9050919050565b600062000a7e8262000a5d565b9050919050565b62000a908162000a71565b811462000a9c57600080fd5b50565b60008151905062000ab08162000a85565b92915050565b6000819050919050565b62000acb8162000ab6565b811462000ad757600080fd5b50565b60008151905062000aeb8162000ac0565b92915050565b600080600080600060a0868803121562000b105762000b0f620009df565b5b600062000b208882890162000a46565b955050602062000b338882890162000a9f565b945050604062000b468882890162000ada565b935050606062000b598882890162000ada565b925050608062000b6c8882890162000ada565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bfb57607f821691505b60208210810362000c115762000c1062000bb3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c3c565b62000c87868362000c3c565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000cca62000cc462000cbe8462000ab6565b62000c9f565b62000ab6565b9050919050565b6000819050919050565b62000ce68362000ca9565b62000cfe62000cf58262000cd1565b84845462000c49565b825550505050565b600090565b62000d1562000d06565b62000d2281848462000cdb565b505050565b5b8181101562000d4a5762000d3e60008262000d0b565b60018101905062000d28565b5050565b601f82111562000d995762000d638162000c17565b62000d6e8462000c2c565b8101602085101562000d7e578190505b62000d9662000d8d8562000c2c565b83018262000d27565b50505b505050565b600082821c905092915050565b600062000dbe6000198460080262000d9e565b1980831691505092915050565b600062000dd9838362000dab565b9150826002028217905092915050565b62000df48262000b79565b67ffffffffffffffff81111562000e105762000e0f62000b84565b5b62000e1c825462000be2565b62000e2982828562000d4e565b600060209050601f83116001811462000e61576000841562000e4c578287015190505b62000e58858262000dcb565b86555062000ec8565b601f19841662000e718662000c17565b60005b8281101562000e9b5784890151825560018201915060208501945060208101905062000e74565b8683101562000ebb578489015162000eb7601f89168262000dab565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b62000ee58162000ed0565b82525050565b62000ef68162000ab6565b82525050565b62000f078162000a04565b82525050565b600060a08201905062000f24600083018862000eda565b62000f33602083018762000eda565b62000f42604083018662000eda565b62000f51606083018562000eeb565b62000f60608083018462000efc565b9695505050505050565b600060408201905062000f81600083018562000eeb565b62000f90602083018462000eeb565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200100660278362000f97565b9150620010138262000fa8565b604082019050919050565b60006020820190508181036000830152620010398162000ff7565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620010c460438362000f97565b9150620010d18262001040565b606082019050919050565b60006020820190508181036000830152620010f781620010b5565b9050919050565b600060408201905062001115600083018562000efc565b62001124602083018462000efc565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200118960278362000f97565b915062001196826200112b565b604082019050919050565b60006020820190508181036000830152620011bc816200117a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011ff8262000ab6565b91506200120c8362000ab6565b9250828203905081811115620012275762001226620011c3565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620012ba60268362000f97565b9150620012c7826200125c565b604082019050919050565b60006020820190508181036000830152620012ed81620012ab565b9050919050565b60805160a05160c05160e051610100516101205161014051616b4c6200135d60003960008181611e7401528181612f4a01526131be01526000613484015260006134c6015260006134a5015260006133da01526000613430015260006134590152616b4c6000f3fe6080604052600436106102555760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf14610a13578063eb9019d414610a3c578063ece40cc114610a79578063f23a6e6114610aa2578063f8ce560a14610adf578063fc0c546a14610b1c5761029b565b8063c28bc2fa1461092c578063c59057e414610955578063d33219b414610992578063dd4e2ba5146109bd578063deaaa7cc146109e85761029b565b8063a890c910116100fd578063a890c91014610821578063ab58fb8e1461084a578063b58131b014610887578063bc197c81146108b2578063c01f9e37146108ef5761029b565b80637b3c71d3146107145780637d5e81e21461075157806397c3d3341461078e5780639a802a6d146107b9578063a7713a70146107f65761029b565b80633932abb1116101d257806354fd4d501161019657806354fd4d50146105cc57806356781388146105f75780635f398a141461063457806360c4247f1461067157806369e0e346146106ae57806370b0f660146106eb5761029b565b80633932abb1146104ab5780633bccf4fd146104d65780633e4f49e6146105135780634385963214610550578063544ffc9c1461058d5761029b565b8063150b7a0211610219578063150b7a0214610399578063160cbed7146103d65780632656227d146104135780632d63f693146104435780632fe3e261146104805761029b565b806301ffc9a7146102a057806302a251a3146102dd578063034201811461030857806306f3f9e61461034557806306fdde031461036e5761029b565b3661029b573073ffffffffffffffffffffffffffffffffffffffff16610279610b47565b73ffffffffffffffffffffffffffffffffffffffff161461029957600080fd5b005b600080fd5b3480156102ac57600080fd5b506102c760048036038101906102c291906140c9565b610b56565b6040516102d49190614111565b60405180910390f35b3480156102e957600080fd5b506102f2610b68565b6040516102ff9190614145565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906143a1565b610b77565b60405161033c9190614145565b60405180910390f35b34801561035157600080fd5b5061036c6004803603810190610367919061447f565b610c5c565b005b34801561037a57600080fd5b50610383610d53565b604051610390919061452b565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb91906145ab565b610de5565b6040516103cd919061463d565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f891906148bf565b610df9565b60405161040a9190614145565b60405180910390f35b61042d600480360381019061042891906148bf565b6110b3565b60405161043a9190614145565b60405180910390f35b34801561044f57600080fd5b5061046a6004803603810190610465919061447f565b611200565b6040516104779190614145565b60405180910390f35b34801561048c57600080fd5b5061049561126e565b6040516104a29190614989565b60405180910390f35b3480156104b757600080fd5b506104c0611292565b6040516104cd9190614145565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906149a4565b6112a1565b60405161050a9190614145565b60405180910390f35b34801561051f57600080fd5b5061053a6004803603810190610535919061447f565b61132b565b6040516105479190614a96565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190614ab1565b61133d565b6040516105849190614111565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af919061447f565b6113a8565b6040516105c393929190614af1565b60405180910390f35b3480156105d857600080fd5b506105e16113e0565b6040516105ee919061452b565b60405180910390f35b34801561060357600080fd5b5061061e60048036038101906106199190614b28565b61141d565b60405161062b9190614145565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190614b68565b61144e565b6040516106689190614145565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061447f565b6114b8565b6040516106a59190614145565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d09190614c0c565b611604565b6040516106e29190614111565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d919061447f565b611624565b005b34801561072057600080fd5b5061073b60048036038101906107369190614c39565b61171b565b6040516107489190614145565b60405180910390f35b34801561075d57600080fd5b5061077860048036038101906107739190614d4e565b611783565b6040516107859190614145565b60405180910390f35b34801561079a57600080fd5b506107a361179b565b6040516107b09190614145565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db9190614e25565b6117a4565b6040516107ed9190614145565b60405180910390f35b34801561080257600080fd5b5061080b6117ba565b6040516108189190614145565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190614ee4565b6117e3565b005b34801561085657600080fd5b50610871600480360381019061086c919061447f565b6118da565b60405161087e9190614145565b60405180910390f35b34801561089357600080fd5b5061089c6119a7565b6040516108a99190614145565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190614f11565b6119b6565b6040516108e6919061463d565b60405180910390f35b3480156108fb57600080fd5b506109166004803603810190610911919061447f565b6119cb565b6040516109239190614145565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190615036565b611a39565b005b34801561096157600080fd5b5061097c600480360381019061097791906148bf565b611b7a565b6040516109899190614145565b60405180910390f35b34801561099e57600080fd5b506109a7611bb6565b6040516109b491906150b9565b60405180910390f35b3480156109c957600080fd5b506109d2611be0565b6040516109df919061452b565b60405180910390f35b3480156109f457600080fd5b506109fd611c1d565b604051610a0a9190614989565b60405180910390f35b348015610a1f57600080fd5b50610a3a6004803603810190610a35919061447f565b611c41565b005b348015610a4857600080fd5b50610a636004803603810190610a5e91906150d4565b611d38565b604051610a709190614145565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b919061447f565b611d54565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190615114565b611e4b565b604051610ad6919061463d565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b01919061447f565b611e60565b604051610b139190614145565b60405180910390f35b348015610b2857600080fd5b50610b31611e72565b604051610b3e919061520a565b60405180910390f35b6000610b516121f1565b905090565b6000610b618261221b565b9050919050565b6000610b72612295565b905090565b600080610bfa610bf27fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610bb3929190615255565b60405180910390208b80519060200120604051602001610bd795949392919061527d565b6040516020818303038152906040528051906020012061229f565b8686866122b9565b9050610c4d8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a6122e4565b91505098975050505050505050565b610c64610b47565b73ffffffffffffffffffffffffffffffffffffffff16610c826124a0565b73ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf9061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16610cf7610b47565b73ffffffffffffffffffffffffffffffffffffffff1614610d47576000610d1c6124a8565b604051610d2a929190615255565b604051809103902090505b80610d4060026124b5565b03610d3557505b610d5081612591565b50565b606060008054610d629061536b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8e9061536b565b8015610ddb5780601f10610db057610100808354040283529160200191610ddb565b820191906000526020600020905b815481529060010190602001808311610dbe57829003601f168201915b5050505050905090565b600063150b7a0260e01b9050949350505050565b600080610e0886868686611b7a565b905060046007811115610e1e57610e1d614a1f565b5b610e278261132b565b6007811115610e3957610e38614a1f565b5b14610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e709061540e565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190615443565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610f7295949392919061574b565b602060405180830381865afa158015610f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb391906157c8565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611030969594939291906157f5565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611090919061589a565b60405161109e9291906158ce565b60405180910390a18192505050949350505050565b6000806110c286868686611b7a565b905060006110cf8261132b565b9050600460078111156110e5576110e4614a1f565b5b8160078111156110f8576110f7614a1f565b5b148061112857506005600781111561111357611112614a1f565b5b81600781111561112657611125614a1f565b5b145b611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e9061540e565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516111c49190614145565b60405180910390a16111d98288888888612745565b6111e68288888888612828565b6111f3828888888861283c565b8192505050949350505050565b600061125d600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b600061129c6128a5565b905090565b6000806113026112fa7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f89896040516020016112df939291906158f7565b6040516020818303038152906040528051906020012061229f565b8686866122b9565b905061131f878288604051806020016040528060008152506128af565b91505095945050505050565b6000611336826128cf565b9050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806114286124a0565b9050611445848285604051806020016040528060008152506128af565b91505092915050565b6000806114596124a0565b90506114ac87828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876122e4565b91505095945050505050565b6000806009600001805490509050600081036114d9576008549150506115ff565b600060096000016001836114ed919061592e565b815481106114fe576114fd615962565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff16116115e65780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506115ff565b6115fa846009612aa290919063ffffffff16565b925050505b919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b61162c610b47565b73ffffffffffffffffffffffffffffffffffffffff1661164a6124a0565b73ffffffffffffffffffffffffffffffffffffffff16146116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166116bf610b47565b73ffffffffffffffffffffffffffffffffffffffff161461170f5760006116e46124a8565b6040516116f2929190615255565b604051809103902090505b8061170860026124b5565b036116fd57505b61171881612bfa565b50565b6000806117266124a0565b905061177886828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128af565b915050949350505050565b600061179185858585612c3f565b9050949350505050565b60006064905090565b60006117b1848484612f46565b90509392505050565b600080600960000180549050146117da576117d56009612103565b6117de565b6008545b905090565b6117eb610b47565b73ffffffffffffffffffffffffffffffffffffffff166118096124a0565b73ffffffffffffffffffffffffffffffffffffffff161461185f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118569061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661187e610b47565b73ffffffffffffffffffffffffffffffffffffffff16146118ce5760006118a36124a8565b6040516118b1929190615255565b604051809103902090505b806118c760026124b5565b036118bc57505b6118d781612fed565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b815260040161194b9190614989565b602060405180830381865afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190615443565b90506001811461199c578061199f565b60005b915050919050565b60006119b161308c565b905090565b600063bc197c8160e01b905095945050505050565b6000611a28600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff169050919050565b611a41610b47565b73ffffffffffffffffffffffffffffffffffffffff16611a5f6124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac9061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611ad4610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611b24576000611af96124a8565b604051611b07929190615255565b604051809103902090505b80611b1d60026124b5565b03611b1257505b611b738483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085613096565b5050505050565b600084848484604051602001611b939493929190615991565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b611c49610b47565b73ffffffffffffffffffffffffffffffffffffffff16611c676124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb49061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611cdc610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576000611d016124a8565b604051611d0f929190615255565b604051809103902090505b80611d2560026124b5565b03611d1a57505b611d35816130c5565b50565b6000611d4c8383611d4761314d565b612f46565b905092915050565b611d5c610b47565b73ffffffffffffffffffffffffffffffffffffffff16611d7a6124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc79061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611def610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611e3f576000611e146124a8565b604051611e22929190615255565b604051809103902090505b80611e3860026124b5565b03611e2d57505b611e4881613164565b50565b600063f23a6e6160e01b905095945050505050565b6000611e6b826131a9565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090615a5d565b60405180910390fd5b819050919050565b6000806000846000018054905090506000611f1b86612103565b9050600082118015611f7157504386600001600184611f3a919061592e565b81548110611f4b57611f4a615962565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1561200157611f7f85611e96565b86600001600184611f90919061592e565b81548110611fa157611fa0615962565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506120f4565b8560000160405180604001604052806120194361219e565b63ffffffff16815260200161202d88611e96565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b60008082600001805490509050600081146121755782600001600182612129919061592e565b8154811061213a57612139615962565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612178565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090615aef565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061228e575061228d82613271565b5b9050919050565b6000600554905090565b60006122b26122ac6133d6565b836134f0565b9050919050565b60008060006122ca87878787613523565b915091506122d78161362f565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156123105761230f614a1f565b5b6123198861132b565b600781111561232b5761232a614a1f565b5b1461236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290615b81565b60405180910390fd5b60006123ca876123ba846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff1686612f46565b90506123d988888884886137fb565b600084510361243b578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48988848960405161242e9493929190615ba1565b60405180910390a2612492565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612489959493929190615c37565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b60006124c0826139ff565b156124f7576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b61259961179b565b8111156125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290615d30565b60405180910390fd5b60006125e56117ba565b90506000811415801561260057506000600960000180549050145b156126f25760096000016040518060400160405280600063ffffffff16815260200161262b84611e96565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b612706826009611f0190919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516127399291906158ce565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16612764610b47565b73ffffffffffffffffffffffffffffffffffffffff16146128215760005b845181101561281f573073ffffffffffffffffffffffffffffffffffffffff168582815181106127b5576127b4615962565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361280e5761280d8382815181106127ee576127ed615962565b5b6020026020010151805190602001206002613a3490919063ffffffff16565b5b8061281890615d50565b9050612782565b505b5050505050565b6128358585858585613ab0565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661285b610b47565b73ffffffffffffffffffffffffffffffffffffffff16146128905761288060026139ff565b61288f5761288e6002613b4e565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006128c5858585856128c061314d565b6122e4565b9050949350505050565b6000806128db83613bcf565b9050600460078111156128f1576128f0614a1f565b5b81600781111561290457612903614a1f565b5b146129125780915050612a9d565b6000600b60008581526020019081526020016000205490506000801b810361293e578192505050612a9d565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016129999190614989565b602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190615dc4565b156129ea57600792505050612a9d565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b8152600401612a459190614989565b602060405180830381865afa158015612a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a869190615dc4565b15612a9657600592505050612a9d565b6002925050505b919050565b6000438210612ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612add90615e3d565b60405180910390fd5b60008360000180549050905060005b81811015612b6a576000612b098284613ce3565b905084866000018281548110612b2257612b21615962565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612b5457809250612b64565b600181612b61919061589a565b91505b50612af5565b60008214612bcf5784600001600183612b83919061592e565b81548110612b9457612b93615962565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612bd2565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051612c2d9291906158ce565b60405180910390a18060048190555050565b6000612c496119a7565b612c66612c546124a0565b600143612c61919061592e565b611d38565b1015612ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9e90615ecf565b60405180910390fd5b6000612cbc8686868680519060200120611b7a565b90508451865114612d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf990615f61565b60405180910390fd5b8351865114612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d90615f61565b60405180910390fd5b6000865111612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8190615fcd565b60405180910390fd5b6000600160008381526020019081526020016000209050612dea816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613d09565b612e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e209061605f565b60405180910390fd5b6000612e3b612e36611292565b613d23565b612e4443613d23565b612e4e9190616093565b90506000612e62612e5d610b68565b613d23565b82612e6d9190616093565b9050612e858284600001613d7a90919063ffffffff16565b612e9b8184600101613d7a90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084612ec56124a0565b8b8b8d5167ffffffffffffffff811115612ee257612ee1614240565b5b604051908082528060200260200182016040528015612f1557816020015b6060815260200190600190039081612f005790505b508c88888e604051612f2f9998979695949392919061620c565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612fa39291906162bc565b602060405180830381865afa158015612fc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe49190615443565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516130409291906162e5565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606130bc848484604051806060016040528060298152602001616aee60299139613da9565b90509392505050565b60008111613108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff90616380565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405161313b9291906158ce565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516131979291906158ce565b60405180910390a18060068190555050565b60006131b361179b565b6131bc836114b8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016132159190614145565b602060405180830381865afa158015613232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132569190615443565b61326091906163a0565b61326a9190616411565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061335757507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133bf57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133cf57506133ce82613ebd565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561345257507f000000000000000000000000000000000000000000000000000000000000000046145b1561347f577f000000000000000000000000000000000000000000000000000000000000000090506134ed565b6134ea7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613f27565b90505b90565b600082826040516020016135059291906164ba565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561355e576000600391509150613626565b601b8560ff16141580156135765750601c8560ff1614155b15613588576000600491509150613626565b6000600187878787604051600081526020016040526040516135ad94939291906164f1565b6020604051602081039080840390855afa1580156135cf573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361361d57600060019250925050613626565b80600092509250505b94509492505050565b6000600481111561364357613642614a1f565b5b81600481111561365657613655614a1f565b5b03156137f857600160048111156136705761366f614a1f565b5b81600481111561368357613682614a1f565b5b036136c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ba90616582565b60405180910390fd5b600260048111156136d7576136d6614a1f565b5b8160048111156136ea576136e9614a1f565b5b0361372a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613721906165ee565b60405180910390fd5b6003600481111561373e5761373d614a1f565b5b81600481111561375157613750614a1f565b5b03613791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378890616680565b60405180910390fd5b6004808111156137a4576137a3614a1f565b5b8160048111156137b7576137b6614a1f565b5b036137f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ee90616712565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156138a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613898906167a4565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561390f5761390e614a1f565b5b60ff168460ff160361393b578281600001600082825461392f919061589a565b925050819055506139f7565b6001600281111561394f5761394e614a1f565b5b60ff168460ff160361397b578281600101600082825461396f919061589a565b925050819055506139f6565b60028081111561398e5761398d614a1f565b5b60ff168460ff16036139ba57828160020160008282546139ae919061589a565b925050819055506139f5565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ec90616836565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401613b1595949392919061574b565b6000604051808303818588803b158015613b2e57600080fd5b505af1158015613b42573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615613c08576007915050613cde565b8060020160019054906101000a900460ff1615613c29576002915050613cde565b6000613c3484611200565b905060008103613c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c70906168a2565b60405180910390fd5b438110613c8b57600092505050613cde565b6000613c96856119cb565b9050438110613cab5760019350505050613cde565b613cb485613f61565b8015613cc55750613cc485613fa8565b5b15613cd65760049350505050613cde565b600393505050505b919050565b60006002828418613cf49190616411565b828416613d01919061589a565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115613d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d6990616934565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015613dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613de5906169c6565b60405180910390fd5b613df785613fd3565b613e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e2d90616a32565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e5f9190616a83565b60006040518083038185875af1925050503d8060008114613e9c576040519150601f19603f3d011682016040523d82523d6000602084013e613ea1565b606091505b5091509150613eb1828286613ff6565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001613f42959493929190616a9a565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154613f8d919061589a565b613f9e613f9985611200565b611e60565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561400657829050614056565b6000835111156140195782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404d919061452b565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6140a681614071565b81146140b157600080fd5b50565b6000813590506140c38161409d565b92915050565b6000602082840312156140df576140de614067565b5b60006140ed848285016140b4565b91505092915050565b60008115159050919050565b61410b816140f6565b82525050565b60006020820190506141266000830184614102565b92915050565b6000819050919050565b61413f8161412c565b82525050565b600060208201905061415a6000830184614136565b92915050565b6141698161412c565b811461417457600080fd5b50565b60008135905061418681614160565b92915050565b600060ff82169050919050565b6141a28161418c565b81146141ad57600080fd5b50565b6000813590506141bf81614199565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126141ea576141e96141c5565b5b8235905067ffffffffffffffff811115614207576142066141ca565b5b602083019150836001820283011115614223576142226141cf565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142788261422f565b810181811067ffffffffffffffff8211171561429757614296614240565b5b80604052505050565b60006142aa61405d565b90506142b6828261426f565b919050565b600067ffffffffffffffff8211156142d6576142d5614240565b5b6142df8261422f565b9050602081019050919050565b82818337600083830152505050565b600061430e614309846142bb565b6142a0565b90508281526020810184848401111561432a5761432961422a565b5b6143358482856142ec565b509392505050565b600082601f830112614352576143516141c5565b5b81356143628482602086016142fb565b91505092915050565b6000819050919050565b61437e8161436b565b811461438957600080fd5b50565b60008135905061439b81614375565b92915050565b60008060008060008060008060e0898b0312156143c1576143c0614067565b5b60006143cf8b828c01614177565b98505060206143e08b828c016141b0565b975050604089013567ffffffffffffffff8111156144015761440061406c565b5b61440d8b828c016141d4565b9650965050606089013567ffffffffffffffff8111156144305761442f61406c565b5b61443c8b828c0161433d565b945050608061444d8b828c016141b0565b93505060a061445e8b828c0161438c565b92505060c061446f8b828c0161438c565b9150509295985092959890939650565b60006020828403121561449557614494614067565b5b60006144a384828501614177565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156144e65780820151818401526020810190506144cb565b60008484015250505050565b60006144fd826144ac565b61450781856144b7565b93506145178185602086016144c8565b6145208161422f565b840191505092915050565b6000602082019050818103600083015261454581846144f2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145788261454d565b9050919050565b6145888161456d565b811461459357600080fd5b50565b6000813590506145a58161457f565b92915050565b600080600080608085870312156145c5576145c4614067565b5b60006145d387828801614596565b94505060206145e487828801614596565b93505060406145f587828801614177565b925050606085013567ffffffffffffffff8111156146165761461561406c565b5b6146228782880161433d565b91505092959194509250565b61463781614071565b82525050565b6000602082019050614652600083018461462e565b92915050565b600067ffffffffffffffff82111561467357614672614240565b5b602082029050602081019050919050565b600061469761469284614658565b6142a0565b905080838252602082019050602084028301858111156146ba576146b96141cf565b5b835b818110156146e357806146cf8882614596565b8452602084019350506020810190506146bc565b5050509392505050565b600082601f830112614702576147016141c5565b5b8135614712848260208601614684565b91505092915050565b600067ffffffffffffffff82111561473657614735614240565b5b602082029050602081019050919050565b600061475a6147558461471b565b6142a0565b9050808382526020820190506020840283018581111561477d5761477c6141cf565b5b835b818110156147a657806147928882614177565b84526020840193505060208101905061477f565b5050509392505050565b600082601f8301126147c5576147c46141c5565b5b81356147d5848260208601614747565b91505092915050565b600067ffffffffffffffff8211156147f9576147f8614240565b5b602082029050602081019050919050565b600061481d614818846147de565b6142a0565b905080838252602082019050602084028301858111156148405761483f6141cf565b5b835b8181101561488757803567ffffffffffffffff811115614865576148646141c5565b5b808601614872898261433d565b85526020850194505050602081019050614842565b5050509392505050565b600082601f8301126148a6576148a56141c5565b5b81356148b684826020860161480a565b91505092915050565b600080600080608085870312156148d9576148d8614067565b5b600085013567ffffffffffffffff8111156148f7576148f661406c565b5b614903878288016146ed565b945050602085013567ffffffffffffffff8111156149245761492361406c565b5b614930878288016147b0565b935050604085013567ffffffffffffffff8111156149515761495061406c565b5b61495d87828801614891565b925050606061496e8782880161438c565b91505092959194509250565b6149838161436b565b82525050565b600060208201905061499e600083018461497a565b92915050565b600080600080600060a086880312156149c0576149bf614067565b5b60006149ce88828901614177565b95505060206149df888289016141b0565b94505060406149f0888289016141b0565b9350506060614a018882890161438c565b9250506080614a128882890161438c565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110614a5f57614a5e614a1f565b5b50565b6000819050614a7082614a4e565b919050565b6000614a8082614a62565b9050919050565b614a9081614a75565b82525050565b6000602082019050614aab6000830184614a87565b92915050565b60008060408385031215614ac857614ac7614067565b5b6000614ad685828601614177565b9250506020614ae785828601614596565b9150509250929050565b6000606082019050614b066000830186614136565b614b136020830185614136565b614b206040830184614136565b949350505050565b60008060408385031215614b3f57614b3e614067565b5b6000614b4d85828601614177565b9250506020614b5e858286016141b0565b9150509250929050565b600080600080600060808688031215614b8457614b83614067565b5b6000614b9288828901614177565b9550506020614ba3888289016141b0565b945050604086013567ffffffffffffffff811115614bc457614bc361406c565b5b614bd0888289016141d4565b9350935050606086013567ffffffffffffffff811115614bf357614bf261406c565b5b614bff8882890161433d565b9150509295509295909350565b600060208284031215614c2257614c21614067565b5b6000614c3084828501614596565b91505092915050565b60008060008060608587031215614c5357614c52614067565b5b6000614c6187828801614177565b9450506020614c72878288016141b0565b935050604085013567ffffffffffffffff811115614c9357614c9261406c565b5b614c9f878288016141d4565b925092505092959194509250565b600067ffffffffffffffff821115614cc857614cc7614240565b5b614cd18261422f565b9050602081019050919050565b6000614cf1614cec84614cad565b6142a0565b905082815260208101848484011115614d0d57614d0c61422a565b5b614d188482856142ec565b509392505050565b600082601f830112614d3557614d346141c5565b5b8135614d45848260208601614cde565b91505092915050565b60008060008060808587031215614d6857614d67614067565b5b600085013567ffffffffffffffff811115614d8657614d8561406c565b5b614d92878288016146ed565b945050602085013567ffffffffffffffff811115614db357614db261406c565b5b614dbf878288016147b0565b935050604085013567ffffffffffffffff811115614de057614ddf61406c565b5b614dec87828801614891565b925050606085013567ffffffffffffffff811115614e0d57614e0c61406c565b5b614e1987828801614d20565b91505092959194509250565b600080600060608486031215614e3e57614e3d614067565b5b6000614e4c86828701614596565b9350506020614e5d86828701614177565b925050604084013567ffffffffffffffff811115614e7e57614e7d61406c565b5b614e8a8682870161433d565b9150509250925092565b6000614e9f8261454d565b9050919050565b6000614eb182614e94565b9050919050565b614ec181614ea6565b8114614ecc57600080fd5b50565b600081359050614ede81614eb8565b92915050565b600060208284031215614efa57614ef9614067565b5b6000614f0884828501614ecf565b91505092915050565b600080600080600060a08688031215614f2d57614f2c614067565b5b6000614f3b88828901614596565b9550506020614f4c88828901614596565b945050604086013567ffffffffffffffff811115614f6d57614f6c61406c565b5b614f79888289016147b0565b935050606086013567ffffffffffffffff811115614f9a57614f9961406c565b5b614fa6888289016147b0565b925050608086013567ffffffffffffffff811115614fc757614fc661406c565b5b614fd38882890161433d565b9150509295509295909350565b60008083601f840112614ff657614ff56141c5565b5b8235905067ffffffffffffffff811115615013576150126141ca565b5b60208301915083600182028301111561502f5761502e6141cf565b5b9250929050565b600080600080606085870312156150505761504f614067565b5b600061505e87828801614596565b945050602061506f87828801614177565b935050604085013567ffffffffffffffff8111156150905761508f61406c565b5b61509c87828801614fe0565b925092505092959194509250565b6150b38161456d565b82525050565b60006020820190506150ce60008301846150aa565b92915050565b600080604083850312156150eb576150ea614067565b5b60006150f985828601614596565b925050602061510a85828601614177565b9150509250929050565b600080600080600060a086880312156151305761512f614067565b5b600061513e88828901614596565b955050602061514f88828901614596565b945050604061516088828901614177565b935050606061517188828901614177565b925050608086013567ffffffffffffffff8111156151925761519161406c565b5b61519e8882890161433d565b9150509295509295909350565b6000819050919050565b60006151d06151cb6151c68461454d565b6151ab565b61454d565b9050919050565b60006151e2826151b5565b9050919050565b60006151f4826151d7565b9050919050565b615204816151e9565b82525050565b600060208201905061521f60008301846151fb565b92915050565b600081905092915050565b600061523c8385615225565b93506152498385846142ec565b82840190509392505050565b6000615262828486615230565b91508190509392505050565b6152778161418c565b82525050565b600060a082019050615292600083018861497a565b61529f6020830187614136565b6152ac604083018661526e565b6152b9606083018561497a565b6152c6608083018461497a565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b60006153066018836144b7565b9150615311826152d0565b602082019050919050565b60006020820190508181036000830152615335816152f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061538357607f821691505b6020821081036153965761539561533c565b5b50919050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006153f86021836144b7565b91506154038261539c565b604082019050919050565b60006020820190508181036000830152615427816153eb565b9050919050565b60008151905061543d81614160565b92915050565b60006020828403121561545957615458614067565b5b60006154678482850161542e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154a58161456d565b82525050565b60006154b7838361549c565b60208301905092915050565b6000602082019050919050565b60006154db82615470565b6154e5818561547b565b93506154f08361548c565b8060005b8381101561552157815161550888826154ab565b9750615513836154c3565b9250506001810190506154f4565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6155638161412c565b82525050565b6000615575838361555a565b60208301905092915050565b6000602082019050919050565b60006155998261552e565b6155a38185615539565b93506155ae8361554a565b8060005b838110156155df5781516155c68882615569565b97506155d183615581565b9250506001810190506155b2565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b600061563f82615618565b6156498185615623565b93506156598185602086016144c8565b6156628161422f565b840191505092915050565b60006156798383615634565b905092915050565b6000602082019050919050565b6000615699826155ec565b6156a381856155f7565b9350836020820285016156b585615608565b8060005b858110156156f157848403895281516156d2858261566d565b94506156dd83615681565b925060208a019950506001810190506156b9565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061573561573061572b84615703565b61570d565b61436b565b9050919050565b6157458161571a565b82525050565b600060a082019050818103600083015261576581886154d0565b90508181036020830152615779818761558e565b9050818103604083015261578d818661568e565b905061579c606083018561573c565b6157a9608083018461497a565b9695505050505050565b6000815190506157c281614375565b92915050565b6000602082840312156157de576157dd614067565b5b60006157ec848285016157b3565b91505092915050565b600060c082019050818103600083015261580f81896154d0565b90508181036020830152615823818861558e565b90508181036040830152615837818761568e565b9050615846606083018661573c565b615853608083018561497a565b61586060a0830184614136565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006158a58261412c565b91506158b08361412c565b92508282019050808211156158c8576158c761586b565b5b92915050565b60006040820190506158e36000830185614136565b6158f06020830184614136565b9392505050565b600060608201905061590c600083018661497a565b6159196020830185614136565b615926604083018461526e565b949350505050565b60006159398261412c565b91506159448361412c565b925082820390508181111561595c5761595b61586b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201905081810360008301526159ab81876154d0565b905081810360208301526159bf818661558e565b905081810360408301526159d3818561568e565b90506159e2606083018461497a565b95945050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000615a476027836144b7565b9150615a52826159eb565b604082019050919050565b60006020820190508181036000830152615a7681615a3a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615ad96026836144b7565b9150615ae482615a7d565b604082019050919050565b60006020820190508181036000830152615b0881615acc565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000615b6b6023836144b7565b9150615b7682615b0f565b604082019050919050565b60006020820190508181036000830152615b9a81615b5e565b9050919050565b6000608082019050615bb66000830187614136565b615bc3602083018661526e565b615bd06040830185614136565b8181036060830152615be281846144f2565b905095945050505050565b600082825260208201905092915050565b6000615c0982615618565b615c138185615bed565b9350615c238185602086016144c8565b615c2c8161422f565b840191505092915050565b600060a082019050615c4c6000830188614136565b615c59602083018761526e565b615c666040830186614136565b8181036060830152615c7881856144f2565b90508181036080830152615c8c8184615bfe565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000615d1a6043836144b7565b9150615d2582615c98565b606082019050919050565b60006020820190508181036000830152615d4981615d0d565b9050919050565b6000615d5b8261412c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615d8d57615d8c61586b565b5b600182019050919050565b615da1816140f6565b8114615dac57600080fd5b50565b600081519050615dbe81615d98565b92915050565b600060208284031215615dda57615dd9614067565b5b6000615de884828501615daf565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000615e276020836144b7565b9150615e3282615df1565b602082019050919050565b60006020820190508181036000830152615e5681615e1a565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000615eb96031836144b7565b9150615ec482615e5d565b604082019050919050565b60006020820190508181036000830152615ee881615eac565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000615f4b6021836144b7565b9150615f5682615eef565b604082019050919050565b60006020820190508181036000830152615f7a81615f3e565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000615fb76018836144b7565b9150615fc282615f81565b602082019050919050565b60006020820190508181036000830152615fe681615faa565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006160496021836144b7565b915061605482615fed565b604082019050919050565b600060208201905081810360008301526160788161603c565b9050919050565b600067ffffffffffffffff82169050919050565b600061609e8261607f565b91506160a98361607f565b9250828201905067ffffffffffffffff8111156160c9576160c861586b565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000616117826144ac565b61612181856160fb565b93506161318185602086016144c8565b61613a8161422f565b840191505092915050565b6000616151838361610c565b905092915050565b6000602082019050919050565b6000616171826160cf565b61617b81856160da565b93508360208202850161618d856160eb565b8060005b858110156161c957848403895281516161aa8582616145565b94506161b583616159565b925060208a01995050600181019050616191565b50829750879550505050505092915050565b60006161f66161f16161ec8461607f565b6151ab565b61412c565b9050919050565b616206816161db565b82525050565b600061012082019050616222600083018c614136565b61622f602083018b6150aa565b8181036040830152616241818a6154d0565b90508181036060830152616255818961558e565b905081810360808301526162698188616166565b905081810360a083015261627d818761568e565b905061628c60c08301866161fd565b61629960e08301856161fd565b8181036101008301526162ac81846144f2565b90509a9950505050505050505050565b60006040820190506162d160008301856150aa565b6162de6020830184614136565b9392505050565b60006040820190506162fa60008301856150aa565b61630760208301846150aa565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b600061636a6027836144b7565b91506163758261630e565b604082019050919050565b600060208201905081810360008301526163998161635d565b9050919050565b60006163ab8261412c565b91506163b68361412c565b92508282026163c48161412c565b915082820484148315176163db576163da61586b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061641c8261412c565b91506164278361412c565b925082616437576164366163e2565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000616483600283616442565b915061648e8261644d565b600282019050919050565b6000819050919050565b6164b46164af8261436b565b616499565b82525050565b60006164c582616476565b91506164d182856164a3565b6020820191506164e182846164a3565b6020820191508190509392505050565b6000608082019050616506600083018761497a565b616513602083018661526e565b616520604083018561497a565b61652d606083018461497a565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061656c6018836144b7565b915061657782616536565b602082019050919050565b6000602082019050818103600083015261659b8161655f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006165d8601f836144b7565b91506165e3826165a2565b602082019050919050565b60006020820190508181036000830152616607816165cb565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061666a6022836144b7565b91506166758261660e565b604082019050919050565b600060208201905081810360008301526166998161665d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006166fc6022836144b7565b9150616707826166a0565b604082019050919050565b6000602082019050818103600083015261672b816166ef565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b600061678e6027836144b7565b915061679982616732565b604082019050919050565b600060208201905081810360008301526167bd81616781565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b60006168206035836144b7565b915061682b826167c4565b604082019050919050565b6000602082019050818103600083015261684f81616813565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b600061688c601d836144b7565b915061689782616856565b602082019050919050565b600060208201905081810360008301526168bb8161687f565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061691e6026836144b7565b9150616929826168c2565b604082019050919050565b6000602082019050818103600083015261694d81616911565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006169b06026836144b7565b91506169bb82616954565b604082019050919050565b600060208201905081810360008301526169df816169a3565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000616a1c601d836144b7565b9150616a27826169e6565b602082019050919050565b60006020820190508181036000830152616a4b81616a0f565b9050919050565b6000616a5d82615618565b616a678185615225565b9350616a778185602086016144c8565b80840191505092915050565b6000616a8f8284616a52565b915081905092915050565b600060a082019050616aaf600083018861497a565b616abc602083018761497a565b616ac9604083018661497a565b616ad66060830185614136565b616ae360808301846150aa565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212208093c6fc175f4fddd09f2dd4827965a7f0db1bffd10dc3a6661aff42a249f29164736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106102555760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf14610a13578063eb9019d414610a3c578063ece40cc114610a79578063f23a6e6114610aa2578063f8ce560a14610adf578063fc0c546a14610b1c5761029b565b8063c28bc2fa1461092c578063c59057e414610955578063d33219b414610992578063dd4e2ba5146109bd578063deaaa7cc146109e85761029b565b8063a890c910116100fd578063a890c91014610821578063ab58fb8e1461084a578063b58131b014610887578063bc197c81146108b2578063c01f9e37146108ef5761029b565b80637b3c71d3146107145780637d5e81e21461075157806397c3d3341461078e5780639a802a6d146107b9578063a7713a70146107f65761029b565b80633932abb1116101d257806354fd4d501161019657806354fd4d50146105cc57806356781388146105f75780635f398a141461063457806360c4247f1461067157806369e0e346146106ae57806370b0f660146106eb5761029b565b80633932abb1146104ab5780633bccf4fd146104d65780633e4f49e6146105135780634385963214610550578063544ffc9c1461058d5761029b565b8063150b7a0211610219578063150b7a0214610399578063160cbed7146103d65780632656227d146104135780632d63f693146104435780632fe3e261146104805761029b565b806301ffc9a7146102a057806302a251a3146102dd578063034201811461030857806306f3f9e61461034557806306fdde031461036e5761029b565b3661029b573073ffffffffffffffffffffffffffffffffffffffff16610279610b47565b73ffffffffffffffffffffffffffffffffffffffff161461029957600080fd5b005b600080fd5b3480156102ac57600080fd5b506102c760048036038101906102c291906140c9565b610b56565b6040516102d49190614111565b60405180910390f35b3480156102e957600080fd5b506102f2610b68565b6040516102ff9190614145565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906143a1565b610b77565b60405161033c9190614145565b60405180910390f35b34801561035157600080fd5b5061036c6004803603810190610367919061447f565b610c5c565b005b34801561037a57600080fd5b50610383610d53565b604051610390919061452b565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb91906145ab565b610de5565b6040516103cd919061463d565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f891906148bf565b610df9565b60405161040a9190614145565b60405180910390f35b61042d600480360381019061042891906148bf565b6110b3565b60405161043a9190614145565b60405180910390f35b34801561044f57600080fd5b5061046a6004803603810190610465919061447f565b611200565b6040516104779190614145565b60405180910390f35b34801561048c57600080fd5b5061049561126e565b6040516104a29190614989565b60405180910390f35b3480156104b757600080fd5b506104c0611292565b6040516104cd9190614145565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f891906149a4565b6112a1565b60405161050a9190614145565b60405180910390f35b34801561051f57600080fd5b5061053a6004803603810190610535919061447f565b61132b565b6040516105479190614a96565b60405180910390f35b34801561055c57600080fd5b5061057760048036038101906105729190614ab1565b61133d565b6040516105849190614111565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af919061447f565b6113a8565b6040516105c393929190614af1565b60405180910390f35b3480156105d857600080fd5b506105e16113e0565b6040516105ee919061452b565b60405180910390f35b34801561060357600080fd5b5061061e60048036038101906106199190614b28565b61141d565b60405161062b9190614145565b60405180910390f35b34801561064057600080fd5b5061065b60048036038101906106569190614b68565b61144e565b6040516106689190614145565b60405180910390f35b34801561067d57600080fd5b506106986004803603810190610693919061447f565b6114b8565b6040516106a59190614145565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d09190614c0c565b611604565b6040516106e29190614111565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d919061447f565b611624565b005b34801561072057600080fd5b5061073b60048036038101906107369190614c39565b61171b565b6040516107489190614145565b60405180910390f35b34801561075d57600080fd5b5061077860048036038101906107739190614d4e565b611783565b6040516107859190614145565b60405180910390f35b34801561079a57600080fd5b506107a361179b565b6040516107b09190614145565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db9190614e25565b6117a4565b6040516107ed9190614145565b60405180910390f35b34801561080257600080fd5b5061080b6117ba565b6040516108189190614145565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190614ee4565b6117e3565b005b34801561085657600080fd5b50610871600480360381019061086c919061447f565b6118da565b60405161087e9190614145565b60405180910390f35b34801561089357600080fd5b5061089c6119a7565b6040516108a99190614145565b60405180910390f35b3480156108be57600080fd5b506108d960048036038101906108d49190614f11565b6119b6565b6040516108e6919061463d565b60405180910390f35b3480156108fb57600080fd5b506109166004803603810190610911919061447f565b6119cb565b6040516109239190614145565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e9190615036565b611a39565b005b34801561096157600080fd5b5061097c600480360381019061097791906148bf565b611b7a565b6040516109899190614145565b60405180910390f35b34801561099e57600080fd5b506109a7611bb6565b6040516109b491906150b9565b60405180910390f35b3480156109c957600080fd5b506109d2611be0565b6040516109df919061452b565b60405180910390f35b3480156109f457600080fd5b506109fd611c1d565b604051610a0a9190614989565b60405180910390f35b348015610a1f57600080fd5b50610a3a6004803603810190610a35919061447f565b611c41565b005b348015610a4857600080fd5b50610a636004803603810190610a5e91906150d4565b611d38565b604051610a709190614145565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b919061447f565b611d54565b005b348015610aae57600080fd5b50610ac96004803603810190610ac49190615114565b611e4b565b604051610ad6919061463d565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b01919061447f565b611e60565b604051610b139190614145565b60405180910390f35b348015610b2857600080fd5b50610b31611e72565b604051610b3e919061520a565b60405180910390f35b6000610b516121f1565b905090565b6000610b618261221b565b9050919050565b6000610b72612295565b905090565b600080610bfa610bf27fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610bb3929190615255565b60405180910390208b80519060200120604051602001610bd795949392919061527d565b6040516020818303038152906040528051906020012061229f565b8686866122b9565b9050610c4d8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a6122e4565b91505098975050505050505050565b610c64610b47565b73ffffffffffffffffffffffffffffffffffffffff16610c826124a0565b73ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf9061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16610cf7610b47565b73ffffffffffffffffffffffffffffffffffffffff1614610d47576000610d1c6124a8565b604051610d2a929190615255565b604051809103902090505b80610d4060026124b5565b03610d3557505b610d5081612591565b50565b606060008054610d629061536b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8e9061536b565b8015610ddb5780601f10610db057610100808354040283529160200191610ddb565b820191906000526020600020905b815481529060010190602001808311610dbe57829003601f168201915b5050505050905090565b600063150b7a0260e01b9050949350505050565b600080610e0886868686611b7a565b905060046007811115610e1e57610e1d614a1f565b5b610e278261132b565b6007811115610e3957610e38614a1f565b5b14610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e709061540e565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190615443565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401610f7295949392919061574b565b602060405180830381865afa158015610f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb391906157c8565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611030969594939291906157f5565b600060405180830381600087803b15801561104a57600080fd5b505af115801561105e573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611090919061589a565b60405161109e9291906158ce565b60405180910390a18192505050949350505050565b6000806110c286868686611b7a565b905060006110cf8261132b565b9050600460078111156110e5576110e4614a1f565b5b8160078111156110f8576110f7614a1f565b5b148061112857506005600781111561111357611112614a1f565b5b81600781111561112657611125614a1f565b5b145b611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e9061540e565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516111c49190614145565b60405180910390a16111d98288888888612745565b6111e68288888888612828565b6111f3828888888861283c565b8192505050949350505050565b600061125d600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b600061129c6128a5565b905090565b6000806113026112fa7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f89896040516020016112df939291906158f7565b6040516020818303038152906040528051906020012061229f565b8686866122b9565b905061131f878288604051806020016040528060008152506128af565b91505095945050505050565b6000611336826128cf565b9050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806114286124a0565b9050611445848285604051806020016040528060008152506128af565b91505092915050565b6000806114596124a0565b90506114ac87828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876122e4565b91505095945050505050565b6000806009600001805490509050600081036114d9576008549150506115ff565b600060096000016001836114ed919061592e565b815481106114fe576114fd615962565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff16116115e65780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506115ff565b6115fa846009612aa290919063ffffffff16565b925050505b919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b61162c610b47565b73ffffffffffffffffffffffffffffffffffffffff1661164a6124a0565b73ffffffffffffffffffffffffffffffffffffffff16146116a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116979061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166116bf610b47565b73ffffffffffffffffffffffffffffffffffffffff161461170f5760006116e46124a8565b6040516116f2929190615255565b604051809103902090505b8061170860026124b5565b036116fd57505b61171881612bfa565b50565b6000806117266124a0565b905061177886828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128af565b915050949350505050565b600061179185858585612c3f565b9050949350505050565b60006064905090565b60006117b1848484612f46565b90509392505050565b600080600960000180549050146117da576117d56009612103565b6117de565b6008545b905090565b6117eb610b47565b73ffffffffffffffffffffffffffffffffffffffff166118096124a0565b73ffffffffffffffffffffffffffffffffffffffff161461185f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118569061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661187e610b47565b73ffffffffffffffffffffffffffffffffffffffff16146118ce5760006118a36124a8565b6040516118b1929190615255565b604051809103902090505b806118c760026124b5565b036118bc57505b6118d781612fed565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b815260040161194b9190614989565b602060405180830381865afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190615443565b90506001811461199c578061199f565b60005b915050919050565b60006119b161308c565b905090565b600063bc197c8160e01b905095945050505050565b6000611a28600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff169050919050565b611a41610b47565b73ffffffffffffffffffffffffffffffffffffffff16611a5f6124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac9061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611ad4610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611b24576000611af96124a8565b604051611b07929190615255565b604051809103902090505b80611b1d60026124b5565b03611b1257505b611b738483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085613096565b5050505050565b600084848484604051602001611b939493929190615991565b6040516020818303038152906040528051906020012060001c9050949350505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b611c49610b47565b73ffffffffffffffffffffffffffffffffffffffff16611c676124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb49061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611cdc610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576000611d016124a8565b604051611d0f929190615255565b604051809103902090505b80611d2560026124b5565b03611d1a57505b611d35816130c5565b50565b6000611d4c8383611d4761314d565b612f46565b905092915050565b611d5c610b47565b73ffffffffffffffffffffffffffffffffffffffff16611d7a6124a0565b73ffffffffffffffffffffffffffffffffffffffff1614611dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc79061531c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611def610b47565b73ffffffffffffffffffffffffffffffffffffffff1614611e3f576000611e146124a8565b604051611e22929190615255565b604051809103902090505b80611e3860026124b5565b03611e2d57505b611e4881613164565b50565b600063f23a6e6160e01b905095945050505050565b6000611e6b826131a9565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef090615a5d565b60405180910390fd5b819050919050565b6000806000846000018054905090506000611f1b86612103565b9050600082118015611f7157504386600001600184611f3a919061592e565b81548110611f4b57611f4a615962565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1561200157611f7f85611e96565b86600001600184611f90919061592e565b81548110611fa157611fa0615962565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506120f4565b8560000160405180604001604052806120194361219e565b63ffffffff16815260200161202d88611e96565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b60008082600001805490509050600081146121755782600001600182612129919061592e565b8154811061213a57612139615962565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612178565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090615aef565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061228e575061228d82613271565b5b9050919050565b6000600554905090565b60006122b26122ac6133d6565b836134f0565b9050919050565b60008060006122ca87878787613523565b915091506122d78161362f565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156123105761230f614a1f565b5b6123198861132b565b600781111561232b5761232a614a1f565b5b1461236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290615b81565b60405180910390fd5b60006123ca876123ba846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050612897565b67ffffffffffffffff1686612f46565b90506123d988888884886137fb565b600084510361243b578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48988848960405161242e9493929190615ba1565b60405180910390a2612492565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612489959493929190615c37565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b60006124c0826139ff565b156124f7576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b61259961179b565b8111156125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290615d30565b60405180910390fd5b60006125e56117ba565b90506000811415801561260057506000600960000180549050145b156126f25760096000016040518060400160405280600063ffffffff16815260200161262b84611e96565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b612706826009611f0190919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516127399291906158ce565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16612764610b47565b73ffffffffffffffffffffffffffffffffffffffff16146128215760005b845181101561281f573073ffffffffffffffffffffffffffffffffffffffff168582815181106127b5576127b4615962565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361280e5761280d8382815181106127ee576127ed615962565b5b6020026020010151805190602001206002613a3490919063ffffffff16565b5b8061281890615d50565b9050612782565b505b5050505050565b6128358585858585613ab0565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661285b610b47565b73ffffffffffffffffffffffffffffffffffffffff16146128905761288060026139ff565b61288f5761288e6002613b4e565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006128c5858585856128c061314d565b6122e4565b9050949350505050565b6000806128db83613bcf565b9050600460078111156128f1576128f0614a1f565b5b81600781111561290457612903614a1f565b5b146129125780915050612a9d565b6000600b60008581526020019081526020016000205490506000801b810361293e578192505050612a9d565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016129999190614989565b602060405180830381865afa1580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190615dc4565b156129ea57600792505050612a9d565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b8152600401612a459190614989565b602060405180830381865afa158015612a62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a869190615dc4565b15612a9657600592505050612a9d565b6002925050505b919050565b6000438210612ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612add90615e3d565b60405180910390fd5b60008360000180549050905060005b81811015612b6a576000612b098284613ce3565b905084866000018281548110612b2257612b21615962565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115612b5457809250612b64565b600181612b61919061589a565b91505b50612af5565b60008214612bcf5784600001600183612b83919061592e565b81548110612b9457612b93615962565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612bd2565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051612c2d9291906158ce565b60405180910390a18060048190555050565b6000612c496119a7565b612c66612c546124a0565b600143612c61919061592e565b611d38565b1015612ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9e90615ecf565b60405180910390fd5b6000612cbc8686868680519060200120611b7a565b90508451865114612d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf990615f61565b60405180910390fd5b8351865114612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d90615f61565b60405180910390fd5b6000865111612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8190615fcd565b60405180910390fd5b6000600160008381526020019081526020016000209050612dea816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613d09565b612e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e209061605f565b60405180910390fd5b6000612e3b612e36611292565b613d23565b612e4443613d23565b612e4e9190616093565b90506000612e62612e5d610b68565b613d23565b82612e6d9190616093565b9050612e858284600001613d7a90919063ffffffff16565b612e9b8184600101613d7a90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084612ec56124a0565b8b8b8d5167ffffffffffffffff811115612ee257612ee1614240565b5b604051908082528060200260200182016040528015612f1557816020015b6060815260200190600190039081612f005790505b508c88888e604051612f2f9998979695949392919061620c565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401612fa39291906162bc565b602060405180830381865afa158015612fc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe49190615443565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516130409291906162e5565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606130bc848484604051806060016040528060298152602001616aee60299139613da9565b90509392505050565b60008111613108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff90616380565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405161313b9291906158ce565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516131979291906158ce565b60405180910390a18060068190555050565b60006131b361179b565b6131bc836114b8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016132159190614145565b602060405180830381865afa158015613232573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132569190615443565b61326091906163a0565b61326a9190616411565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061335757507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133bf57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133cf57506133ce82613ebd565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561345257507f000000000000000000000000000000000000000000000000000000000000000046145b1561347f577f000000000000000000000000000000000000000000000000000000000000000090506134ed565b6134ea7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613f27565b90505b90565b600082826040516020016135059291906164ba565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561355e576000600391509150613626565b601b8560ff16141580156135765750601c8560ff1614155b15613588576000600491509150613626565b6000600187878787604051600081526020016040526040516135ad94939291906164f1565b6020604051602081039080840390855afa1580156135cf573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361361d57600060019250925050613626565b80600092509250505b94509492505050565b6000600481111561364357613642614a1f565b5b81600481111561365657613655614a1f565b5b03156137f857600160048111156136705761366f614a1f565b5b81600481111561368357613682614a1f565b5b036136c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ba90616582565b60405180910390fd5b600260048111156136d7576136d6614a1f565b5b8160048111156136ea576136e9614a1f565b5b0361372a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613721906165ee565b60405180910390fd5b6003600481111561373e5761373d614a1f565b5b81600481111561375157613750614a1f565b5b03613791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378890616680565b60405180910390fd5b6004808111156137a4576137a3614a1f565b5b8160048111156137b7576137b6614a1f565b5b036137f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ee90616712565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156138a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613898906167a4565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561390f5761390e614a1f565b5b60ff168460ff160361393b578281600001600082825461392f919061589a565b925050819055506139f7565b6001600281111561394f5761394e614a1f565b5b60ff168460ff160361397b578281600101600082825461396f919061589a565b925050819055506139f6565b60028081111561398e5761398d614a1f565b5b60ff168460ff16036139ba57828160020160008282546139ae919061589a565b925050819055506139f5565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ec90616836565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401613b1595949392919061574b565b6000604051808303818588803b158015613b2e57600080fd5b505af1158015613b42573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615613c08576007915050613cde565b8060020160019054906101000a900460ff1615613c29576002915050613cde565b6000613c3484611200565b905060008103613c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c70906168a2565b60405180910390fd5b438110613c8b57600092505050613cde565b6000613c96856119cb565b9050438110613cab5760019350505050613cde565b613cb485613f61565b8015613cc55750613cc485613fa8565b5b15613cd65760049350505050613cde565b600393505050505b919050565b60006002828418613cf49190616411565b828416613d01919061589a565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115613d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d6990616934565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015613dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613de5906169c6565b60405180910390fd5b613df785613fd3565b613e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e2d90616a32565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613e5f9190616a83565b60006040518083038185875af1925050503d8060008114613e9c576040519150601f19603f3d011682016040523d82523d6000602084013e613ea1565b606091505b5091509150613eb1828286613ff6565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001613f42959493929190616a9a565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154613f8d919061589a565b613f9e613f9985611200565b611e60565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561400657829050614056565b6000835111156140195782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404d919061452b565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6140a681614071565b81146140b157600080fd5b50565b6000813590506140c38161409d565b92915050565b6000602082840312156140df576140de614067565b5b60006140ed848285016140b4565b91505092915050565b60008115159050919050565b61410b816140f6565b82525050565b60006020820190506141266000830184614102565b92915050565b6000819050919050565b61413f8161412c565b82525050565b600060208201905061415a6000830184614136565b92915050565b6141698161412c565b811461417457600080fd5b50565b60008135905061418681614160565b92915050565b600060ff82169050919050565b6141a28161418c565b81146141ad57600080fd5b50565b6000813590506141bf81614199565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126141ea576141e96141c5565b5b8235905067ffffffffffffffff811115614207576142066141ca565b5b602083019150836001820283011115614223576142226141cf565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142788261422f565b810181811067ffffffffffffffff8211171561429757614296614240565b5b80604052505050565b60006142aa61405d565b90506142b6828261426f565b919050565b600067ffffffffffffffff8211156142d6576142d5614240565b5b6142df8261422f565b9050602081019050919050565b82818337600083830152505050565b600061430e614309846142bb565b6142a0565b90508281526020810184848401111561432a5761432961422a565b5b6143358482856142ec565b509392505050565b600082601f830112614352576143516141c5565b5b81356143628482602086016142fb565b91505092915050565b6000819050919050565b61437e8161436b565b811461438957600080fd5b50565b60008135905061439b81614375565b92915050565b60008060008060008060008060e0898b0312156143c1576143c0614067565b5b60006143cf8b828c01614177565b98505060206143e08b828c016141b0565b975050604089013567ffffffffffffffff8111156144015761440061406c565b5b61440d8b828c016141d4565b9650965050606089013567ffffffffffffffff8111156144305761442f61406c565b5b61443c8b828c0161433d565b945050608061444d8b828c016141b0565b93505060a061445e8b828c0161438c565b92505060c061446f8b828c0161438c565b9150509295985092959890939650565b60006020828403121561449557614494614067565b5b60006144a384828501614177565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156144e65780820151818401526020810190506144cb565b60008484015250505050565b60006144fd826144ac565b61450781856144b7565b93506145178185602086016144c8565b6145208161422f565b840191505092915050565b6000602082019050818103600083015261454581846144f2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145788261454d565b9050919050565b6145888161456d565b811461459357600080fd5b50565b6000813590506145a58161457f565b92915050565b600080600080608085870312156145c5576145c4614067565b5b60006145d387828801614596565b94505060206145e487828801614596565b93505060406145f587828801614177565b925050606085013567ffffffffffffffff8111156146165761461561406c565b5b6146228782880161433d565b91505092959194509250565b61463781614071565b82525050565b6000602082019050614652600083018461462e565b92915050565b600067ffffffffffffffff82111561467357614672614240565b5b602082029050602081019050919050565b600061469761469284614658565b6142a0565b905080838252602082019050602084028301858111156146ba576146b96141cf565b5b835b818110156146e357806146cf8882614596565b8452602084019350506020810190506146bc565b5050509392505050565b600082601f830112614702576147016141c5565b5b8135614712848260208601614684565b91505092915050565b600067ffffffffffffffff82111561473657614735614240565b5b602082029050602081019050919050565b600061475a6147558461471b565b6142a0565b9050808382526020820190506020840283018581111561477d5761477c6141cf565b5b835b818110156147a657806147928882614177565b84526020840193505060208101905061477f565b5050509392505050565b600082601f8301126147c5576147c46141c5565b5b81356147d5848260208601614747565b91505092915050565b600067ffffffffffffffff8211156147f9576147f8614240565b5b602082029050602081019050919050565b600061481d614818846147de565b6142a0565b905080838252602082019050602084028301858111156148405761483f6141cf565b5b835b8181101561488757803567ffffffffffffffff811115614865576148646141c5565b5b808601614872898261433d565b85526020850194505050602081019050614842565b5050509392505050565b600082601f8301126148a6576148a56141c5565b5b81356148b684826020860161480a565b91505092915050565b600080600080608085870312156148d9576148d8614067565b5b600085013567ffffffffffffffff8111156148f7576148f661406c565b5b614903878288016146ed565b945050602085013567ffffffffffffffff8111156149245761492361406c565b5b614930878288016147b0565b935050604085013567ffffffffffffffff8111156149515761495061406c565b5b61495d87828801614891565b925050606061496e8782880161438c565b91505092959194509250565b6149838161436b565b82525050565b600060208201905061499e600083018461497a565b92915050565b600080600080600060a086880312156149c0576149bf614067565b5b60006149ce88828901614177565b95505060206149df888289016141b0565b94505060406149f0888289016141b0565b9350506060614a018882890161438c565b9250506080614a128882890161438c565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110614a5f57614a5e614a1f565b5b50565b6000819050614a7082614a4e565b919050565b6000614a8082614a62565b9050919050565b614a9081614a75565b82525050565b6000602082019050614aab6000830184614a87565b92915050565b60008060408385031215614ac857614ac7614067565b5b6000614ad685828601614177565b9250506020614ae785828601614596565b9150509250929050565b6000606082019050614b066000830186614136565b614b136020830185614136565b614b206040830184614136565b949350505050565b60008060408385031215614b3f57614b3e614067565b5b6000614b4d85828601614177565b9250506020614b5e858286016141b0565b9150509250929050565b600080600080600060808688031215614b8457614b83614067565b5b6000614b9288828901614177565b9550506020614ba3888289016141b0565b945050604086013567ffffffffffffffff811115614bc457614bc361406c565b5b614bd0888289016141d4565b9350935050606086013567ffffffffffffffff811115614bf357614bf261406c565b5b614bff8882890161433d565b9150509295509295909350565b600060208284031215614c2257614c21614067565b5b6000614c3084828501614596565b91505092915050565b60008060008060608587031215614c5357614c52614067565b5b6000614c6187828801614177565b9450506020614c72878288016141b0565b935050604085013567ffffffffffffffff811115614c9357614c9261406c565b5b614c9f878288016141d4565b925092505092959194509250565b600067ffffffffffffffff821115614cc857614cc7614240565b5b614cd18261422f565b9050602081019050919050565b6000614cf1614cec84614cad565b6142a0565b905082815260208101848484011115614d0d57614d0c61422a565b5b614d188482856142ec565b509392505050565b600082601f830112614d3557614d346141c5565b5b8135614d45848260208601614cde565b91505092915050565b60008060008060808587031215614d6857614d67614067565b5b600085013567ffffffffffffffff811115614d8657614d8561406c565b5b614d92878288016146ed565b945050602085013567ffffffffffffffff811115614db357614db261406c565b5b614dbf878288016147b0565b935050604085013567ffffffffffffffff811115614de057614ddf61406c565b5b614dec87828801614891565b925050606085013567ffffffffffffffff811115614e0d57614e0c61406c565b5b614e1987828801614d20565b91505092959194509250565b600080600060608486031215614e3e57614e3d614067565b5b6000614e4c86828701614596565b9350506020614e5d86828701614177565b925050604084013567ffffffffffffffff811115614e7e57614e7d61406c565b5b614e8a8682870161433d565b9150509250925092565b6000614e9f8261454d565b9050919050565b6000614eb182614e94565b9050919050565b614ec181614ea6565b8114614ecc57600080fd5b50565b600081359050614ede81614eb8565b92915050565b600060208284031215614efa57614ef9614067565b5b6000614f0884828501614ecf565b91505092915050565b600080600080600060a08688031215614f2d57614f2c614067565b5b6000614f3b88828901614596565b9550506020614f4c88828901614596565b945050604086013567ffffffffffffffff811115614f6d57614f6c61406c565b5b614f79888289016147b0565b935050606086013567ffffffffffffffff811115614f9a57614f9961406c565b5b614fa6888289016147b0565b925050608086013567ffffffffffffffff811115614fc757614fc661406c565b5b614fd38882890161433d565b9150509295509295909350565b60008083601f840112614ff657614ff56141c5565b5b8235905067ffffffffffffffff811115615013576150126141ca565b5b60208301915083600182028301111561502f5761502e6141cf565b5b9250929050565b600080600080606085870312156150505761504f614067565b5b600061505e87828801614596565b945050602061506f87828801614177565b935050604085013567ffffffffffffffff8111156150905761508f61406c565b5b61509c87828801614fe0565b925092505092959194509250565b6150b38161456d565b82525050565b60006020820190506150ce60008301846150aa565b92915050565b600080604083850312156150eb576150ea614067565b5b60006150f985828601614596565b925050602061510a85828601614177565b9150509250929050565b600080600080600060a086880312156151305761512f614067565b5b600061513e88828901614596565b955050602061514f88828901614596565b945050604061516088828901614177565b935050606061517188828901614177565b925050608086013567ffffffffffffffff8111156151925761519161406c565b5b61519e8882890161433d565b9150509295509295909350565b6000819050919050565b60006151d06151cb6151c68461454d565b6151ab565b61454d565b9050919050565b60006151e2826151b5565b9050919050565b60006151f4826151d7565b9050919050565b615204816151e9565b82525050565b600060208201905061521f60008301846151fb565b92915050565b600081905092915050565b600061523c8385615225565b93506152498385846142ec565b82840190509392505050565b6000615262828486615230565b91508190509392505050565b6152778161418c565b82525050565b600060a082019050615292600083018861497a565b61529f6020830187614136565b6152ac604083018661526e565b6152b9606083018561497a565b6152c6608083018461497a565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b60006153066018836144b7565b9150615311826152d0565b602082019050919050565b60006020820190508181036000830152615335816152f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061538357607f821691505b6020821081036153965761539561533c565b5b50919050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006153f86021836144b7565b91506154038261539c565b604082019050919050565b60006020820190508181036000830152615427816153eb565b9050919050565b60008151905061543d81614160565b92915050565b60006020828403121561545957615458614067565b5b60006154678482850161542e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154a58161456d565b82525050565b60006154b7838361549c565b60208301905092915050565b6000602082019050919050565b60006154db82615470565b6154e5818561547b565b93506154f08361548c565b8060005b8381101561552157815161550888826154ab565b9750615513836154c3565b9250506001810190506154f4565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6155638161412c565b82525050565b6000615575838361555a565b60208301905092915050565b6000602082019050919050565b60006155998261552e565b6155a38185615539565b93506155ae8361554a565b8060005b838110156155df5781516155c68882615569565b97506155d183615581565b9250506001810190506155b2565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b600061563f82615618565b6156498185615623565b93506156598185602086016144c8565b6156628161422f565b840191505092915050565b60006156798383615634565b905092915050565b6000602082019050919050565b6000615699826155ec565b6156a381856155f7565b9350836020820285016156b585615608565b8060005b858110156156f157848403895281516156d2858261566d565b94506156dd83615681565b925060208a019950506001810190506156b9565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061573561573061572b84615703565b61570d565b61436b565b9050919050565b6157458161571a565b82525050565b600060a082019050818103600083015261576581886154d0565b90508181036020830152615779818761558e565b9050818103604083015261578d818661568e565b905061579c606083018561573c565b6157a9608083018461497a565b9695505050505050565b6000815190506157c281614375565b92915050565b6000602082840312156157de576157dd614067565b5b60006157ec848285016157b3565b91505092915050565b600060c082019050818103600083015261580f81896154d0565b90508181036020830152615823818861558e565b90508181036040830152615837818761568e565b9050615846606083018661573c565b615853608083018561497a565b61586060a0830184614136565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006158a58261412c565b91506158b08361412c565b92508282019050808211156158c8576158c761586b565b5b92915050565b60006040820190506158e36000830185614136565b6158f06020830184614136565b9392505050565b600060608201905061590c600083018661497a565b6159196020830185614136565b615926604083018461526e565b949350505050565b60006159398261412c565b91506159448361412c565b925082820390508181111561595c5761595b61586b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201905081810360008301526159ab81876154d0565b905081810360208301526159bf818661558e565b905081810360408301526159d3818561568e565b90506159e2606083018461497a565b95945050505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000615a476027836144b7565b9150615a52826159eb565b604082019050919050565b60006020820190508181036000830152615a7681615a3a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615ad96026836144b7565b9150615ae482615a7d565b604082019050919050565b60006020820190508181036000830152615b0881615acc565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000615b6b6023836144b7565b9150615b7682615b0f565b604082019050919050565b60006020820190508181036000830152615b9a81615b5e565b9050919050565b6000608082019050615bb66000830187614136565b615bc3602083018661526e565b615bd06040830185614136565b8181036060830152615be281846144f2565b905095945050505050565b600082825260208201905092915050565b6000615c0982615618565b615c138185615bed565b9350615c238185602086016144c8565b615c2c8161422f565b840191505092915050565b600060a082019050615c4c6000830188614136565b615c59602083018761526e565b615c666040830186614136565b8181036060830152615c7881856144f2565b90508181036080830152615c8c8184615bfe565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000615d1a6043836144b7565b9150615d2582615c98565b606082019050919050565b60006020820190508181036000830152615d4981615d0d565b9050919050565b6000615d5b8261412c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615d8d57615d8c61586b565b5b600182019050919050565b615da1816140f6565b8114615dac57600080fd5b50565b600081519050615dbe81615d98565b92915050565b600060208284031215615dda57615dd9614067565b5b6000615de884828501615daf565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000615e276020836144b7565b9150615e3282615df1565b602082019050919050565b60006020820190508181036000830152615e5681615e1a565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000615eb96031836144b7565b9150615ec482615e5d565b604082019050919050565b60006020820190508181036000830152615ee881615eac565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000615f4b6021836144b7565b9150615f5682615eef565b604082019050919050565b60006020820190508181036000830152615f7a81615f3e565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000615fb76018836144b7565b9150615fc282615f81565b602082019050919050565b60006020820190508181036000830152615fe681615faa565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006160496021836144b7565b915061605482615fed565b604082019050919050565b600060208201905081810360008301526160788161603c565b9050919050565b600067ffffffffffffffff82169050919050565b600061609e8261607f565b91506160a98361607f565b9250828201905067ffffffffffffffff8111156160c9576160c861586b565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000616117826144ac565b61612181856160fb565b93506161318185602086016144c8565b61613a8161422f565b840191505092915050565b6000616151838361610c565b905092915050565b6000602082019050919050565b6000616171826160cf565b61617b81856160da565b93508360208202850161618d856160eb565b8060005b858110156161c957848403895281516161aa8582616145565b94506161b583616159565b925060208a01995050600181019050616191565b50829750879550505050505092915050565b60006161f66161f16161ec8461607f565b6151ab565b61412c565b9050919050565b616206816161db565b82525050565b600061012082019050616222600083018c614136565b61622f602083018b6150aa565b8181036040830152616241818a6154d0565b90508181036060830152616255818961558e565b905081810360808301526162698188616166565b905081810360a083015261627d818761568e565b905061628c60c08301866161fd565b61629960e08301856161fd565b8181036101008301526162ac81846144f2565b90509a9950505050505050505050565b60006040820190506162d160008301856150aa565b6162de6020830184614136565b9392505050565b60006040820190506162fa60008301856150aa565b61630760208301846150aa565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b600061636a6027836144b7565b91506163758261630e565b604082019050919050565b600060208201905081810360008301526163998161635d565b9050919050565b60006163ab8261412c565b91506163b68361412c565b92508282026163c48161412c565b915082820484148315176163db576163da61586b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061641c8261412c565b91506164278361412c565b925082616437576164366163e2565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000616483600283616442565b915061648e8261644d565b600282019050919050565b6000819050919050565b6164b46164af8261436b565b616499565b82525050565b60006164c582616476565b91506164d182856164a3565b6020820191506164e182846164a3565b6020820191508190509392505050565b6000608082019050616506600083018761497a565b616513602083018661526e565b616520604083018561497a565b61652d606083018461497a565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b600061656c6018836144b7565b915061657782616536565b602082019050919050565b6000602082019050818103600083015261659b8161655f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006165d8601f836144b7565b91506165e3826165a2565b602082019050919050565b60006020820190508181036000830152616607816165cb565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061666a6022836144b7565b91506166758261660e565b604082019050919050565b600060208201905081810360008301526166998161665d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006166fc6022836144b7565b9150616707826166a0565b604082019050919050565b6000602082019050818103600083015261672b816166ef565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b600061678e6027836144b7565b915061679982616732565b604082019050919050565b600060208201905081810360008301526167bd81616781565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b60006168206035836144b7565b915061682b826167c4565b604082019050919050565b6000602082019050818103600083015261684f81616813565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b600061688c601d836144b7565b915061689782616856565b602082019050919050565b600060208201905081810360008301526168bb8161687f565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061691e6026836144b7565b9150616929826168c2565b604082019050919050565b6000602082019050818103600083015261694d81616911565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006169b06026836144b7565b91506169bb82616954565b604082019050919050565b600060208201905081810360008301526169df816169a3565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000616a1c601d836144b7565b9150616a27826169e6565b602082019050919050565b60006020820190508181036000830152616a4b81616a0f565b9050919050565b6000616a5d82615618565b616a678185615225565b9350616a778185602086016144c8565b80840191505092915050565b6000616a8f8284616a52565b915081905092915050565b600060a082019050616aaf600083018861497a565b616abc602083018761497a565b616ac9604083018661497a565b616ad66060830185614136565b616ae360808301846150aa565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212208093c6fc175f4fddd09f2dd4827965a7f0db1bffd10dc3a6661aff42a249f29164736f6c63430008110033", + "solcInputHash": "f3989c9674956bada0a1ffc4cf72c075", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enteranceFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_daoPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotEnoughPayment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"FundProject__TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__UpkeepNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__WithdrawTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__withdrawFund\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NotApporovedByDaoFoundation\",\"type\":\"error\"},{\"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\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectFundingFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectSuccessfullyFunded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_ProjectFundingStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getBalanceOfProject\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"_getProjectStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isApporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_fundingGoalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_projectOwnerAddress\",\"type\":\"address\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEnteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"inWhiteList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"is_funding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paySubmitFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectToTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"withdrawFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"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.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/AutomationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract AutomationBase {\\n error OnlySimulatedBackend();\\n\\n /**\\n * @notice method that allows it to be simulated via eth_call by checking that\\n * the sender is the zero address.\\n */\\n function preventExecution() internal view {\\n if (tx.origin != address(0)) {\\n revert OnlySimulatedBackend();\\n }\\n }\\n\\n /**\\n * @notice modifier that allows it to be simulated via eth_call by checking\\n * that the sender is the zero address.\\n */\\n modifier cannotExecute() {\\n preventExecution();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x5d354afa1a97dffe66094397cdcbb0c14713cf3d609d88fd8f9891010e9a351a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AutomationBase.sol\\\";\\nimport \\\"./interfaces/AutomationCompatibleInterface.sol\\\";\\n\\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\\n\",\"keccak256\":\"0x40e5ae0eff4edd0740c1b5590d09c344f84dee031e82d5294563e99603774f80\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\\\";\\n\\ncontract FundProject is Ownable, AutomationCompatibleInterface {\\n error FundProject__NotApporovedByDao();\\n error FundProject__UpkeepNeeded();\\n error FundProject__TransferFailed(uint256 _projectId);\\n error FundProject__NotEnoughPayment();\\n error FundProject__withdrawFund();\\n error FundProject__WithdrawTransferFailed();\\n\\n enum ProjectFundingStatus {\\n ONPROGRESS,\\n SUCCESS,\\n FAILED,\\n CANCELED\\n }\\n\\n uint256 public projectId = 1;\\n\\n uint public lastTimeStamp;\\n uint256 public daoPercentage;\\n uint256 public enteranceFee;\\n address payable projectOwners;\\n\\n mapping(uint256 => bool) public _isFunding;\\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\\n mapping(uint256 => uint256) public time;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders;\\n mapping(uint256 => uint256) public projectFunds;\\n mapping(uint256 => uint256) public projectFundingGoalAmount;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n mapping(uint256 => address) public projectOwnerAddress;\\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\\n\\n event projectSuccessfullyFunded(uint256 indexed _projectId);\\n event projectFundingFailed(uint256 indexed _projectId);\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\\n lastTimeStamp = block.timestamp;\\n daoPercentage = _daoPercentage;\\n enteranceFee = _enteranceFee;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n projectFunds[_projecID] += msg.value;\\n }\\n\\n function apporoveFundingByDao(\\n string memory _ipfsHash,\\n uint256 _fundingGoalAmount,\\n uint256 _time,\\n address _projectOwnerAddress\\n ) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n projectToTime[projectId][_time] = block.timestamp;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\\n time[projectId] = _time;\\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n projectOwnerAddress[projectId] = _projectOwnerAddress;\\n _isApporovedByDao[projectId] = true;\\n _isFunding[projectId] = true;\\n projectId++;\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n _isApporovedByDao[_projecID] = false;\\n _isFunding[projectId] = false;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\\n }\\n\\n function checkUpkeep(\\n bytes memory /* checkData */\\n )\\n public\\n view\\n override\\n returns (\\n bool upkeepNeeded,\\n bytes memory /* performData */\\n )\\n {\\n upkeepNeeded = (_isFunding[projectId] &&\\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\\n projectToTime[projectId][time[projectId]]);\\n }\\n\\n function performUpkeep(\\n bytes calldata /* performData */\\n ) external override {\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\n if (!upkeepNeeded) {\\n revert FundProject__UpkeepNeeded();\\n }\\n _isFunding[projectId] = false;\\n _isApporovedByDao[projectId] = false;\\n\\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\\n 100;\\n (bool success, ) = (projectOwnerAddress[projectId]).call{\\n value: fundsToSent\\n }(\\\"\\\");\\n if (!success) {\\n revert FundProject__TransferFailed(projectFunds[projectId]);\\n }\\n\\n emit projectSuccessfullyFunded(projectId);\\n } else {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\\n emit projectFundingFailed(projectId);\\n }\\n }\\n\\n function paySubmitFee() public payable {\\n if (msg.value > enteranceFee) {\\n projectOwners = payable(msg.sender);\\n } else {\\n revert FundProject__NotEnoughPayment();\\n }\\n }\\n\\n function withdrawFund(uint256 _projectID) public {\\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\\n uint256 fundToSent = funders[_projectID][msg.sender];\\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\\n \\\"\\\"\\n );\\n if (!success) {\\n revert FundProject__WithdrawTransferFailed();\\n }\\n } else {\\n revert FundProject__withdrawFund();\\n }\\n }\\n\\n function _isApporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n\\n function _getBalanceOfProject(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFunds[_projecID];\\n }\\n\\n function _getFundingGoalAmount(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFundingGoalAmount[_projecID];\\n }\\n\\n function is_funding(uint256 _projectID) public view returns (bool) {\\n return _isFunding[_projectID];\\n }\\n\\n function _getProjectStatus(uint256 _projectID)\\n public\\n view\\n returns (ProjectFundingStatus)\\n {\\n return _ProjectFundingStatus[_projectID];\\n }\\n\\n function getEnteranceFee() public view returns (uint256) {\\n return enteranceFee;\\n }\\n}\\n\",\"keccak256\":\"0x88f61ecad2c488affe55ae76435d6bebcfc383456f00ab7d05367d0a6e6ba98d\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\nimport \\\"./FundProject.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl,\\n FundProject\\n{\\n error GovernerContract__NotApporovedByDaoFoundation();\\n\\n mapping(address => bool) public inWhiteList;\\n\\n modifier isSubmitFeePaid() {\\n paySubmitFee();\\n _;\\n }\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage,\\n uint256 _enteranceFee,\\n uint256 _daoPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n FundProject(_enteranceFee, _daoPercentage)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) isSubmitFeePaid returns (uint256) {\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x543f86614fb6a4d4f4f3ad5ca725d1f89fa4fb76efc3922a95a70ae0b1e3b7d7\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101606040526001600d553480156200001757600080fd5b5060405162009d2f38038062009d2f83398181016040528101906200003d919062000bff565b818187858a898960006040518060400160405280601081526020017f476f7665726e6572436f6e747261637400000000000000000000000000000000815250806200008d6200022660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f68184846200026360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000150919062000f22565b505062000163836200029f60201b60201c565b6200017482620002e660201b60201c565b62000185816200037360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001cf81620003ba60201b60201c565b50620001e1816200059960201b60201c565b5062000202620001f66200063a60201b60201c565b6200064260201b60201c565b42600e8190555080600f81905550816010819055505050505050505050506200142d565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200028095949392919062001046565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051620002d4929190620010a3565b60405180910390a18060048190555050565b600081116200032c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003239062001157565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405162000361929190620010a3565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051620003a8929190620010a3565b60405180910390a18060068190555050565b620003ca6200070860201b60201c565b8111156200040f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004069062001215565b60405180910390fd5b6000620004216200071160201b60201c565b9050600081141580156200043d57506000600960000180549050145b156200053d5760096000016040518060400160405280600063ffffffff16815260200162000476846200074960201b620034751760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000558826009620007b760201b620034e01790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200058d929190620010a3565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ee92919062001237565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064905090565b6000806009600001805490501462000740576200073a6009620009f560201b620036e21760201c565b62000744565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a690620012da565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620007d986620009f560201b60201c565b90506000821180156200083557504386600001600184620007fb91906200132b565b815481106200080f576200080e62001366565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008d95762000851856200074960201b620034751760201c565b866000016001846200086491906200132b565b8154811062000878576200087762001366565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009e6565b856000016040518060400160405280620008fe4362000a9760201b6200377d1760201c565b63ffffffff1681526020016200091f886200074960201b620034751760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811462000a6e578260000160018262000a1e91906200132b565b8154811062000a325762000a3162001366565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000a71565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff801682111562000ae5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000adc906200140b565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b1f8262000af2565b9050919050565b600062000b338262000b12565b9050919050565b62000b458162000b26565b811462000b5157600080fd5b50565b60008151905062000b658162000b3a565b92915050565b600062000b788262000af2565b9050919050565b600062000b8c8262000b6b565b9050919050565b62000b9e8162000b7f565b811462000baa57600080fd5b50565b60008151905062000bbe8162000b93565b92915050565b6000819050919050565b62000bd98162000bc4565b811462000be557600080fd5b50565b60008151905062000bf98162000bce565b92915050565b600080600080600080600060e0888a03121562000c215762000c2062000aed565b5b600062000c318a828b0162000b54565b975050602062000c448a828b0162000bad565b965050604062000c578a828b0162000be8565b955050606062000c6a8a828b0162000be8565b945050608062000c7d8a828b0162000be8565b93505060a062000c908a828b0162000be8565b92505060c062000ca38a828b0162000be8565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d3457607f821691505b60208210810362000d4a5762000d4962000cec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000db47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d75565b62000dc0868362000d75565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000e0362000dfd62000df78462000bc4565b62000dd8565b62000bc4565b9050919050565b6000819050919050565b62000e1f8362000de2565b62000e3762000e2e8262000e0a565b84845462000d82565b825550505050565b600090565b62000e4e62000e3f565b62000e5b81848462000e14565b505050565b5b8181101562000e835762000e7760008262000e44565b60018101905062000e61565b5050565b601f82111562000ed25762000e9c8162000d50565b62000ea78462000d65565b8101602085101562000eb7578190505b62000ecf62000ec68562000d65565b83018262000e60565b50505b505050565b600082821c905092915050565b600062000ef76000198460080262000ed7565b1980831691505092915050565b600062000f12838362000ee4565b9150826002028217905092915050565b62000f2d8262000cb2565b67ffffffffffffffff81111562000f495762000f4862000cbd565b5b62000f55825462000d1b565b62000f6282828562000e87565b600060209050601f83116001811462000f9a576000841562000f85578287015190505b62000f91858262000f04565b86555062001001565b601f19841662000faa8662000d50565b60005b8281101562000fd45784890151825560018201915060208501945060208101905062000fad565b8683101562000ff4578489015162000ff0601f89168262000ee4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6200101e8162001009565b82525050565b6200102f8162000bc4565b82525050565b620010408162000b12565b82525050565b600060a0820190506200105d600083018862001013565b6200106c602083018762001013565b6200107b604083018662001013565b6200108a606083018562001024565b62001099608083018462001035565b9695505050505050565b6000604082019050620010ba600083018562001024565b620010c9602083018462001024565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200113f602783620010d0565b91506200114c82620010e1565b604082019050919050565b60006020820190508181036000830152620011728162001130565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620011fd604383620010d0565b91506200120a8262001179565b606082019050919050565b600060208201905081810360008301526200123081620011ee565b9050919050565b60006040820190506200124e600083018562001035565b6200125d602083018462001035565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620012c2602783620010d0565b9150620012cf8262001264565b604082019050919050565b60006020820190508181036000830152620012f581620012b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013388262000bc4565b9150620013458362000bc4565b925082820390508181111562001360576200135f620012fc565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620013f3602683620010d0565b9150620014008262001395565b604082019050919050565b600060208201905081810360008301526200142681620013e4565b9050919050565b60805160a05160c05160e05161010051610120516101405161889962001496600039600081816133cf0152818161466d01526148e101526000614ba701526000614be901526000614bc801526000614afd01526000614b5301526000614b7c01526188996000f3fe6080604052600436106104405760003560e01c8063794d556011610234578063bc197c811161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e61146112ee578063f2fde38b1461132b578063f8ce560a14611354578063fc0c546a14611391578063fea856a1146113bc57610486565b8063deaaa7cc146111f7578063e0c410cc14611222578063ea0217cf1461125f578063eb9019d414611288578063ece40cc1146112c557610486565b8063ca1d209d116100fd578063ca1d209d1461110b578063cf68625914611127578063d33219b414611164578063dc73204b1461118f578063dd4e2ba5146111cc57610486565b8063bc197c811461102b578063c01f9e3714611068578063c28bc2fa146110a5578063c59057e4146110ce57610486565b806396aa167e116101bc578063ab58fb8e11610180578063ab58fb8e14610f0c578063abe1aae614610f49578063b58131b014610f86578063b59d18a014610fb1578063bba9c21914610fee57610486565b806396aa167e14610e2557806397c3d33414610e505780639a802a6d14610e7b578063a7713a7014610eb8578063a890c91014610ee357610486565b8063868661cb11610203578063868661cb14610d2c57806387030f4d14610d575780638da5cb5b14610d805780638fb5548f14610dab578063902bfa2414610de857610486565b8063794d556014610c385780637b3c71d314610c755780637d5e81e214610cb2578063809b268e14610cef57610486565b80633f3b3b271161034557806356781388116102cd57806369e0e3461161029157806369e0e34614610b405780636e04ff0d14610b7d57806370084d7a14610bbb57806370b0f66014610bf8578063715018a614610c2157610486565b80635678138814610a0f5780635b6b465214610a4c5780635ced7d4014610a895780635f398a1414610ac657806360c4247f14610b0357610486565b80634585e33b116103145780634585e33b146109145780634fac2bb71461093d578063535bf50f1461097a578063544ffc9c146109a557806354fd4d50146109e457610486565b80633f3b3b27146108445780633fafa1271461086f578063438596321461089a578063446a156f146108d757610486565b8063156277be116103c85780632fe3e261116103975780632fe3e2611461074b5780633932abb1146107765780633bccf4fd146107a15780633be2f2a3146107de5780633e4f49e61461080757610486565b8063156277be14610664578063160cbed7146106a15780632656227d146106de5780632d63f6931461070e57610486565b806306fdde031161040f57806306fdde03146105595780630cee172514610584578063141a6c22146105ad578063148038b0146105ea578063150b7a021461062757610486565b806301ffc9a71461048b57806302a251a3146104c857806303420181146104f357806306f3f9e61461053057610486565b36610486573073ffffffffffffffffffffffffffffffffffffffff166104646113c6565b73ffffffffffffffffffffffffffffffffffffffff161461048457600080fd5b005b600080fd5b34801561049757600080fd5b506104b260048036038101906104ad91906157ec565b6113d5565b6040516104bf9190615834565b60405180910390f35b3480156104d457600080fd5b506104dd6113e7565b6040516104ea9190615868565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190615ac4565b6113f6565b6040516105279190615868565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190615ba2565b6114db565b005b34801561056557600080fd5b5061056e6115d2565b60405161057b9190615c4e565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615ba2565b611664565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615d11565b6117e4565b6040516105e19190615868565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190615db8565b61180c565b60405161061e9190615868565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190615df8565b611831565b60405161065b9190615e8a565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190615ba2565b611845565b6040516106989190615eb4565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190616136565b611878565b6040516106d59190615868565b60405180910390f35b6106f860048036038101906106f39190616136565b611b32565b6040516107059190615868565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190615ba2565b611c7f565b6040516107429190615868565b60405180910390f35b34801561075757600080fd5b50610760611ced565b60405161076d9190616200565b60405180910390f35b34801561078257600080fd5b5061078b611d11565b6040516107989190615868565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c3919061621b565b611d20565b6040516107d59190615868565b60405180910390f35b3480156107ea57600080fd5b5061080560048036038101906108009190616296565b611daa565b005b34801561081357600080fd5b5061082e60048036038101906108299190615ba2565b611f65565b60405161083b9190616390565b60405180910390f35b34801561085057600080fd5b50610859611f77565b6040516108669190615868565b60405180910390f35b34801561087b57600080fd5b50610884611f7d565b6040516108919190615868565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc9190615db8565b611f83565b6040516108ce9190615834565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190615ba2565b611fee565b60405161090b91906163f3565b60405180910390f35b34801561092057600080fd5b5061093b60048036038101906109369190616464565b612018565b005b34801561094957600080fd5b50610964600480360381019061095f9190615ba2565b61230c565b6040516109719190615834565b60405180910390f35b34801561098657600080fd5b5061098f61232c565b60405161099c9190615868565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190615ba2565b612336565b6040516109db939291906164b1565b60405180910390f35b3480156109f057600080fd5b506109f961236e565b604051610a069190615c4e565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a3191906164e8565b6123ab565b604051610a439190615868565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190615ba2565b6123dc565b604051610a809190615868565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190615ba2565b6123f4565b604051610abd9190615868565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190616528565b61240c565b604051610afa9190615868565b60405180910390f35b348015610b0f57600080fd5b50610b2a6004803603810190610b259190615ba2565b612476565b604051610b379190615868565b60405180910390f35b348015610b4c57600080fd5b50610b676004803603810190610b6291906165cc565b6125c2565b604051610b749190615834565b60405180910390f35b348015610b8957600080fd5b50610ba46004803603810190610b9f91906165f9565b6125e2565b604051610bb2929190616697565b60405180910390f35b348015610bc757600080fd5b50610be26004803603810190610bdd9190615ba2565b61269c565b604051610bef91906163f3565b60405180910390f35b348015610c0457600080fd5b50610c1f6004803603810190610c1a9190615ba2565b6126bc565b005b348015610c2d57600080fd5b50610c366127b3565b005b348015610c4457600080fd5b50610c5f6004803603810190610c5a9190615ba2565b6127c7565b604051610c6c9190615868565b60405180910390f35b348015610c8157600080fd5b50610c9c6004803603810190610c9791906166c7565b6127df565b604051610ca99190615868565b60405180910390f35b348015610cbe57600080fd5b50610cd96004803603810190610cd4919061673b565b612847565b604051610ce69190615868565b60405180910390f35b348015610cfb57600080fd5b50610d166004803603810190610d119190615ba2565b612867565b604051610d239190615834565b60405180910390f35b348015610d3857600080fd5b50610d41612891565b604051610d4e9190615868565b60405180910390f35b348015610d6357600080fd5b50610d7e6004803603810190610d799190615ba2565b612897565b005b348015610d8c57600080fd5b50610d9561293a565b604051610da29190615eb4565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd9190615ba2565b612964565b604051610ddf9190615c4e565b60405180910390f35b348015610df457600080fd5b50610e0f6004803603810190610e0a9190615ba2565b612a04565b604051610e1c9190615834565b60405180910390f35b348015610e3157600080fd5b50610e3a612a24565b604051610e479190615868565b60405180910390f35b348015610e5c57600080fd5b50610e65612a2a565b604051610e729190615868565b60405180910390f35b348015610e8757600080fd5b50610ea26004803603810190610e9d9190616812565b612a33565b604051610eaf9190615868565b60405180910390f35b348015610ec457600080fd5b50610ecd612a49565b604051610eda9190615868565b60405180910390f35b348015610eef57600080fd5b50610f0a6004803603810190610f0591906168d1565b612a72565b005b348015610f1857600080fd5b50610f336004803603810190610f2e9190615ba2565b612b69565b604051610f409190615868565b60405180910390f35b348015610f5557600080fd5b50610f706004803603810190610f6b9190615ba2565b612c36565b604051610f7d9190615c4e565b60405180910390f35b348015610f9257600080fd5b50610f9b612cdb565b604051610fa89190615868565b60405180910390f35b348015610fbd57600080fd5b50610fd86004803603810190610fd39190615ba2565b612cea565b604051610fe59190615868565b60405180910390f35b348015610ffa57600080fd5b5061101560048036038101906110109190615ba2565b612d07565b6040516110229190615868565b60405180910390f35b34801561103757600080fd5b50611052600480360381019061104d91906168fe565b612d24565b60405161105f9190615e8a565b60405180910390f35b34801561107457600080fd5b5061108f600480360381019061108a9190615ba2565b612d39565b60405161109c9190615868565b60405180910390f35b3480156110b157600080fd5b506110cc60048036038101906110c791906169cd565b612da7565b005b3480156110da57600080fd5b506110f560048036038101906110f09190616136565b612ee8565b6040516111029190615868565b60405180910390f35b61112560048036038101906111209190615ba2565b612f24565b005b34801561113357600080fd5b5061114e60048036038101906111499190615d11565b613011565b60405161115b9190615868565b60405180910390f35b34801561117057600080fd5b5061117961303f565b6040516111869190615eb4565b60405180910390f35b34801561119b57600080fd5b506111b660048036038101906111b19190616a41565b613069565b6040516111c39190615868565b60405180910390f35b3480156111d857600080fd5b506111e161308e565b6040516111ee9190615c4e565b60405180910390f35b34801561120357600080fd5b5061120c6130cb565b6040516112199190616200565b60405180910390f35b34801561122e57600080fd5b5061124960048036038101906112449190615ba2565b6130ef565b6040516112569190615834565b60405180910390f35b34801561126b57600080fd5b5061128660048036038101906112819190615ba2565b613119565b005b34801561129457600080fd5b506112af60048036038101906112aa9190616a81565b613210565b6040516112bc9190615868565b60405180910390f35b3480156112d157600080fd5b506112ec60048036038101906112e79190615ba2565b61322c565b005b3480156112fa57600080fd5b5061131560048036038101906113109190616ac1565b613323565b6040516113229190615e8a565b60405180910390f35b34801561133757600080fd5b50611352600480360381019061134d91906165cc565b613338565b005b34801561136057600080fd5b5061137b60048036038101906113769190615ba2565b6133bb565b6040516113889190615868565b60405180910390f35b34801561139d57600080fd5b506113a66133cd565b6040516113b39190616bb7565b60405180910390f35b6113c46133f1565b005b60006113d06137d0565b905090565b60006113e0826137fa565b9050919050565b60006113f1613874565b905090565b6000806114796114717fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051611432929190616c02565b60405180910390208b80519060200120604051602001611456959493929190616c2a565b6040516020818303038152906040528051906020012061387e565b868686613898565b90506114cc8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a6138c3565b91505098975050505050505050565b6114e36113c6565b73ffffffffffffffffffffffffffffffffffffffff16611501613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115766113c6565b73ffffffffffffffffffffffffffffffffffffffff16146115c657600061159b613a87565b6040516115a9929190616c02565b604051809103902090505b806115bf6002613a94565b036115b457505b6115cf81613b70565b50565b6060600080546115e190616d18565b80601f016020809104026020016040519081016040528092919081815260200182805461160d90616d18565b801561165a5780601f1061162f5761010080835404028352916020019161165a565b820191906000526020600020905b81548152906001019060200180831161163d57829003601f168201915b5050505050905090565b6002600381111561167857611677616319565b5b601c600083815260200190815260200160002060009054906101000a900460ff1660038111156116ab576116aa616319565b5b036117af5760006017600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161172b90616d6f565b60006040518083038185875af1925050503d8060008114611768576040519150601f19603f3d011682016040523d82523d6000602084013e61176d565b606091505b50509050806117a8576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506117e1565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006015826040516117f69190616dc0565b9081526020016040518091039020549050919050565b6017602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061188786868686612ee8565b90506004600781111561189d5761189c616319565b5b6118a682611f65565b60078111156118b8576118b7616319565b5b146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90616e49565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190616e7e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b81526004016119f195949392919061717b565b602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3291906171f8565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611aaf96959493929190617225565b600060405180830381600087803b158015611ac957600080fd5b505af1158015611add573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b0f91906172ca565b604051611b1d9291906172fe565b60405180910390a18192505050949350505050565b600080611b4186868686612ee8565b90506000611b4e82611f65565b905060046007811115611b6457611b63616319565b5b816007811115611b7757611b76616319565b5b1480611ba7575060056007811115611b9257611b91616319565b5b816007811115611ba557611ba4616319565b5b145b611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90616e49565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c439190615868565b60405180910390a1611c588288888888613d24565b611c658288888888613e07565b611c728288888888613e1b565b8192505050949350505050565b6000611cdc600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d1b613e84565b905090565b600080611d81611d797f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611d5e93929190617327565b6040516020818303038152906040528051906020012061387e565b868686613898565b9050611d9e87828860405180602001604052806000815250613e8e565b91505095945050505050565b611db2613eae565b4260136000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601c6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611e1657611e15616319565b5b02179055508160146000600d548152602001908152602001600020819055508260196000600d54815260200190815260200160002081905550600d54601585604051611e629190616dc0565b9081526020016040518091039020819055508360166000600d5481526020019081526020016000209081611e969190617500565b5080601b6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a6000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d6000815480929190611f5a906175d2565b919050555050505050565b6000611f7082613f2c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601c600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000612032604051806020016040528060008152506125e2565b5090508061206c576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060126000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601a6000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060196000600d5481526020019081526020016000205460186000600d548152602001908152602001600020541115612299576001601c6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561213357612132616319565b5b021790555060006064600f5460186000600d5481526020019081526020016000205461215f919061761a565b612169919061768b565b90506000601b6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516121c690616d6f565b60006040518083038185875af1925050503d8060008114612203576040519150601f19603f3d011682016040523d82523d6000602084013e612208565b606091505b50509050806122635760186000600d548152602001908152602001600020546040517f265b39fb00000000000000000000000000000000000000000000000000000000815260040161225a9190615868565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612307565b6002601c6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156122d2576122d1616319565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b601a6020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806123b6613a7f565b90506123d384828560405180602001604052806000815250613e8e565b91505092915050565b60196020528060005260406000206000915090505481565b60146020528060005260406000206000915090505481565b600080612417613a7f565b905061246a87828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876138c3565b91505095945050505050565b600080600960000180549050905060008103612497576008549150506125bd565b600060096000016001836124ab91906176bc565b815481106124bc576124bb6176f0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff16116125a45780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506125bd565b6125b88460096140ff90919063ffffffff16565b925050505b919050565b601d6020528060005260406000206000915054906101000a900460ff1681565b6000606060126000600d54815260200190815260200160002060009054906101000a900460ff168015612695575060136000600d548152602001908152602001600020600060146000600d5481526020019081526020016000205481526020019081526020016000205460136000600d548152602001908152602001600020600060146000600d548152602001908152602001600020548152602001908152602001600020544261269391906176bc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b6126c46113c6565b73ffffffffffffffffffffffffffffffffffffffff166126e2613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166127576113c6565b73ffffffffffffffffffffffffffffffffffffffff16146127a757600061277c613a87565b60405161278a929190616c02565b604051809103902090505b806127a06002613a94565b0361279557505b6127b081614257565b50565b6127bb613eae565b6127c5600061429c565b565b60186020528060005260406000206000915090505481565b6000806127ea613a7f565b905061283c86828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613e8e565b915050949350505050565b60006128516133f1565b61285d85858585614362565b9050949350505050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b61289f613eae565b6000601a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060126000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601c6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561293257612931616319565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6016602052806000526040600020600091509050805461298390616d18565b80601f01602080910402602001604051908101604052809291908181526020018280546129af90616d18565b80156129fc5780601f106129d1576101008083540402835291602001916129fc565b820191906000526020600020905b8154815290600101906020018083116129df57829003601f168201915b505050505081565b60126020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612a40848484614669565b90509392505050565b60008060096000018054905014612a6957612a6460096136e2565b612a6d565b6008545b905090565b612a7a6113c6565b73ffffffffffffffffffffffffffffffffffffffff16612a98613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612b0d6113c6565b73ffffffffffffffffffffffffffffffffffffffff1614612b5d576000612b32613a87565b604051612b40929190616c02565b604051809103902090505b80612b566002613a94565b03612b4b57505b612b6681614710565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612bda9190616200565b602060405180830381865afa158015612bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1b9190616e7e565b905060018114612c2b5780612c2e565b60005b915050919050565b6060601660008381526020019081526020016000208054612c5690616d18565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8290616d18565b8015612ccf5780601f10612ca457610100808354040283529160200191612ccf565b820191906000526020600020905b815481529060010190602001808311612cb257829003601f168201915b50505050509050919050565b6000612ce56147af565b905090565b600060196000838152602001908152602001600020549050919050565b600060186000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612d96600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff169050919050565b612daf6113c6565b73ffffffffffffffffffffffffffffffffffffffff16612dcd613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612e426113c6565b73ffffffffffffffffffffffffffffffffffffffff1614612e92576000612e67613a87565b604051612e75929190616c02565b604051809103902090505b80612e8b6002613a94565b03612e8057505b612ee18483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856147b9565b5050505050565b600084848484604051602001612f01949392919061771f565b6040516020818303038152906040528051906020012060001c9050949350505050565b80601a600082815260200190815260200160002060009054906101000a900460ff16612f7c576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346017600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fdc91906172ca565b925050819055503460186000848152602001908152602001600020600082825461300691906172ca565b925050819055505050565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6013602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b6000601a600083815260200190815260200160002060009054906101000a900460ff169050919050565b6131216113c6565b73ffffffffffffffffffffffffffffffffffffffff1661313f613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614613195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318c90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166131b46113c6565b73ffffffffffffffffffffffffffffffffffffffff16146132045760006131d9613a87565b6040516131e7929190616c02565b604051809103902090505b806131fd6002613a94565b036131f257505b61320d816147e8565b50565b6000613224838361321f614870565b614669565b905092915050565b6132346113c6565b73ffffffffffffffffffffffffffffffffffffffff16613252613a7f565b73ffffffffffffffffffffffffffffffffffffffff16146132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166132c76113c6565b73ffffffffffffffffffffffffffffffffffffffff16146133175760006132ec613a87565b6040516132fa929190616c02565b604051809103902090505b806133106002613a94565b0361330557505b61332081614887565b50565b600063f23a6e6160e01b905095945050505050565b613340613eae565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a6906177eb565b60405180910390fd5b6133b88161429c565b50565b60006133c6826148cc565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543411156134415733601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613473565b6040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156134d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cf9061787d565b60405180910390fd5b819050919050565b60008060008460000180549050905060006134fa866136e2565b90506000821180156135505750438660000160018461351991906176bc565b8154811061352a576135296176f0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156135e05761355e85613475565b8660000160018461356f91906176bc565b815481106135805761357f6176f0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506136d3565b8560000160405180604001604052806135f84361377d565b63ffffffff16815260200161360c88613475565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613754578260000160018261370891906176bc565b81548110613719576137186176f0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613757565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156137c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bf9061790f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061386d575061386c82614994565b5b9050919050565b6000600554905090565b600061389161388b614af9565b83614c13565b9050919050565b60008060006138a987878787614c46565b915091506138b681614d52565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156138ef576138ee616319565b5b6138f888611f65565b600781111561390a57613909616319565b5b1461394a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613941906179a1565b60405180910390fd5b60006139a987613999846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff1686614669565b90506139b88888888488614f1e565b6000845103613a1a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613a0d94939291906179c1565b60405180910390a2613a71565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613a68959493929190617a0d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613a9f82615122565b15613ad6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613b78612a2a565b811115613bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bb190617b06565b60405180910390fd5b6000613bc4612a49565b905060008114158015613bdf57506000600960000180549050145b15613cd15760096000016040518060400160405280600063ffffffff168152602001613c0a84613475565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613ce58260096134e090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613d189291906172fe565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613d436113c6565b73ffffffffffffffffffffffffffffffffffffffff1614613e005760005b8451811015613dfe573073ffffffffffffffffffffffffffffffffffffffff16858281518110613d9457613d936176f0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603613ded57613dec838281518110613dcd57613dcc6176f0565b5b602002602001015180519060200120600261515790919063ffffffff16565b5b80613df7906175d2565b9050613d61565b505b5050505050565b613e1485858585856151d3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff16613e3a6113c6565b73ffffffffffffffffffffffffffffffffffffffff1614613e6f57613e5f6002615122565b613e6e57613e6d6002615271565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b6000613ea485858585613e9f614870565b6138c3565b9050949350505050565b613eb6613a7f565b73ffffffffffffffffffffffffffffffffffffffff16613ed461293a565b73ffffffffffffffffffffffffffffffffffffffff1614613f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f2190617b72565b60405180910390fd5b565b600080613f38836152f2565b905060046007811115613f4e57613f4d616319565b5b816007811115613f6157613f60616319565b5b14613f6f57809150506140fa565b6000600b60008581526020019081526020016000205490506000801b8103613f9b5781925050506140fa565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b8152600401613ff69190616200565b602060405180830381865afa158015614013573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140379190617bbe565b15614047576007925050506140fa565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016140a29190616200565b602060405180830381865afa1580156140bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140e39190617bbe565b156140f3576005925050506140fa565b6002925050505b919050565b6000438210614143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161413a90617c37565b60405180910390fd5b60008360000180549050905060005b818110156141c75760006141668284615406565b90508486600001828154811061417f5761417e6176f0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156141b1578092506141c1565b6001816141be91906172ca565b91505b50614152565b6000821461422c57846000016001836141e091906176bc565b815481106141f1576141f06176f0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661422f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a936004548260405161428a9291906172fe565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061436c612cdb565b614389614377613a7f565b60014361438491906176bc565b613210565b10156143ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143c190617cc9565b60405180910390fd5b60006143df8686868680519060200120612ee8565b90508451865114614425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161441c90617d5b565b60405180910390fd5b8351865114614469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161446090617d5b565b60405180910390fd5b60008651116144ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144a490617dc7565b60405180910390fd5b600060016000838152602001908152602001600020905061450d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061542c565b61454c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161454390617e59565b60405180910390fd5b600061455e614559611d11565b615446565b61456743615446565b6145719190617e8d565b905060006145856145806113e7565b615446565b826145909190617e8d565b90506145a8828460000161549d90919063ffffffff16565b6145be818460010161549d90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e0846145e8613a7f565b8b8b8d5167ffffffffffffffff81111561460557614604615963565b5b60405190808252806020026020018201604052801561463857816020015b60608152602001906001900390816146235790505b508c88888e60405161465299989796959493929190618006565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016146c69291906180b6565b602060405180830381865afa1580156146e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147079190616e7e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516147639291906180df565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606147df84848460405180606001604052806029815260200161883b602991396154cc565b90509392505050565b6000811161482b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148229061817a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405161485e9291906172fe565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516148ba9291906172fe565b60405180910390a18060068190555050565b60006148d6612a2a565b6148df83612476565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016149389190615868565b602060405180830381865afa158015614955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149799190616e7e565b614983919061761a565b61498d919061768b565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614a7a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614ae257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614af25750614af1826155e0565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614b7557507f000000000000000000000000000000000000000000000000000000000000000046145b15614ba2577f00000000000000000000000000000000000000000000000000000000000000009050614c10565b614c0d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061564a565b90505b90565b60008282604051602001614c28929190618207565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614c81576000600391509150614d49565b601b8560ff1614158015614c995750601c8560ff1614155b15614cab576000600491509150614d49565b600060018787878760405160008152602001604052604051614cd0949392919061823e565b6020604051602081039080840390855afa158015614cf2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614d4057600060019250925050614d49565b80600092509250505b94509492505050565b60006004811115614d6657614d65616319565b5b816004811115614d7957614d78616319565b5b0315614f1b5760016004811115614d9357614d92616319565b5b816004811115614da657614da5616319565b5b03614de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ddd906182cf565b60405180910390fd5b60026004811115614dfa57614df9616319565b5b816004811115614e0d57614e0c616319565b5b03614e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614e449061833b565b60405180910390fd5b60036004811115614e6157614e60616319565b5b816004811115614e7457614e73616319565b5b03614eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614eab906183cd565b60405180910390fd5b600480811115614ec757614ec6616319565b5b816004811115614eda57614ed9616319565b5b03614f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614f119061845f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614fbb906184f1565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561503257615031616319565b5b60ff168460ff160361505e578281600001600082825461505291906172ca565b9250508190555061511a565b6001600281111561507257615071616319565b5b60ff168460ff160361509e578281600101600082825461509291906172ca565b92505081905550615119565b6002808111156150b1576150b0616319565b5b60ff168460ff16036150dd57828160020160008282546150d191906172ca565b92505081905550615118565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161510f90618583565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161523895949392919061717b565b6000604051808303818588803b15801561525157600080fd5b505af1158015615265573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561532b576007915050615401565b8060020160019054906101000a900460ff161561534c576002915050615401565b600061535784611c7f565b90506000810361539c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615393906185ef565b60405180910390fd5b4381106153ae57600092505050615401565b60006153b985612d39565b90504381106153ce5760019350505050615401565b6153d785615684565b80156153e857506153e7856156cb565b5b156153f95760049350505050615401565b600393505050505b919050565b60006002828418615417919061768b565b82841661542491906172ca565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115615495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161548c90618681565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161550890618713565b60405180910390fd5b61551a856156f6565b615559576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155509061877f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161558291906187d0565b60006040518083038185875af1925050503d80600081146155bf576040519150601f19603f3d011682016040523d82523d6000602084013e6155c4565b606091505b50915091506155d4828286615719565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600083838346306040516020016156659594939291906187e7565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546156b091906172ca565b6156c16156bc85611c7f565b6133bb565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561572957829050615779565b60008351111561573c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709190615c4e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6157c981615794565b81146157d457600080fd5b50565b6000813590506157e6816157c0565b92915050565b6000602082840312156158025761580161578a565b5b6000615810848285016157d7565b91505092915050565b60008115159050919050565b61582e81615819565b82525050565b60006020820190506158496000830184615825565b92915050565b6000819050919050565b6158628161584f565b82525050565b600060208201905061587d6000830184615859565b92915050565b61588c8161584f565b811461589757600080fd5b50565b6000813590506158a981615883565b92915050565b600060ff82169050919050565b6158c5816158af565b81146158d057600080fd5b50565b6000813590506158e2816158bc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261590d5761590c6158e8565b5b8235905067ffffffffffffffff81111561592a576159296158ed565b5b602083019150836001820283011115615946576159456158f2565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61599b82615952565b810181811067ffffffffffffffff821117156159ba576159b9615963565b5b80604052505050565b60006159cd615780565b90506159d98282615992565b919050565b600067ffffffffffffffff8211156159f9576159f8615963565b5b615a0282615952565b9050602081019050919050565b82818337600083830152505050565b6000615a31615a2c846159de565b6159c3565b905082815260208101848484011115615a4d57615a4c61594d565b5b615a58848285615a0f565b509392505050565b600082601f830112615a7557615a746158e8565b5b8135615a85848260208601615a1e565b91505092915050565b6000819050919050565b615aa181615a8e565b8114615aac57600080fd5b50565b600081359050615abe81615a98565b92915050565b60008060008060008060008060e0898b031215615ae457615ae361578a565b5b6000615af28b828c0161589a565b9850506020615b038b828c016158d3565b975050604089013567ffffffffffffffff811115615b2457615b2361578f565b5b615b308b828c016158f7565b9650965050606089013567ffffffffffffffff811115615b5357615b5261578f565b5b615b5f8b828c01615a60565b9450506080615b708b828c016158d3565b93505060a0615b818b828c01615aaf565b92505060c0615b928b828c01615aaf565b9150509295985092959890939650565b600060208284031215615bb857615bb761578a565b5b6000615bc68482850161589a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615c09578082015181840152602081019050615bee565b60008484015250505050565b6000615c2082615bcf565b615c2a8185615bda565b9350615c3a818560208601615beb565b615c4381615952565b840191505092915050565b60006020820190508181036000830152615c688184615c15565b905092915050565b600067ffffffffffffffff821115615c8b57615c8a615963565b5b615c9482615952565b9050602081019050919050565b6000615cb4615caf84615c70565b6159c3565b905082815260208101848484011115615cd057615ccf61594d565b5b615cdb848285615a0f565b509392505050565b600082601f830112615cf857615cf76158e8565b5b8135615d08848260208601615ca1565b91505092915050565b600060208284031215615d2757615d2661578a565b5b600082013567ffffffffffffffff811115615d4557615d4461578f565b5b615d5184828501615ce3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615d8582615d5a565b9050919050565b615d9581615d7a565b8114615da057600080fd5b50565b600081359050615db281615d8c565b92915050565b60008060408385031215615dcf57615dce61578a565b5b6000615ddd8582860161589a565b9250506020615dee85828601615da3565b9150509250929050565b60008060008060808587031215615e1257615e1161578a565b5b6000615e2087828801615da3565b9450506020615e3187828801615da3565b9350506040615e428782880161589a565b925050606085013567ffffffffffffffff811115615e6357615e6261578f565b5b615e6f87828801615a60565b91505092959194509250565b615e8481615794565b82525050565b6000602082019050615e9f6000830184615e7b565b92915050565b615eae81615d7a565b82525050565b6000602082019050615ec96000830184615ea5565b92915050565b600067ffffffffffffffff821115615eea57615ee9615963565b5b602082029050602081019050919050565b6000615f0e615f0984615ecf565b6159c3565b90508083825260208201905060208402830185811115615f3157615f306158f2565b5b835b81811015615f5a5780615f468882615da3565b845260208401935050602081019050615f33565b5050509392505050565b600082601f830112615f7957615f786158e8565b5b8135615f89848260208601615efb565b91505092915050565b600067ffffffffffffffff821115615fad57615fac615963565b5b602082029050602081019050919050565b6000615fd1615fcc84615f92565b6159c3565b90508083825260208201905060208402830185811115615ff457615ff36158f2565b5b835b8181101561601d5780616009888261589a565b845260208401935050602081019050615ff6565b5050509392505050565b600082601f83011261603c5761603b6158e8565b5b813561604c848260208601615fbe565b91505092915050565b600067ffffffffffffffff8211156160705761606f615963565b5b602082029050602081019050919050565b600061609461608f84616055565b6159c3565b905080838252602082019050602084028301858111156160b7576160b66158f2565b5b835b818110156160fe57803567ffffffffffffffff8111156160dc576160db6158e8565b5b8086016160e98982615a60565b855260208501945050506020810190506160b9565b5050509392505050565b600082601f83011261611d5761611c6158e8565b5b813561612d848260208601616081565b91505092915050565b600080600080608085870312156161505761614f61578a565b5b600085013567ffffffffffffffff81111561616e5761616d61578f565b5b61617a87828801615f64565b945050602085013567ffffffffffffffff81111561619b5761619a61578f565b5b6161a787828801616027565b935050604085013567ffffffffffffffff8111156161c8576161c761578f565b5b6161d487828801616108565b92505060606161e587828801615aaf565b91505092959194509250565b6161fa81615a8e565b82525050565b600060208201905061621560008301846161f1565b92915050565b600080600080600060a086880312156162375761623661578a565b5b60006162458882890161589a565b9550506020616256888289016158d3565b9450506040616267888289016158d3565b935050606061627888828901615aaf565b925050608061628988828901615aaf565b9150509295509295909350565b600080600080608085870312156162b0576162af61578a565b5b600085013567ffffffffffffffff8111156162ce576162cd61578f565b5b6162da87828801615ce3565b94505060206162eb8782880161589a565b93505060406162fc8782880161589a565b925050606061630d87828801615da3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061635957616358616319565b5b50565b600081905061636a82616348565b919050565b600061637a8261635c565b9050919050565b61638a8161636f565b82525050565b60006020820190506163a56000830184616381565b92915050565b600481106163bc576163bb616319565b5b50565b60008190506163cd826163ab565b919050565b60006163dd826163bf565b9050919050565b6163ed816163d2565b82525050565b600060208201905061640860008301846163e4565b92915050565b60008083601f840112616424576164236158e8565b5b8235905067ffffffffffffffff811115616441576164406158ed565b5b60208301915083600182028301111561645d5761645c6158f2565b5b9250929050565b6000806020838503121561647b5761647a61578a565b5b600083013567ffffffffffffffff8111156164995761649861578f565b5b6164a58582860161640e565b92509250509250929050565b60006060820190506164c66000830186615859565b6164d36020830185615859565b6164e06040830184615859565b949350505050565b600080604083850312156164ff576164fe61578a565b5b600061650d8582860161589a565b925050602061651e858286016158d3565b9150509250929050565b6000806000806000608086880312156165445761654361578a565b5b60006165528882890161589a565b9550506020616563888289016158d3565b945050604086013567ffffffffffffffff8111156165845761658361578f565b5b616590888289016158f7565b9350935050606086013567ffffffffffffffff8111156165b3576165b261578f565b5b6165bf88828901615a60565b9150509295509295909350565b6000602082840312156165e2576165e161578a565b5b60006165f084828501615da3565b91505092915050565b60006020828403121561660f5761660e61578a565b5b600082013567ffffffffffffffff81111561662d5761662c61578f565b5b61663984828501615a60565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061666982616642565b616673818561664d565b9350616683818560208601615beb565b61668c81615952565b840191505092915050565b60006040820190506166ac6000830185615825565b81810360208301526166be818461665e565b90509392505050565b600080600080606085870312156166e1576166e061578a565b5b60006166ef8782880161589a565b9450506020616700878288016158d3565b935050604085013567ffffffffffffffff8111156167215761672061578f565b5b61672d878288016158f7565b925092505092959194509250565b600080600080608085870312156167555761675461578a565b5b600085013567ffffffffffffffff8111156167735761677261578f565b5b61677f87828801615f64565b945050602085013567ffffffffffffffff8111156167a05761679f61578f565b5b6167ac87828801616027565b935050604085013567ffffffffffffffff8111156167cd576167cc61578f565b5b6167d987828801616108565b925050606085013567ffffffffffffffff8111156167fa576167f961578f565b5b61680687828801615ce3565b91505092959194509250565b60008060006060848603121561682b5761682a61578a565b5b600061683986828701615da3565b935050602061684a8682870161589a565b925050604084013567ffffffffffffffff81111561686b5761686a61578f565b5b61687786828701615a60565b9150509250925092565b600061688c82615d5a565b9050919050565b600061689e82616881565b9050919050565b6168ae81616893565b81146168b957600080fd5b50565b6000813590506168cb816168a5565b92915050565b6000602082840312156168e7576168e661578a565b5b60006168f5848285016168bc565b91505092915050565b600080600080600060a0868803121561691a5761691961578a565b5b600061692888828901615da3565b955050602061693988828901615da3565b945050604086013567ffffffffffffffff81111561695a5761695961578f565b5b61696688828901616027565b935050606086013567ffffffffffffffff8111156169875761698661578f565b5b61699388828901616027565b925050608086013567ffffffffffffffff8111156169b4576169b361578f565b5b6169c088828901615a60565b9150509295509295909350565b600080600080606085870312156169e7576169e661578a565b5b60006169f587828801615da3565b9450506020616a068782880161589a565b935050604085013567ffffffffffffffff811115616a2757616a2661578f565b5b616a338782880161640e565b925092505092959194509250565b60008060408385031215616a5857616a5761578a565b5b6000616a668582860161589a565b9250506020616a778582860161589a565b9150509250929050565b60008060408385031215616a9857616a9761578a565b5b6000616aa685828601615da3565b9250506020616ab78582860161589a565b9150509250929050565b600080600080600060a08688031215616add57616adc61578a565b5b6000616aeb88828901615da3565b9550506020616afc88828901615da3565b9450506040616b0d8882890161589a565b9350506060616b1e8882890161589a565b925050608086013567ffffffffffffffff811115616b3f57616b3e61578f565b5b616b4b88828901615a60565b9150509295509295909350565b6000819050919050565b6000616b7d616b78616b7384615d5a565b616b58565b615d5a565b9050919050565b6000616b8f82616b62565b9050919050565b6000616ba182616b84565b9050919050565b616bb181616b96565b82525050565b6000602082019050616bcc6000830184616ba8565b92915050565b600081905092915050565b6000616be98385616bd2565b9350616bf6838584615a0f565b82840190509392505050565b6000616c0f828486616bdd565b91508190509392505050565b616c24816158af565b82525050565b600060a082019050616c3f60008301886161f1565b616c4c6020830187615859565b616c596040830186616c1b565b616c6660608301856161f1565b616c7360808301846161f1565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616cb3601883615bda565b9150616cbe82616c7d565b602082019050919050565b60006020820190508181036000830152616ce281616ca6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616d3057607f821691505b602082108103616d4357616d42616ce9565b5b50919050565b50565b6000616d59600083616bd2565b9150616d6482616d49565b600082019050919050565b6000616d7a82616d4c565b9150819050919050565b600081905092915050565b6000616d9a82615bcf565b616da48185616d84565b9350616db4818560208601615beb565b80840191505092915050565b6000616dcc8284616d8f565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000616e33602183615bda565b9150616e3e82616dd7565b604082019050919050565b60006020820190508181036000830152616e6281616e26565b9050919050565b600081519050616e7881615883565b92915050565b600060208284031215616e9457616e9361578a565b5b6000616ea284828501616e69565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616ee081615d7a565b82525050565b6000616ef28383616ed7565b60208301905092915050565b6000602082019050919050565b6000616f1682616eab565b616f208185616eb6565b9350616f2b83616ec7565b8060005b83811015616f5c578151616f438882616ee6565b9750616f4e83616efe565b925050600181019050616f2f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616f9e8161584f565b82525050565b6000616fb08383616f95565b60208301905092915050565b6000602082019050919050565b6000616fd482616f69565b616fde8185616f74565b9350616fe983616f85565b8060005b8381101561701a5781516170018882616fa4565b975061700c83616fbc565b925050600181019050616fed565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061706f82616642565b6170798185617053565b9350617089818560208601615beb565b61709281615952565b840191505092915050565b60006170a98383617064565b905092915050565b6000602082019050919050565b60006170c982617027565b6170d38185617032565b9350836020820285016170e585617043565b8060005b858110156171215784840389528151617102858261709d565b945061710d836170b1565b925060208a019950506001810190506170e9565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061716561716061715b84617133565b61713d565b615a8e565b9050919050565b6171758161714a565b82525050565b600060a08201905081810360008301526171958188616f0b565b905081810360208301526171a98187616fc9565b905081810360408301526171bd81866170be565b90506171cc606083018561716c565b6171d960808301846161f1565b9695505050505050565b6000815190506171f281615a98565b92915050565b60006020828403121561720e5761720d61578a565b5b600061721c848285016171e3565b91505092915050565b600060c082019050818103600083015261723f8189616f0b565b905081810360208301526172538188616fc9565b9050818103604083015261726781876170be565b9050617276606083018661716c565b61728360808301856161f1565b61729060a0830184615859565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006172d58261584f565b91506172e08361584f565b92508282019050808211156172f8576172f761729b565b5b92915050565b60006040820190506173136000830185615859565b6173206020830184615859565b9392505050565b600060608201905061733c60008301866161f1565b6173496020830185615859565b6173566040830184616c1b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026173c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617383565b6173ca8683617383565b95508019841693508086168417925050509392505050565b60006173fd6173f86173f38461584f565b616b58565b61584f565b9050919050565b6000819050919050565b617417836173e2565b61742b61742382617404565b848454617390565b825550505050565b600090565b617440617433565b61744b81848461740e565b505050565b5b8181101561746f57617464600082617438565b600181019050617451565b5050565b601f8211156174b4576174858161735e565b61748e84617373565b8101602085101561749d578190505b6174b16174a985617373565b830182617450565b50505b505050565b600082821c905092915050565b60006174d7600019846008026174b9565b1980831691505092915050565b60006174f083836174c6565b9150826002028217905092915050565b61750982615bcf565b67ffffffffffffffff81111561752257617521615963565b5b61752c8254616d18565b617537828285617473565b600060209050601f83116001811461756a5760008415617558578287015190505b61756285826174e4565b8655506175ca565b601f1984166175788661735e565b60005b828110156175a05784890151825560018201915060208501945060208101905061757b565b868310156175bd57848901516175b9601f8916826174c6565b8355505b6001600288020188555050505b505050505050565b60006175dd8261584f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361760f5761760e61729b565b5b600182019050919050565b60006176258261584f565b91506176308361584f565b925082820261763e8161584f565b915082820484148315176176555761765461729b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006176968261584f565b91506176a18361584f565b9250826176b1576176b061765c565b5b828204905092915050565b60006176c78261584f565b91506176d28361584f565b92508282039050818111156176ea576176e961729b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201905081810360008301526177398187616f0b565b9050818103602083015261774d8186616fc9565b9050818103604083015261776181856170be565b905061777060608301846161f1565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006177d5602683615bda565b91506177e082617779565b604082019050919050565b60006020820190508181036000830152617804816177c8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617867602783615bda565b91506178728261780b565b604082019050919050565b600060208201905081810360008301526178968161785a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006178f9602683615bda565b91506179048261789d565b604082019050919050565b60006020820190508181036000830152617928816178ec565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b600061798b602383615bda565b91506179968261792f565b604082019050919050565b600060208201905081810360008301526179ba8161797e565b9050919050565b60006080820190506179d66000830187615859565b6179e36020830186616c1b565b6179f06040830185615859565b8181036060830152617a028184615c15565b905095945050505050565b600060a082019050617a226000830188615859565b617a2f6020830187616c1b565b617a3c6040830186615859565b8181036060830152617a4e8185615c15565b90508181036080830152617a62818461665e565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617af0604383615bda565b9150617afb82617a6e565b606082019050919050565b60006020820190508181036000830152617b1f81617ae3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617b5c602083615bda565b9150617b6782617b26565b602082019050919050565b60006020820190508181036000830152617b8b81617b4f565b9050919050565b617b9b81615819565b8114617ba657600080fd5b50565b600081519050617bb881617b92565b92915050565b600060208284031215617bd457617bd361578a565b5b6000617be284828501617ba9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617c21602083615bda565b9150617c2c82617beb565b602082019050919050565b60006020820190508181036000830152617c5081617c14565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617cb3603183615bda565b9150617cbe82617c57565b604082019050919050565b60006020820190508181036000830152617ce281617ca6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617d45602183615bda565b9150617d5082617ce9565b604082019050919050565b60006020820190508181036000830152617d7481617d38565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617db1601883615bda565b9150617dbc82617d7b565b602082019050919050565b60006020820190508181036000830152617de081617da4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000617e43602183615bda565b9150617e4e82617de7565b604082019050919050565b60006020820190508181036000830152617e7281617e36565b9050919050565b600067ffffffffffffffff82169050919050565b6000617e9882617e79565b9150617ea383617e79565b9250828201905067ffffffffffffffff811115617ec357617ec261729b565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000617f1182615bcf565b617f1b8185617ef5565b9350617f2b818560208601615beb565b617f3481615952565b840191505092915050565b6000617f4b8383617f06565b905092915050565b6000602082019050919050565b6000617f6b82617ec9565b617f758185617ed4565b935083602082028501617f8785617ee5565b8060005b85811015617fc35784840389528151617fa48582617f3f565b9450617faf83617f53565b925060208a01995050600181019050617f8b565b50829750879550505050505092915050565b6000617ff0617feb617fe684617e79565b616b58565b61584f565b9050919050565b61800081617fd5565b82525050565b60006101208201905061801c600083018c615859565b618029602083018b615ea5565b818103604083015261803b818a616f0b565b9050818103606083015261804f8189616fc9565b905081810360808301526180638188617f60565b905081810360a083015261807781876170be565b905061808660c0830186617ff7565b61809360e0830185617ff7565b8181036101008301526180a68184615c15565b90509a9950505050505050505050565b60006040820190506180cb6000830185615ea5565b6180d86020830184615859565b9392505050565b60006040820190506180f46000830185615ea5565b6181016020830184615ea5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618164602783615bda565b915061816f82618108565b604082019050919050565b6000602082019050818103600083015261819381618157565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006181d0600283616d84565b91506181db8261819a565b600282019050919050565b6000819050919050565b6182016181fc82615a8e565b6181e6565b82525050565b6000618212826181c3565b915061821e82856181f0565b60208201915061822e82846181f0565b6020820191508190509392505050565b600060808201905061825360008301876161f1565b6182606020830186616c1b565b61826d60408301856161f1565b61827a60608301846161f1565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006182b9601883615bda565b91506182c482618283565b602082019050919050565b600060208201905081810360008301526182e8816182ac565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618325601f83615bda565b9150618330826182ef565b602082019050919050565b6000602082019050818103600083015261835481618318565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006183b7602283615bda565b91506183c28261835b565b604082019050919050565b600060208201905081810360008301526183e6816183aa565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618449602283615bda565b9150618454826183ed565b604082019050919050565b600060208201905081810360008301526184788161843c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006184db602783615bda565b91506184e68261847f565b604082019050919050565b6000602082019050818103600083015261850a816184ce565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061856d603583615bda565b915061857882618511565b604082019050919050565b6000602082019050818103600083015261859c81618560565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006185d9601d83615bda565b91506185e4826185a3565b602082019050919050565b60006020820190508181036000830152618608816185cc565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061866b602683615bda565b91506186768261860f565b604082019050919050565b6000602082019050818103600083015261869a8161865e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006186fd602683615bda565b9150618708826186a1565b604082019050919050565b6000602082019050818103600083015261872c816186f0565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618769601d83615bda565b915061877482618733565b602082019050919050565b600060208201905081810360008301526187988161875c565b9050919050565b60006187aa82616642565b6187b48185616bd2565b93506187c4818560208601615beb565b80840191505092915050565b60006187dc828461879f565b915081905092915050565b600060a0820190506187fc60008301886161f1565b61880960208301876161f1565b61881660408301866161f1565b6188236060830185615859565b6188306080830184615ea5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220c2f510f48babb01f26563e04fd4d581d09065fd3103913bd8e2508c65acef2cf64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106104405760003560e01c8063794d556011610234578063bc197c811161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e61146112ee578063f2fde38b1461132b578063f8ce560a14611354578063fc0c546a14611391578063fea856a1146113bc57610486565b8063deaaa7cc146111f7578063e0c410cc14611222578063ea0217cf1461125f578063eb9019d414611288578063ece40cc1146112c557610486565b8063ca1d209d116100fd578063ca1d209d1461110b578063cf68625914611127578063d33219b414611164578063dc73204b1461118f578063dd4e2ba5146111cc57610486565b8063bc197c811461102b578063c01f9e3714611068578063c28bc2fa146110a5578063c59057e4146110ce57610486565b806396aa167e116101bc578063ab58fb8e11610180578063ab58fb8e14610f0c578063abe1aae614610f49578063b58131b014610f86578063b59d18a014610fb1578063bba9c21914610fee57610486565b806396aa167e14610e2557806397c3d33414610e505780639a802a6d14610e7b578063a7713a7014610eb8578063a890c91014610ee357610486565b8063868661cb11610203578063868661cb14610d2c57806387030f4d14610d575780638da5cb5b14610d805780638fb5548f14610dab578063902bfa2414610de857610486565b8063794d556014610c385780637b3c71d314610c755780637d5e81e214610cb2578063809b268e14610cef57610486565b80633f3b3b271161034557806356781388116102cd57806369e0e3461161029157806369e0e34614610b405780636e04ff0d14610b7d57806370084d7a14610bbb57806370b0f66014610bf8578063715018a614610c2157610486565b80635678138814610a0f5780635b6b465214610a4c5780635ced7d4014610a895780635f398a1414610ac657806360c4247f14610b0357610486565b80634585e33b116103145780634585e33b146109145780634fac2bb71461093d578063535bf50f1461097a578063544ffc9c146109a557806354fd4d50146109e457610486565b80633f3b3b27146108445780633fafa1271461086f578063438596321461089a578063446a156f146108d757610486565b8063156277be116103c85780632fe3e261116103975780632fe3e2611461074b5780633932abb1146107765780633bccf4fd146107a15780633be2f2a3146107de5780633e4f49e61461080757610486565b8063156277be14610664578063160cbed7146106a15780632656227d146106de5780632d63f6931461070e57610486565b806306fdde031161040f57806306fdde03146105595780630cee172514610584578063141a6c22146105ad578063148038b0146105ea578063150b7a021461062757610486565b806301ffc9a71461048b57806302a251a3146104c857806303420181146104f357806306f3f9e61461053057610486565b36610486573073ffffffffffffffffffffffffffffffffffffffff166104646113c6565b73ffffffffffffffffffffffffffffffffffffffff161461048457600080fd5b005b600080fd5b34801561049757600080fd5b506104b260048036038101906104ad91906157ec565b6113d5565b6040516104bf9190615834565b60405180910390f35b3480156104d457600080fd5b506104dd6113e7565b6040516104ea9190615868565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190615ac4565b6113f6565b6040516105279190615868565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190615ba2565b6114db565b005b34801561056557600080fd5b5061056e6115d2565b60405161057b9190615c4e565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615ba2565b611664565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615d11565b6117e4565b6040516105e19190615868565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190615db8565b61180c565b60405161061e9190615868565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190615df8565b611831565b60405161065b9190615e8a565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190615ba2565b611845565b6040516106989190615eb4565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190616136565b611878565b6040516106d59190615868565b60405180910390f35b6106f860048036038101906106f39190616136565b611b32565b6040516107059190615868565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190615ba2565b611c7f565b6040516107429190615868565b60405180910390f35b34801561075757600080fd5b50610760611ced565b60405161076d9190616200565b60405180910390f35b34801561078257600080fd5b5061078b611d11565b6040516107989190615868565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c3919061621b565b611d20565b6040516107d59190615868565b60405180910390f35b3480156107ea57600080fd5b5061080560048036038101906108009190616296565b611daa565b005b34801561081357600080fd5b5061082e60048036038101906108299190615ba2565b611f65565b60405161083b9190616390565b60405180910390f35b34801561085057600080fd5b50610859611f77565b6040516108669190615868565b60405180910390f35b34801561087b57600080fd5b50610884611f7d565b6040516108919190615868565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc9190615db8565b611f83565b6040516108ce9190615834565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190615ba2565b611fee565b60405161090b91906163f3565b60405180910390f35b34801561092057600080fd5b5061093b60048036038101906109369190616464565b612018565b005b34801561094957600080fd5b50610964600480360381019061095f9190615ba2565b61230c565b6040516109719190615834565b60405180910390f35b34801561098657600080fd5b5061098f61232c565b60405161099c9190615868565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190615ba2565b612336565b6040516109db939291906164b1565b60405180910390f35b3480156109f057600080fd5b506109f961236e565b604051610a069190615c4e565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a3191906164e8565b6123ab565b604051610a439190615868565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190615ba2565b6123dc565b604051610a809190615868565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190615ba2565b6123f4565b604051610abd9190615868565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190616528565b61240c565b604051610afa9190615868565b60405180910390f35b348015610b0f57600080fd5b50610b2a6004803603810190610b259190615ba2565b612476565b604051610b379190615868565b60405180910390f35b348015610b4c57600080fd5b50610b676004803603810190610b6291906165cc565b6125c2565b604051610b749190615834565b60405180910390f35b348015610b8957600080fd5b50610ba46004803603810190610b9f91906165f9565b6125e2565b604051610bb2929190616697565b60405180910390f35b348015610bc757600080fd5b50610be26004803603810190610bdd9190615ba2565b61269c565b604051610bef91906163f3565b60405180910390f35b348015610c0457600080fd5b50610c1f6004803603810190610c1a9190615ba2565b6126bc565b005b348015610c2d57600080fd5b50610c366127b3565b005b348015610c4457600080fd5b50610c5f6004803603810190610c5a9190615ba2565b6127c7565b604051610c6c9190615868565b60405180910390f35b348015610c8157600080fd5b50610c9c6004803603810190610c9791906166c7565b6127df565b604051610ca99190615868565b60405180910390f35b348015610cbe57600080fd5b50610cd96004803603810190610cd4919061673b565b612847565b604051610ce69190615868565b60405180910390f35b348015610cfb57600080fd5b50610d166004803603810190610d119190615ba2565b612867565b604051610d239190615834565b60405180910390f35b348015610d3857600080fd5b50610d41612891565b604051610d4e9190615868565b60405180910390f35b348015610d6357600080fd5b50610d7e6004803603810190610d799190615ba2565b612897565b005b348015610d8c57600080fd5b50610d9561293a565b604051610da29190615eb4565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd9190615ba2565b612964565b604051610ddf9190615c4e565b60405180910390f35b348015610df457600080fd5b50610e0f6004803603810190610e0a9190615ba2565b612a04565b604051610e1c9190615834565b60405180910390f35b348015610e3157600080fd5b50610e3a612a24565b604051610e479190615868565b60405180910390f35b348015610e5c57600080fd5b50610e65612a2a565b604051610e729190615868565b60405180910390f35b348015610e8757600080fd5b50610ea26004803603810190610e9d9190616812565b612a33565b604051610eaf9190615868565b60405180910390f35b348015610ec457600080fd5b50610ecd612a49565b604051610eda9190615868565b60405180910390f35b348015610eef57600080fd5b50610f0a6004803603810190610f0591906168d1565b612a72565b005b348015610f1857600080fd5b50610f336004803603810190610f2e9190615ba2565b612b69565b604051610f409190615868565b60405180910390f35b348015610f5557600080fd5b50610f706004803603810190610f6b9190615ba2565b612c36565b604051610f7d9190615c4e565b60405180910390f35b348015610f9257600080fd5b50610f9b612cdb565b604051610fa89190615868565b60405180910390f35b348015610fbd57600080fd5b50610fd86004803603810190610fd39190615ba2565b612cea565b604051610fe59190615868565b60405180910390f35b348015610ffa57600080fd5b5061101560048036038101906110109190615ba2565b612d07565b6040516110229190615868565b60405180910390f35b34801561103757600080fd5b50611052600480360381019061104d91906168fe565b612d24565b60405161105f9190615e8a565b60405180910390f35b34801561107457600080fd5b5061108f600480360381019061108a9190615ba2565b612d39565b60405161109c9190615868565b60405180910390f35b3480156110b157600080fd5b506110cc60048036038101906110c791906169cd565b612da7565b005b3480156110da57600080fd5b506110f560048036038101906110f09190616136565b612ee8565b6040516111029190615868565b60405180910390f35b61112560048036038101906111209190615ba2565b612f24565b005b34801561113357600080fd5b5061114e60048036038101906111499190615d11565b613011565b60405161115b9190615868565b60405180910390f35b34801561117057600080fd5b5061117961303f565b6040516111869190615eb4565b60405180910390f35b34801561119b57600080fd5b506111b660048036038101906111b19190616a41565b613069565b6040516111c39190615868565b60405180910390f35b3480156111d857600080fd5b506111e161308e565b6040516111ee9190615c4e565b60405180910390f35b34801561120357600080fd5b5061120c6130cb565b6040516112199190616200565b60405180910390f35b34801561122e57600080fd5b5061124960048036038101906112449190615ba2565b6130ef565b6040516112569190615834565b60405180910390f35b34801561126b57600080fd5b5061128660048036038101906112819190615ba2565b613119565b005b34801561129457600080fd5b506112af60048036038101906112aa9190616a81565b613210565b6040516112bc9190615868565b60405180910390f35b3480156112d157600080fd5b506112ec60048036038101906112e79190615ba2565b61322c565b005b3480156112fa57600080fd5b5061131560048036038101906113109190616ac1565b613323565b6040516113229190615e8a565b60405180910390f35b34801561133757600080fd5b50611352600480360381019061134d91906165cc565b613338565b005b34801561136057600080fd5b5061137b60048036038101906113769190615ba2565b6133bb565b6040516113889190615868565b60405180910390f35b34801561139d57600080fd5b506113a66133cd565b6040516113b39190616bb7565b60405180910390f35b6113c46133f1565b005b60006113d06137d0565b905090565b60006113e0826137fa565b9050919050565b60006113f1613874565b905090565b6000806114796114717fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051611432929190616c02565b60405180910390208b80519060200120604051602001611456959493929190616c2a565b6040516020818303038152906040528051906020012061387e565b868686613898565b90506114cc8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a6138c3565b91505098975050505050505050565b6114e36113c6565b73ffffffffffffffffffffffffffffffffffffffff16611501613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115766113c6565b73ffffffffffffffffffffffffffffffffffffffff16146115c657600061159b613a87565b6040516115a9929190616c02565b604051809103902090505b806115bf6002613a94565b036115b457505b6115cf81613b70565b50565b6060600080546115e190616d18565b80601f016020809104026020016040519081016040528092919081815260200182805461160d90616d18565b801561165a5780601f1061162f5761010080835404028352916020019161165a565b820191906000526020600020905b81548152906001019060200180831161163d57829003601f168201915b5050505050905090565b6002600381111561167857611677616319565b5b601c600083815260200190815260200160002060009054906101000a900460ff1660038111156116ab576116aa616319565b5b036117af5760006017600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161172b90616d6f565b60006040518083038185875af1925050503d8060008114611768576040519150601f19603f3d011682016040523d82523d6000602084013e61176d565b606091505b50509050806117a8576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506117e1565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006015826040516117f69190616dc0565b9081526020016040518091039020549050919050565b6017602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061188786868686612ee8565b90506004600781111561189d5761189c616319565b5b6118a682611f65565b60078111156118b8576118b7616319565b5b146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90616e49565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190616e7e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b81526004016119f195949392919061717b565b602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3291906171f8565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611aaf96959493929190617225565b600060405180830381600087803b158015611ac957600080fd5b505af1158015611add573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b0f91906172ca565b604051611b1d9291906172fe565b60405180910390a18192505050949350505050565b600080611b4186868686612ee8565b90506000611b4e82611f65565b905060046007811115611b6457611b63616319565b5b816007811115611b7757611b76616319565b5b1480611ba7575060056007811115611b9257611b91616319565b5b816007811115611ba557611ba4616319565b5b145b611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90616e49565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c439190615868565b60405180910390a1611c588288888888613d24565b611c658288888888613e07565b611c728288888888613e1b565b8192505050949350505050565b6000611cdc600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d1b613e84565b905090565b600080611d81611d797f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611d5e93929190617327565b6040516020818303038152906040528051906020012061387e565b868686613898565b9050611d9e87828860405180602001604052806000815250613e8e565b91505095945050505050565b611db2613eae565b4260136000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601c6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611e1657611e15616319565b5b02179055508160146000600d548152602001908152602001600020819055508260196000600d54815260200190815260200160002081905550600d54601585604051611e629190616dc0565b9081526020016040518091039020819055508360166000600d5481526020019081526020016000209081611e969190617500565b5080601b6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a6000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d6000815480929190611f5a906175d2565b919050555050505050565b6000611f7082613f2c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601c600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000612032604051806020016040528060008152506125e2565b5090508061206c576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060126000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601a6000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060196000600d5481526020019081526020016000205460186000600d548152602001908152602001600020541115612299576001601c6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561213357612132616319565b5b021790555060006064600f5460186000600d5481526020019081526020016000205461215f919061761a565b612169919061768b565b90506000601b6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516121c690616d6f565b60006040518083038185875af1925050503d8060008114612203576040519150601f19603f3d011682016040523d82523d6000602084013e612208565b606091505b50509050806122635760186000600d548152602001908152602001600020546040517f265b39fb00000000000000000000000000000000000000000000000000000000815260040161225a9190615868565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612307565b6002601c6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156122d2576122d1616319565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b601a6020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806123b6613a7f565b90506123d384828560405180602001604052806000815250613e8e565b91505092915050565b60196020528060005260406000206000915090505481565b60146020528060005260406000206000915090505481565b600080612417613a7f565b905061246a87828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876138c3565b91505095945050505050565b600080600960000180549050905060008103612497576008549150506125bd565b600060096000016001836124ab91906176bc565b815481106124bc576124bb6176f0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff16116125a45780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506125bd565b6125b88460096140ff90919063ffffffff16565b925050505b919050565b601d6020528060005260406000206000915054906101000a900460ff1681565b6000606060126000600d54815260200190815260200160002060009054906101000a900460ff168015612695575060136000600d548152602001908152602001600020600060146000600d5481526020019081526020016000205481526020019081526020016000205460136000600d548152602001908152602001600020600060146000600d548152602001908152602001600020548152602001908152602001600020544261269391906176bc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b6126c46113c6565b73ffffffffffffffffffffffffffffffffffffffff166126e2613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166127576113c6565b73ffffffffffffffffffffffffffffffffffffffff16146127a757600061277c613a87565b60405161278a929190616c02565b604051809103902090505b806127a06002613a94565b0361279557505b6127b081614257565b50565b6127bb613eae565b6127c5600061429c565b565b60186020528060005260406000206000915090505481565b6000806127ea613a7f565b905061283c86828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613e8e565b915050949350505050565b60006128516133f1565b61285d85858585614362565b9050949350505050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b61289f613eae565b6000601a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060126000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601c6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561293257612931616319565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6016602052806000526040600020600091509050805461298390616d18565b80601f01602080910402602001604051908101604052809291908181526020018280546129af90616d18565b80156129fc5780601f106129d1576101008083540402835291602001916129fc565b820191906000526020600020905b8154815290600101906020018083116129df57829003601f168201915b505050505081565b60126020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612a40848484614669565b90509392505050565b60008060096000018054905014612a6957612a6460096136e2565b612a6d565b6008545b905090565b612a7a6113c6565b73ffffffffffffffffffffffffffffffffffffffff16612a98613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612b0d6113c6565b73ffffffffffffffffffffffffffffffffffffffff1614612b5d576000612b32613a87565b604051612b40929190616c02565b604051809103902090505b80612b566002613a94565b03612b4b57505b612b6681614710565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612bda9190616200565b602060405180830381865afa158015612bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1b9190616e7e565b905060018114612c2b5780612c2e565b60005b915050919050565b6060601660008381526020019081526020016000208054612c5690616d18565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8290616d18565b8015612ccf5780601f10612ca457610100808354040283529160200191612ccf565b820191906000526020600020905b815481529060010190602001808311612cb257829003601f168201915b50505050509050919050565b6000612ce56147af565b905090565b600060196000838152602001908152602001600020549050919050565b600060186000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612d96600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff169050919050565b612daf6113c6565b73ffffffffffffffffffffffffffffffffffffffff16612dcd613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612e426113c6565b73ffffffffffffffffffffffffffffffffffffffff1614612e92576000612e67613a87565b604051612e75929190616c02565b604051809103902090505b80612e8b6002613a94565b03612e8057505b612ee18483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856147b9565b5050505050565b600084848484604051602001612f01949392919061771f565b6040516020818303038152906040528051906020012060001c9050949350505050565b80601a600082815260200190815260200160002060009054906101000a900460ff16612f7c576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346017600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fdc91906172ca565b925050819055503460186000848152602001908152602001600020600082825461300691906172ca565b925050819055505050565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6013602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b6000601a600083815260200190815260200160002060009054906101000a900460ff169050919050565b6131216113c6565b73ffffffffffffffffffffffffffffffffffffffff1661313f613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614613195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318c90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166131b46113c6565b73ffffffffffffffffffffffffffffffffffffffff16146132045760006131d9613a87565b6040516131e7929190616c02565b604051809103902090505b806131fd6002613a94565b036131f257505b61320d816147e8565b50565b6000613224838361321f614870565b614669565b905092915050565b6132346113c6565b73ffffffffffffffffffffffffffffffffffffffff16613252613a7f565b73ffffffffffffffffffffffffffffffffffffffff16146132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166132c76113c6565b73ffffffffffffffffffffffffffffffffffffffff16146133175760006132ec613a87565b6040516132fa929190616c02565b604051809103902090505b806133106002613a94565b0361330557505b61332081614887565b50565b600063f23a6e6160e01b905095945050505050565b613340613eae565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a6906177eb565b60405180910390fd5b6133b88161429c565b50565b60006133c6826148cc565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543411156134415733601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613473565b6040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156134d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cf9061787d565b60405180910390fd5b819050919050565b60008060008460000180549050905060006134fa866136e2565b90506000821180156135505750438660000160018461351991906176bc565b8154811061352a576135296176f0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156135e05761355e85613475565b8660000160018461356f91906176bc565b815481106135805761357f6176f0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506136d3565b8560000160405180604001604052806135f84361377d565b63ffffffff16815260200161360c88613475565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613754578260000160018261370891906176bc565b81548110613719576137186176f0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613757565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156137c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bf9061790f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061386d575061386c82614994565b5b9050919050565b6000600554905090565b600061389161388b614af9565b83614c13565b9050919050565b60008060006138a987878787614c46565b915091506138b681614d52565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156138ef576138ee616319565b5b6138f888611f65565b600781111561390a57613909616319565b5b1461394a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613941906179a1565b60405180910390fd5b60006139a987613999846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff1686614669565b90506139b88888888488614f1e565b6000845103613a1a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613a0d94939291906179c1565b60405180910390a2613a71565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613a68959493929190617a0d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613a9f82615122565b15613ad6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613b78612a2a565b811115613bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bb190617b06565b60405180910390fd5b6000613bc4612a49565b905060008114158015613bdf57506000600960000180549050145b15613cd15760096000016040518060400160405280600063ffffffff168152602001613c0a84613475565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613ce58260096134e090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613d189291906172fe565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613d436113c6565b73ffffffffffffffffffffffffffffffffffffffff1614613e005760005b8451811015613dfe573073ffffffffffffffffffffffffffffffffffffffff16858281518110613d9457613d936176f0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603613ded57613dec838281518110613dcd57613dcc6176f0565b5b602002602001015180519060200120600261515790919063ffffffff16565b5b80613df7906175d2565b9050613d61565b505b5050505050565b613e1485858585856151d3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff16613e3a6113c6565b73ffffffffffffffffffffffffffffffffffffffff1614613e6f57613e5f6002615122565b613e6e57613e6d6002615271565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b6000613ea485858585613e9f614870565b6138c3565b9050949350505050565b613eb6613a7f565b73ffffffffffffffffffffffffffffffffffffffff16613ed461293a565b73ffffffffffffffffffffffffffffffffffffffff1614613f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f2190617b72565b60405180910390fd5b565b600080613f38836152f2565b905060046007811115613f4e57613f4d616319565b5b816007811115613f6157613f60616319565b5b14613f6f57809150506140fa565b6000600b60008581526020019081526020016000205490506000801b8103613f9b5781925050506140fa565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b8152600401613ff69190616200565b602060405180830381865afa158015614013573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140379190617bbe565b15614047576007925050506140fa565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016140a29190616200565b602060405180830381865afa1580156140bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140e39190617bbe565b156140f3576005925050506140fa565b6002925050505b919050565b6000438210614143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161413a90617c37565b60405180910390fd5b60008360000180549050905060005b818110156141c75760006141668284615406565b90508486600001828154811061417f5761417e6176f0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156141b1578092506141c1565b6001816141be91906172ca565b91505b50614152565b6000821461422c57846000016001836141e091906176bc565b815481106141f1576141f06176f0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661422f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a936004548260405161428a9291906172fe565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061436c612cdb565b614389614377613a7f565b60014361438491906176bc565b613210565b10156143ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143c190617cc9565b60405180910390fd5b60006143df8686868680519060200120612ee8565b90508451865114614425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161441c90617d5b565b60405180910390fd5b8351865114614469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161446090617d5b565b60405180910390fd5b60008651116144ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144a490617dc7565b60405180910390fd5b600060016000838152602001908152602001600020905061450d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061542c565b61454c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161454390617e59565b60405180910390fd5b600061455e614559611d11565b615446565b61456743615446565b6145719190617e8d565b905060006145856145806113e7565b615446565b826145909190617e8d565b90506145a8828460000161549d90919063ffffffff16565b6145be818460010161549d90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e0846145e8613a7f565b8b8b8d5167ffffffffffffffff81111561460557614604615963565b5b60405190808252806020026020018201604052801561463857816020015b60608152602001906001900390816146235790505b508c88888e60405161465299989796959493929190618006565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016146c69291906180b6565b602060405180830381865afa1580156146e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147079190616e7e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516147639291906180df565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606147df84848460405180606001604052806029815260200161883b602991396154cc565b90509392505050565b6000811161482b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148229061817a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405161485e9291906172fe565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516148ba9291906172fe565b60405180910390a18060068190555050565b60006148d6612a2a565b6148df83612476565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016149389190615868565b602060405180830381865afa158015614955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149799190616e7e565b614983919061761a565b61498d919061768b565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614a7a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614ae257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614af25750614af1826155e0565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614b7557507f000000000000000000000000000000000000000000000000000000000000000046145b15614ba2577f00000000000000000000000000000000000000000000000000000000000000009050614c10565b614c0d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061564a565b90505b90565b60008282604051602001614c28929190618207565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614c81576000600391509150614d49565b601b8560ff1614158015614c995750601c8560ff1614155b15614cab576000600491509150614d49565b600060018787878760405160008152602001604052604051614cd0949392919061823e565b6020604051602081039080840390855afa158015614cf2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614d4057600060019250925050614d49565b80600092509250505b94509492505050565b60006004811115614d6657614d65616319565b5b816004811115614d7957614d78616319565b5b0315614f1b5760016004811115614d9357614d92616319565b5b816004811115614da657614da5616319565b5b03614de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ddd906182cf565b60405180910390fd5b60026004811115614dfa57614df9616319565b5b816004811115614e0d57614e0c616319565b5b03614e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614e449061833b565b60405180910390fd5b60036004811115614e6157614e60616319565b5b816004811115614e7457614e73616319565b5b03614eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614eab906183cd565b60405180910390fd5b600480811115614ec757614ec6616319565b5b816004811115614eda57614ed9616319565b5b03614f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614f119061845f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614fbb906184f1565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561503257615031616319565b5b60ff168460ff160361505e578281600001600082825461505291906172ca565b9250508190555061511a565b6001600281111561507257615071616319565b5b60ff168460ff160361509e578281600101600082825461509291906172ca565b92505081905550615119565b6002808111156150b1576150b0616319565b5b60ff168460ff16036150dd57828160020160008282546150d191906172ca565b92505081905550615118565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161510f90618583565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161523895949392919061717b565b6000604051808303818588803b15801561525157600080fd5b505af1158015615265573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561532b576007915050615401565b8060020160019054906101000a900460ff161561534c576002915050615401565b600061535784611c7f565b90506000810361539c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615393906185ef565b60405180910390fd5b4381106153ae57600092505050615401565b60006153b985612d39565b90504381106153ce5760019350505050615401565b6153d785615684565b80156153e857506153e7856156cb565b5b156153f95760049350505050615401565b600393505050505b919050565b60006002828418615417919061768b565b82841661542491906172ca565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115615495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161548c90618681565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161550890618713565b60405180910390fd5b61551a856156f6565b615559576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155509061877f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161558291906187d0565b60006040518083038185875af1925050503d80600081146155bf576040519150601f19603f3d011682016040523d82523d6000602084013e6155c4565b606091505b50915091506155d4828286615719565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600083838346306040516020016156659594939291906187e7565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546156b091906172ca565b6156c16156bc85611c7f565b6133bb565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561572957829050615779565b60008351111561573c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709190615c4e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6157c981615794565b81146157d457600080fd5b50565b6000813590506157e6816157c0565b92915050565b6000602082840312156158025761580161578a565b5b6000615810848285016157d7565b91505092915050565b60008115159050919050565b61582e81615819565b82525050565b60006020820190506158496000830184615825565b92915050565b6000819050919050565b6158628161584f565b82525050565b600060208201905061587d6000830184615859565b92915050565b61588c8161584f565b811461589757600080fd5b50565b6000813590506158a981615883565b92915050565b600060ff82169050919050565b6158c5816158af565b81146158d057600080fd5b50565b6000813590506158e2816158bc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261590d5761590c6158e8565b5b8235905067ffffffffffffffff81111561592a576159296158ed565b5b602083019150836001820283011115615946576159456158f2565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61599b82615952565b810181811067ffffffffffffffff821117156159ba576159b9615963565b5b80604052505050565b60006159cd615780565b90506159d98282615992565b919050565b600067ffffffffffffffff8211156159f9576159f8615963565b5b615a0282615952565b9050602081019050919050565b82818337600083830152505050565b6000615a31615a2c846159de565b6159c3565b905082815260208101848484011115615a4d57615a4c61594d565b5b615a58848285615a0f565b509392505050565b600082601f830112615a7557615a746158e8565b5b8135615a85848260208601615a1e565b91505092915050565b6000819050919050565b615aa181615a8e565b8114615aac57600080fd5b50565b600081359050615abe81615a98565b92915050565b60008060008060008060008060e0898b031215615ae457615ae361578a565b5b6000615af28b828c0161589a565b9850506020615b038b828c016158d3565b975050604089013567ffffffffffffffff811115615b2457615b2361578f565b5b615b308b828c016158f7565b9650965050606089013567ffffffffffffffff811115615b5357615b5261578f565b5b615b5f8b828c01615a60565b9450506080615b708b828c016158d3565b93505060a0615b818b828c01615aaf565b92505060c0615b928b828c01615aaf565b9150509295985092959890939650565b600060208284031215615bb857615bb761578a565b5b6000615bc68482850161589a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615c09578082015181840152602081019050615bee565b60008484015250505050565b6000615c2082615bcf565b615c2a8185615bda565b9350615c3a818560208601615beb565b615c4381615952565b840191505092915050565b60006020820190508181036000830152615c688184615c15565b905092915050565b600067ffffffffffffffff821115615c8b57615c8a615963565b5b615c9482615952565b9050602081019050919050565b6000615cb4615caf84615c70565b6159c3565b905082815260208101848484011115615cd057615ccf61594d565b5b615cdb848285615a0f565b509392505050565b600082601f830112615cf857615cf76158e8565b5b8135615d08848260208601615ca1565b91505092915050565b600060208284031215615d2757615d2661578a565b5b600082013567ffffffffffffffff811115615d4557615d4461578f565b5b615d5184828501615ce3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615d8582615d5a565b9050919050565b615d9581615d7a565b8114615da057600080fd5b50565b600081359050615db281615d8c565b92915050565b60008060408385031215615dcf57615dce61578a565b5b6000615ddd8582860161589a565b9250506020615dee85828601615da3565b9150509250929050565b60008060008060808587031215615e1257615e1161578a565b5b6000615e2087828801615da3565b9450506020615e3187828801615da3565b9350506040615e428782880161589a565b925050606085013567ffffffffffffffff811115615e6357615e6261578f565b5b615e6f87828801615a60565b91505092959194509250565b615e8481615794565b82525050565b6000602082019050615e9f6000830184615e7b565b92915050565b615eae81615d7a565b82525050565b6000602082019050615ec96000830184615ea5565b92915050565b600067ffffffffffffffff821115615eea57615ee9615963565b5b602082029050602081019050919050565b6000615f0e615f0984615ecf565b6159c3565b90508083825260208201905060208402830185811115615f3157615f306158f2565b5b835b81811015615f5a5780615f468882615da3565b845260208401935050602081019050615f33565b5050509392505050565b600082601f830112615f7957615f786158e8565b5b8135615f89848260208601615efb565b91505092915050565b600067ffffffffffffffff821115615fad57615fac615963565b5b602082029050602081019050919050565b6000615fd1615fcc84615f92565b6159c3565b90508083825260208201905060208402830185811115615ff457615ff36158f2565b5b835b8181101561601d5780616009888261589a565b845260208401935050602081019050615ff6565b5050509392505050565b600082601f83011261603c5761603b6158e8565b5b813561604c848260208601615fbe565b91505092915050565b600067ffffffffffffffff8211156160705761606f615963565b5b602082029050602081019050919050565b600061609461608f84616055565b6159c3565b905080838252602082019050602084028301858111156160b7576160b66158f2565b5b835b818110156160fe57803567ffffffffffffffff8111156160dc576160db6158e8565b5b8086016160e98982615a60565b855260208501945050506020810190506160b9565b5050509392505050565b600082601f83011261611d5761611c6158e8565b5b813561612d848260208601616081565b91505092915050565b600080600080608085870312156161505761614f61578a565b5b600085013567ffffffffffffffff81111561616e5761616d61578f565b5b61617a87828801615f64565b945050602085013567ffffffffffffffff81111561619b5761619a61578f565b5b6161a787828801616027565b935050604085013567ffffffffffffffff8111156161c8576161c761578f565b5b6161d487828801616108565b92505060606161e587828801615aaf565b91505092959194509250565b6161fa81615a8e565b82525050565b600060208201905061621560008301846161f1565b92915050565b600080600080600060a086880312156162375761623661578a565b5b60006162458882890161589a565b9550506020616256888289016158d3565b9450506040616267888289016158d3565b935050606061627888828901615aaf565b925050608061628988828901615aaf565b9150509295509295909350565b600080600080608085870312156162b0576162af61578a565b5b600085013567ffffffffffffffff8111156162ce576162cd61578f565b5b6162da87828801615ce3565b94505060206162eb8782880161589a565b93505060406162fc8782880161589a565b925050606061630d87828801615da3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061635957616358616319565b5b50565b600081905061636a82616348565b919050565b600061637a8261635c565b9050919050565b61638a8161636f565b82525050565b60006020820190506163a56000830184616381565b92915050565b600481106163bc576163bb616319565b5b50565b60008190506163cd826163ab565b919050565b60006163dd826163bf565b9050919050565b6163ed816163d2565b82525050565b600060208201905061640860008301846163e4565b92915050565b60008083601f840112616424576164236158e8565b5b8235905067ffffffffffffffff811115616441576164406158ed565b5b60208301915083600182028301111561645d5761645c6158f2565b5b9250929050565b6000806020838503121561647b5761647a61578a565b5b600083013567ffffffffffffffff8111156164995761649861578f565b5b6164a58582860161640e565b92509250509250929050565b60006060820190506164c66000830186615859565b6164d36020830185615859565b6164e06040830184615859565b949350505050565b600080604083850312156164ff576164fe61578a565b5b600061650d8582860161589a565b925050602061651e858286016158d3565b9150509250929050565b6000806000806000608086880312156165445761654361578a565b5b60006165528882890161589a565b9550506020616563888289016158d3565b945050604086013567ffffffffffffffff8111156165845761658361578f565b5b616590888289016158f7565b9350935050606086013567ffffffffffffffff8111156165b3576165b261578f565b5b6165bf88828901615a60565b9150509295509295909350565b6000602082840312156165e2576165e161578a565b5b60006165f084828501615da3565b91505092915050565b60006020828403121561660f5761660e61578a565b5b600082013567ffffffffffffffff81111561662d5761662c61578f565b5b61663984828501615a60565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061666982616642565b616673818561664d565b9350616683818560208601615beb565b61668c81615952565b840191505092915050565b60006040820190506166ac6000830185615825565b81810360208301526166be818461665e565b90509392505050565b600080600080606085870312156166e1576166e061578a565b5b60006166ef8782880161589a565b9450506020616700878288016158d3565b935050604085013567ffffffffffffffff8111156167215761672061578f565b5b61672d878288016158f7565b925092505092959194509250565b600080600080608085870312156167555761675461578a565b5b600085013567ffffffffffffffff8111156167735761677261578f565b5b61677f87828801615f64565b945050602085013567ffffffffffffffff8111156167a05761679f61578f565b5b6167ac87828801616027565b935050604085013567ffffffffffffffff8111156167cd576167cc61578f565b5b6167d987828801616108565b925050606085013567ffffffffffffffff8111156167fa576167f961578f565b5b61680687828801615ce3565b91505092959194509250565b60008060006060848603121561682b5761682a61578a565b5b600061683986828701615da3565b935050602061684a8682870161589a565b925050604084013567ffffffffffffffff81111561686b5761686a61578f565b5b61687786828701615a60565b9150509250925092565b600061688c82615d5a565b9050919050565b600061689e82616881565b9050919050565b6168ae81616893565b81146168b957600080fd5b50565b6000813590506168cb816168a5565b92915050565b6000602082840312156168e7576168e661578a565b5b60006168f5848285016168bc565b91505092915050565b600080600080600060a0868803121561691a5761691961578a565b5b600061692888828901615da3565b955050602061693988828901615da3565b945050604086013567ffffffffffffffff81111561695a5761695961578f565b5b61696688828901616027565b935050606086013567ffffffffffffffff8111156169875761698661578f565b5b61699388828901616027565b925050608086013567ffffffffffffffff8111156169b4576169b361578f565b5b6169c088828901615a60565b9150509295509295909350565b600080600080606085870312156169e7576169e661578a565b5b60006169f587828801615da3565b9450506020616a068782880161589a565b935050604085013567ffffffffffffffff811115616a2757616a2661578f565b5b616a338782880161640e565b925092505092959194509250565b60008060408385031215616a5857616a5761578a565b5b6000616a668582860161589a565b9250506020616a778582860161589a565b9150509250929050565b60008060408385031215616a9857616a9761578a565b5b6000616aa685828601615da3565b9250506020616ab78582860161589a565b9150509250929050565b600080600080600060a08688031215616add57616adc61578a565b5b6000616aeb88828901615da3565b9550506020616afc88828901615da3565b9450506040616b0d8882890161589a565b9350506060616b1e8882890161589a565b925050608086013567ffffffffffffffff811115616b3f57616b3e61578f565b5b616b4b88828901615a60565b9150509295509295909350565b6000819050919050565b6000616b7d616b78616b7384615d5a565b616b58565b615d5a565b9050919050565b6000616b8f82616b62565b9050919050565b6000616ba182616b84565b9050919050565b616bb181616b96565b82525050565b6000602082019050616bcc6000830184616ba8565b92915050565b600081905092915050565b6000616be98385616bd2565b9350616bf6838584615a0f565b82840190509392505050565b6000616c0f828486616bdd565b91508190509392505050565b616c24816158af565b82525050565b600060a082019050616c3f60008301886161f1565b616c4c6020830187615859565b616c596040830186616c1b565b616c6660608301856161f1565b616c7360808301846161f1565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616cb3601883615bda565b9150616cbe82616c7d565b602082019050919050565b60006020820190508181036000830152616ce281616ca6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616d3057607f821691505b602082108103616d4357616d42616ce9565b5b50919050565b50565b6000616d59600083616bd2565b9150616d6482616d49565b600082019050919050565b6000616d7a82616d4c565b9150819050919050565b600081905092915050565b6000616d9a82615bcf565b616da48185616d84565b9350616db4818560208601615beb565b80840191505092915050565b6000616dcc8284616d8f565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000616e33602183615bda565b9150616e3e82616dd7565b604082019050919050565b60006020820190508181036000830152616e6281616e26565b9050919050565b600081519050616e7881615883565b92915050565b600060208284031215616e9457616e9361578a565b5b6000616ea284828501616e69565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616ee081615d7a565b82525050565b6000616ef28383616ed7565b60208301905092915050565b6000602082019050919050565b6000616f1682616eab565b616f208185616eb6565b9350616f2b83616ec7565b8060005b83811015616f5c578151616f438882616ee6565b9750616f4e83616efe565b925050600181019050616f2f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616f9e8161584f565b82525050565b6000616fb08383616f95565b60208301905092915050565b6000602082019050919050565b6000616fd482616f69565b616fde8185616f74565b9350616fe983616f85565b8060005b8381101561701a5781516170018882616fa4565b975061700c83616fbc565b925050600181019050616fed565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061706f82616642565b6170798185617053565b9350617089818560208601615beb565b61709281615952565b840191505092915050565b60006170a98383617064565b905092915050565b6000602082019050919050565b60006170c982617027565b6170d38185617032565b9350836020820285016170e585617043565b8060005b858110156171215784840389528151617102858261709d565b945061710d836170b1565b925060208a019950506001810190506170e9565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061716561716061715b84617133565b61713d565b615a8e565b9050919050565b6171758161714a565b82525050565b600060a08201905081810360008301526171958188616f0b565b905081810360208301526171a98187616fc9565b905081810360408301526171bd81866170be565b90506171cc606083018561716c565b6171d960808301846161f1565b9695505050505050565b6000815190506171f281615a98565b92915050565b60006020828403121561720e5761720d61578a565b5b600061721c848285016171e3565b91505092915050565b600060c082019050818103600083015261723f8189616f0b565b905081810360208301526172538188616fc9565b9050818103604083015261726781876170be565b9050617276606083018661716c565b61728360808301856161f1565b61729060a0830184615859565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006172d58261584f565b91506172e08361584f565b92508282019050808211156172f8576172f761729b565b5b92915050565b60006040820190506173136000830185615859565b6173206020830184615859565b9392505050565b600060608201905061733c60008301866161f1565b6173496020830185615859565b6173566040830184616c1b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026173c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617383565b6173ca8683617383565b95508019841693508086168417925050509392505050565b60006173fd6173f86173f38461584f565b616b58565b61584f565b9050919050565b6000819050919050565b617417836173e2565b61742b61742382617404565b848454617390565b825550505050565b600090565b617440617433565b61744b81848461740e565b505050565b5b8181101561746f57617464600082617438565b600181019050617451565b5050565b601f8211156174b4576174858161735e565b61748e84617373565b8101602085101561749d578190505b6174b16174a985617373565b830182617450565b50505b505050565b600082821c905092915050565b60006174d7600019846008026174b9565b1980831691505092915050565b60006174f083836174c6565b9150826002028217905092915050565b61750982615bcf565b67ffffffffffffffff81111561752257617521615963565b5b61752c8254616d18565b617537828285617473565b600060209050601f83116001811461756a5760008415617558578287015190505b61756285826174e4565b8655506175ca565b601f1984166175788661735e565b60005b828110156175a05784890151825560018201915060208501945060208101905061757b565b868310156175bd57848901516175b9601f8916826174c6565b8355505b6001600288020188555050505b505050505050565b60006175dd8261584f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361760f5761760e61729b565b5b600182019050919050565b60006176258261584f565b91506176308361584f565b925082820261763e8161584f565b915082820484148315176176555761765461729b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006176968261584f565b91506176a18361584f565b9250826176b1576176b061765c565b5b828204905092915050565b60006176c78261584f565b91506176d28361584f565b92508282039050818111156176ea576176e961729b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201905081810360008301526177398187616f0b565b9050818103602083015261774d8186616fc9565b9050818103604083015261776181856170be565b905061777060608301846161f1565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006177d5602683615bda565b91506177e082617779565b604082019050919050565b60006020820190508181036000830152617804816177c8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617867602783615bda565b91506178728261780b565b604082019050919050565b600060208201905081810360008301526178968161785a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006178f9602683615bda565b91506179048261789d565b604082019050919050565b60006020820190508181036000830152617928816178ec565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b600061798b602383615bda565b91506179968261792f565b604082019050919050565b600060208201905081810360008301526179ba8161797e565b9050919050565b60006080820190506179d66000830187615859565b6179e36020830186616c1b565b6179f06040830185615859565b8181036060830152617a028184615c15565b905095945050505050565b600060a082019050617a226000830188615859565b617a2f6020830187616c1b565b617a3c6040830186615859565b8181036060830152617a4e8185615c15565b90508181036080830152617a62818461665e565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617af0604383615bda565b9150617afb82617a6e565b606082019050919050565b60006020820190508181036000830152617b1f81617ae3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617b5c602083615bda565b9150617b6782617b26565b602082019050919050565b60006020820190508181036000830152617b8b81617b4f565b9050919050565b617b9b81615819565b8114617ba657600080fd5b50565b600081519050617bb881617b92565b92915050565b600060208284031215617bd457617bd361578a565b5b6000617be284828501617ba9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617c21602083615bda565b9150617c2c82617beb565b602082019050919050565b60006020820190508181036000830152617c5081617c14565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617cb3603183615bda565b9150617cbe82617c57565b604082019050919050565b60006020820190508181036000830152617ce281617ca6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617d45602183615bda565b9150617d5082617ce9565b604082019050919050565b60006020820190508181036000830152617d7481617d38565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617db1601883615bda565b9150617dbc82617d7b565b602082019050919050565b60006020820190508181036000830152617de081617da4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000617e43602183615bda565b9150617e4e82617de7565b604082019050919050565b60006020820190508181036000830152617e7281617e36565b9050919050565b600067ffffffffffffffff82169050919050565b6000617e9882617e79565b9150617ea383617e79565b9250828201905067ffffffffffffffff811115617ec357617ec261729b565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000617f1182615bcf565b617f1b8185617ef5565b9350617f2b818560208601615beb565b617f3481615952565b840191505092915050565b6000617f4b8383617f06565b905092915050565b6000602082019050919050565b6000617f6b82617ec9565b617f758185617ed4565b935083602082028501617f8785617ee5565b8060005b85811015617fc35784840389528151617fa48582617f3f565b9450617faf83617f53565b925060208a01995050600181019050617f8b565b50829750879550505050505092915050565b6000617ff0617feb617fe684617e79565b616b58565b61584f565b9050919050565b61800081617fd5565b82525050565b60006101208201905061801c600083018c615859565b618029602083018b615ea5565b818103604083015261803b818a616f0b565b9050818103606083015261804f8189616fc9565b905081810360808301526180638188617f60565b905081810360a083015261807781876170be565b905061808660c0830186617ff7565b61809360e0830185617ff7565b8181036101008301526180a68184615c15565b90509a9950505050505050505050565b60006040820190506180cb6000830185615ea5565b6180d86020830184615859565b9392505050565b60006040820190506180f46000830185615ea5565b6181016020830184615ea5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618164602783615bda565b915061816f82618108565b604082019050919050565b6000602082019050818103600083015261819381618157565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006181d0600283616d84565b91506181db8261819a565b600282019050919050565b6000819050919050565b6182016181fc82615a8e565b6181e6565b82525050565b6000618212826181c3565b915061821e82856181f0565b60208201915061822e82846181f0565b6020820191508190509392505050565b600060808201905061825360008301876161f1565b6182606020830186616c1b565b61826d60408301856161f1565b61827a60608301846161f1565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006182b9601883615bda565b91506182c482618283565b602082019050919050565b600060208201905081810360008301526182e8816182ac565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618325601f83615bda565b9150618330826182ef565b602082019050919050565b6000602082019050818103600083015261835481618318565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006183b7602283615bda565b91506183c28261835b565b604082019050919050565b600060208201905081810360008301526183e6816183aa565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618449602283615bda565b9150618454826183ed565b604082019050919050565b600060208201905081810360008301526184788161843c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006184db602783615bda565b91506184e68261847f565b604082019050919050565b6000602082019050818103600083015261850a816184ce565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061856d603583615bda565b915061857882618511565b604082019050919050565b6000602082019050818103600083015261859c81618560565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006185d9601d83615bda565b91506185e4826185a3565b602082019050919050565b60006020820190508181036000830152618608816185cc565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061866b602683615bda565b91506186768261860f565b604082019050919050565b6000602082019050818103600083015261869a8161865e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006186fd602683615bda565b9150618708826186a1565b604082019050919050565b6000602082019050818103600083015261872c816186f0565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618769601d83615bda565b915061877482618733565b602082019050919050565b600060208201905081810360008301526187988161875c565b9050919050565b60006187aa82616642565b6187b48185616bd2565b93506187c4818560208601615beb565b80840191505092915050565b60006187dc828461879f565b915081905092915050565b600060a0820190506187fc60008301886161f1565b61880960208301876161f1565b61881660408301866161f1565b6188236060830185615859565b6188306080830184615ea5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220c2f510f48babb01f26563e04fd4d581d09065fd3103913bd8e2508c65acef2cf64736f6c63430008110033", "devdoc": { "errors": { "Empty()": [ @@ -1397,6 +2065,9 @@ "onERC721Received(address,address,uint256,bytes)": { "details": "See {IERC721Receiver-onERC721Received}." }, + "owner()": { + "details": "Returns the address of the current owner." + }, "proposalDeadline(uint256)": { "details": "See {IGovernor-proposalDeadline}." }, @@ -1424,6 +2095,9 @@ "relay(address,uint256,bytes)": { "details": "Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant." }, + "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." + }, "setProposalThreshold(uint256)": { "details": "Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event." }, @@ -1436,6 +2110,9 @@ "timelock()": { "details": "Public accessor to check the address of the timelock" }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, "updateQuorumNumerator(uint256)": { "details": "Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator." }, @@ -1456,7 +2133,7 @@ "storageLayout": { "storage": [ { - "astId": 565, + "astId": 623, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_name", "offset": 0, @@ -1464,23 +2141,23 @@ "type": "t_string_storage" }, { - "astId": 570, + "astId": 628, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_proposals", "offset": 0, "slot": "1", - "type": "t_mapping(t_uint256,t_struct(ProposalCore)563_storage)" + "type": "t_mapping(t_uint256,t_struct(ProposalCore)621_storage)" }, { - "astId": 573, + "astId": 631, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_governanceCall", "offset": 0, "slot": "2", - "type": "t_struct(Bytes32Deque)8151_storage" + "type": "t_struct(Bytes32Deque)8209_storage" }, { - "astId": 3238, + "astId": 3296, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_votingDelay", "offset": 0, @@ -1488,7 +2165,7 @@ "type": "t_uint256" }, { - "astId": 3240, + "astId": 3298, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_votingPeriod", "offset": 0, @@ -1496,7 +2173,7 @@ "type": "t_uint256" }, { - "astId": 3242, + "astId": 3300, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_proposalThreshold", "offset": 0, @@ -1504,15 +2181,15 @@ "type": "t_uint256" }, { - "astId": 3030, + "astId": 3088, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_proposalVotes", "offset": 0, "slot": "7", - "type": "t_mapping(t_uint256,t_struct(ProposalVote)3025_storage)" + "type": "t_mapping(t_uint256,t_struct(ProposalVote)3083_storage)" }, { - "astId": 3841, + "astId": 3899, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_quorumNumerator", "offset": 0, @@ -1520,23 +2197,23 @@ "type": "t_uint256" }, { - "astId": 3844, + "astId": 3902, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_quorumNumeratorHistory", "offset": 0, "slot": "9", - "type": "t_struct(History)4518_storage" + "type": "t_struct(History)4576_storage" }, { - "astId": 3421, + "astId": 3479, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_timelock", "offset": 0, "slot": "10", - "type": "t_contract(TimelockController)3004" + "type": "t_contract(TimelockController)3062" }, { - "astId": 3425, + "astId": 3483, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_timelockIds", "offset": 0, @@ -1544,11 +2221,147 @@ "type": "t_mapping(t_uint256,t_bytes32)" }, { - "astId": 8578, + "astId": 458, "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "inWhiteList", + "label": "_owner", "offset": 0, "slot": "12", + "type": "t_address" + }, + { + "astId": 8561, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "projectId", + "offset": 0, + "slot": "13", + "type": "t_uint256" + }, + { + "astId": 8563, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "lastTimeStamp", + "offset": 0, + "slot": "14", + "type": "t_uint256" + }, + { + "astId": 8565, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "daoPercentage", + "offset": 0, + "slot": "15", + "type": "t_uint256" + }, + { + "astId": 8567, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "enteranceFee", + "offset": 0, + "slot": "16", + "type": "t_uint256" + }, + { + "astId": 8569, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "projectOwners", + "offset": 0, + "slot": "17", + "type": "t_address_payable" + }, + { + "astId": 8573, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_isFunding", + "offset": 0, + "slot": "18", + "type": "t_mapping(t_uint256,t_bool)" + }, + { + "astId": 8579, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "projectToTime", + "offset": 0, + "slot": "19", + "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))" + }, + { + "astId": 8583, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "time", + "offset": 0, + "slot": "20", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 8587, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "hashToProjectId", + "offset": 0, + "slot": "21", + "type": "t_mapping(t_string_memory_ptr,t_uint256)" + }, + { + "astId": 8591, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "idToHash", + "offset": 0, + "slot": "22", + "type": "t_mapping(t_uint256,t_string_storage)" + }, + { + "astId": 8597, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "funders", + "offset": 0, + "slot": "23", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" + }, + { + "astId": 8601, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "projectFunds", + "offset": 0, + "slot": "24", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 8605, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "projectFundingGoalAmount", + "offset": 0, + "slot": "25", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 8609, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_isApporovedByDao", + "offset": 0, + "slot": "26", + "type": "t_mapping(t_uint256,t_bool)" + }, + { + "astId": 8613, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "projectOwnerAddress", + "offset": 0, + "slot": "27", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 8618, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "_ProjectFundingStatus", + "offset": 0, + "slot": "28", + "type": "t_mapping(t_uint256,t_enum(ProjectFundingStatus)8558)" + }, + { + "astId": 9117, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "inWhiteList", + "offset": 0, + "slot": "29", "type": "t_mapping(t_address,t_bool)" } ], @@ -1558,8 +2371,13 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)4513_storage)dyn_storage": { - "base": "t_struct(Checkpoint)4513_storage", + "t_address_payable": { + "encoding": "inplace", + "label": "address payable", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)4571_storage)dyn_storage": { + "base": "t_struct(Checkpoint)4571_storage", "encoding": "dynamic_array", "label": "struct Checkpoints.Checkpoint[]", "numberOfBytes": "32" @@ -1574,11 +2392,16 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(TimelockController)3004": { + "t_contract(TimelockController)3062": { "encoding": "inplace", "label": "contract TimelockController", "numberOfBytes": "20" }, + "t_enum(ProjectFundingStatus)8558": { + "encoding": "inplace", + "label": "enum FundProject.ProjectFundingStatus", + "numberOfBytes": "1" + }, "t_int128": { "encoding": "inplace", "label": "int128", @@ -1591,6 +2414,13 @@ "numberOfBytes": "32", "value": "t_bool" }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, "t_mapping(t_int128,t_bytes32)": { "encoding": "mapping", "key": "t_int128", @@ -1598,6 +2428,27 @@ "numberOfBytes": "32", "value": "t_bytes32" }, + "t_mapping(t_string_memory_ptr,t_uint256)": { + "encoding": "mapping", + "key": "t_string_memory_ptr", + "label": "mapping(string => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_uint256,t_bool)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, "t_mapping(t_uint256,t_bytes32)": { "encoding": "mapping", "key": "t_uint256", @@ -1605,31 +2456,71 @@ "numberOfBytes": "32", "value": "t_bytes32" }, - "t_mapping(t_uint256,t_struct(ProposalCore)563_storage)": { + "t_mapping(t_uint256,t_enum(ProjectFundingStatus)8558)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => enum FundProject.ProjectFundingStatus)", + "numberOfBytes": "32", + "value": "t_enum(ProjectFundingStatus)8558" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => mapping(uint256 => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_uint256,t_uint256)" + }, + "t_mapping(t_uint256,t_string_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => string)", + "numberOfBytes": "32", + "value": "t_string_storage" + }, + "t_mapping(t_uint256,t_struct(ProposalCore)621_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct Governor.ProposalCore)", "numberOfBytes": "32", - "value": "t_struct(ProposalCore)563_storage" + "value": "t_struct(ProposalCore)621_storage" }, - "t_mapping(t_uint256,t_struct(ProposalVote)3025_storage)": { + "t_mapping(t_uint256,t_struct(ProposalVote)3083_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct GovernorCountingSimple.ProposalVote)", "numberOfBytes": "32", - "value": "t_struct(ProposalVote)3025_storage" + "value": "t_struct(ProposalVote)3083_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_memory_ptr": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" }, "t_string_storage": { "encoding": "bytes", "label": "string", "numberOfBytes": "32" }, - "t_struct(BlockNumber)5096_storage": { + "t_struct(BlockNumber)5154_storage": { "encoding": "inplace", "label": "struct Timers.BlockNumber", "members": [ { - "astId": 5095, + "astId": 5153, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_deadline", "offset": 0, @@ -1639,12 +2530,12 @@ ], "numberOfBytes": "32" }, - "t_struct(Bytes32Deque)8151_storage": { + "t_struct(Bytes32Deque)8209_storage": { "encoding": "inplace", "label": "struct DoubleEndedQueue.Bytes32Deque", "members": [ { - "astId": 8144, + "astId": 8202, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_begin", "offset": 0, @@ -1652,7 +2543,7 @@ "type": "t_int128" }, { - "astId": 8146, + "astId": 8204, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_end", "offset": 16, @@ -1660,7 +2551,7 @@ "type": "t_int128" }, { - "astId": 8150, + "astId": 8208, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_data", "offset": 0, @@ -1670,12 +2561,12 @@ ], "numberOfBytes": "64" }, - "t_struct(Checkpoint)4513_storage": { + "t_struct(Checkpoint)4571_storage": { "encoding": "inplace", "label": "struct Checkpoints.Checkpoint", "members": [ { - "astId": 4510, + "astId": 4568, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_blockNumber", "offset": 0, @@ -1683,7 +2574,7 @@ "type": "t_uint32" }, { - "astId": 4512, + "astId": 4570, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_value", "offset": 4, @@ -1693,43 +2584,43 @@ ], "numberOfBytes": "32" }, - "t_struct(History)4518_storage": { + "t_struct(History)4576_storage": { "encoding": "inplace", "label": "struct Checkpoints.History", "members": [ { - "astId": 4517, + "astId": 4575, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_checkpoints", "offset": 0, "slot": "0", - "type": "t_array(t_struct(Checkpoint)4513_storage)dyn_storage" + "type": "t_array(t_struct(Checkpoint)4571_storage)dyn_storage" } ], "numberOfBytes": "32" }, - "t_struct(ProposalCore)563_storage": { + "t_struct(ProposalCore)621_storage": { "encoding": "inplace", "label": "struct Governor.ProposalCore", "members": [ { - "astId": 555, + "astId": 613, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "voteStart", "offset": 0, "slot": "0", - "type": "t_struct(BlockNumber)5096_storage" + "type": "t_struct(BlockNumber)5154_storage" }, { - "astId": 558, + "astId": 616, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "voteEnd", "offset": 0, "slot": "1", - "type": "t_struct(BlockNumber)5096_storage" + "type": "t_struct(BlockNumber)5154_storage" }, { - "astId": 560, + "astId": 618, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "executed", "offset": 0, @@ -1737,7 +2628,7 @@ "type": "t_bool" }, { - "astId": 562, + "astId": 620, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "canceled", "offset": 1, @@ -1747,12 +2638,12 @@ ], "numberOfBytes": "96" }, - "t_struct(ProposalVote)3025_storage": { + "t_struct(ProposalVote)3083_storage": { "encoding": "inplace", "label": "struct GovernorCountingSimple.ProposalVote", "members": [ { - "astId": 3016, + "astId": 3074, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "againstVotes", "offset": 0, @@ -1760,7 +2651,7 @@ "type": "t_uint256" }, { - "astId": 3018, + "astId": 3076, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "forVotes", "offset": 0, @@ -1768,7 +2659,7 @@ "type": "t_uint256" }, { - "astId": 3020, + "astId": 3078, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "abstainVotes", "offset": 0, @@ -1776,7 +2667,7 @@ "type": "t_uint256" }, { - "astId": 3024, + "astId": 3082, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "hasVoted", "offset": 0, diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json index 3489558..318fbc0 100644 --- a/deployments/localhost/TimeLock.json +++ b/deployments/localhost/TimeLock.json @@ -1,5 +1,5 @@ { - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "abi": [ { "inputs": [ @@ -867,22 +867,22 @@ "type": "receive" } ], - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "contractAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "contractAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "transactionIndex": 0, "gasUsed": "3021451", - "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000400000001000000400000000040200200000010200000000000000000000000000010000000000000000000000000000000000001400000000000020000400000000100000800000000000000000000020000000000000000000000000000000000000000000000000000000000080000000000000000000000000020000000000000000000000000000000000000001000000000000000000000000000204000000000000000000200002000000100000100200020000000000000001000000000000000000000000000000000400000000000000000", - "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c", - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", + "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000000000001000000000000000000000200000010200000000000000000000000000010000000000000000000000000000000000001000000000040020000400000000100800800000004000000000000020000000000000000000000000000000000000000000000000000000000080000000200000000000000000020000000000000000000000000000000000000001000000000000000000040000000204000000000000000000200002008000100000100200020000000000000001000000000000000000000000000000000000000000000000000", + "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72", + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", "logs": [ { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 1, + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", @@ -891,13 +891,13 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" + "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 1, + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", "0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1", @@ -906,13 +906,13 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" + "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 1, + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", "0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63", @@ -921,13 +921,13 @@ ], "data": "0x", "logIndex": 2, - "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" + "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 1, + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", "0xfd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", @@ -936,13 +936,13 @@ ], "data": "0x", "logIndex": 3, - "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" + "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 1, + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", @@ -951,37 +951,37 @@ ], "data": "0x", "logIndex": 4, - "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" + "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 1, + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", - "0x0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0", + "0x0000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3", "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" ], "data": "0x", "logIndex": 5, - "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" + "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" }, { "transactionIndex": 0, - "blockNumber": 3, - "transactionHash": "0x82cd4ce0fb60238555c1a92ba48759fad84b484b32b53df95b674d77092552cf", - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "blockNumber": 1, + "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0x11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 6, - "blockHash": "0x6707ae522d2596fb81dee9268b06232bf2782d86c3cdb8116dc619961dc4b50c" + "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" } ], - "blockNumber": 3, + "blockNumber": 1, "cumulativeGasUsed": "3021451", "status": 1, "byzantium": true @@ -992,7 +992,7 @@ [] ], "numDeployments": 1, - "solcInputHash": "66f18b8ec322110c2dd2cceea16c0aca", + "solcInputHash": "865f8451b79a875f15c7120a0497c47b", "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minDelay\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"executers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"CallScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"Cancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDuration\",\"type\":\"uint256\"}],\"name\":\"MinDelayChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCELLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXECUTOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMELOCK_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"cancel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperationBatch\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationDone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationPending\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ready\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"schedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"scheduleBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDelay\",\"type\":\"uint256\"}],\"name\":\"updateDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancel(bytes32)\":{\"details\":\"Cancel an operation. Requirements: - the caller must have the 'canceller' role.\"},\"execute(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role.\"},\"executeBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role.\"},\"getMinDelay()\":{\"details\":\"Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations).\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hashOperation(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a single transaction.\"},\"hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a batch of transactions.\"},\"isOperation(bytes32)\":{\"details\":\"Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations.\"},\"isOperationDone(bytes32)\":{\"details\":\"Returns whether an operation is done or not.\"},\"isOperationPending(bytes32)\":{\"details\":\"Returns whether an operation is pending or not.\"},\"isOperationReady(bytes32)\":{\"details\":\"Returns whether an operation is ready or not.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"schedule(address,uint256,bytes,bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role.\"},\"scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"updateDelay(uint256)\":{\"details\":\"Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLock.sol\":\"TimeLock\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/TimeLock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/TimelockController.sol\\\";\\n\\ncontract TimeLock is TimelockController {\\n // minDelay: How long you have to wait before executing\\n // proposers is the list of addresses that can purpose\\n // executers: Who can execute when proposal passes\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executers\\n ) TimelockController(minDelay, proposers, executers) {}\\n}\\n\",\"keccak256\":\"0x6e48ab9ddd3998d94cdd53158d3d0d16984ac638fb4f685fae7fd734254e3c11\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523480156200001157600080fd5b5060405162003bd838038062003bd8833981810160405281019062000037919062000779565b8282826200006c7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5806200035560201b60201c565b620000be7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc17f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001107fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e637f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7837f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001a37f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca562000197620003b860201b60201c565b620003c060201b60201c565b620001d57f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca530620003c060201b60201c565b60005b82518110156200029457620002317fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc18483815181106200021d576200021c62000813565b5b6020026020010151620003c060201b60201c565b620002807ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7838483815181106200026c576200026b62000813565b5b6020026020010151620003c060201b60201c565b806200028c9062000871565b9050620001d8565b5060005b81518110156200030557620002f17fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63838381518110620002dd57620002dc62000813565b5b6020026020010151620003c060201b60201c565b80620002fd9062000871565b905062000298565b50826002819055507f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5600084604051620003419291906200091c565b60405180910390a150505050505062000949565b60006200036883620003d660201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b620003d28282620003f560201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b620004078282620004e660201b60201c565b620004e257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000487620003b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620005798162000564565b81146200058557600080fd5b50565b60008151905062000599816200056e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005ef82620005a4565b810181811067ffffffffffffffff82111715620006115762000610620005b5565b5b80604052505050565b60006200062662000550565b9050620006348282620005e4565b919050565b600067ffffffffffffffff821115620006575762000656620005b5565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200069a826200066d565b9050919050565b620006ac816200068d565b8114620006b857600080fd5b50565b600081519050620006cc81620006a1565b92915050565b6000620006e9620006e38462000639565b6200061a565b905080838252602082019050602084028301858111156200070f576200070e62000668565b5b835b818110156200073c5780620007278882620006bb565b84526020840193505060208101905062000711565b5050509392505050565b600082601f8301126200075e576200075d6200059f565b5b815162000770848260208601620006d2565b91505092915050565b6000806000606084860312156200079557620007946200055a565b5b6000620007a58682870162000588565b935050602084015167ffffffffffffffff811115620007c957620007c86200055f565b5b620007d78682870162000746565b925050604084015167ffffffffffffffff811115620007fb57620007fa6200055f565b5b620008098682870162000746565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200087e8262000564565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620008b357620008b262000842565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000620008f3620008ed620008e784620008be565b620008c8565b62000564565b9050919050565b6200090581620008d2565b82525050565b620009168162000564565b82525050565b6000604082019050620009336000830185620008fa565b6200094260208301846200090b565b9392505050565b61327f80620009596000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", "deployedBytecode": "0x6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", @@ -1079,15 +1079,15 @@ "storageLayout": { "storage": [ { - "astId": 24, + "astId": 82, "contract": "contracts/TimeLock.sol:TimeLock", "label": "_roles", "offset": 0, "slot": "0", - "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + "type": "t_mapping(t_bytes32,t_struct(RoleData)77_storage)" }, { - "astId": 2142, + "astId": 2200, "contract": "contracts/TimeLock.sol:TimeLock", "label": "_timestamps", "offset": 0, @@ -1095,7 +1095,7 @@ "type": "t_mapping(t_bytes32,t_uint256)" }, { - "astId": 2144, + "astId": 2202, "contract": "contracts/TimeLock.sol:TimeLock", "label": "_minDelay", "offset": 0, @@ -1126,12 +1126,12 @@ "numberOfBytes": "32", "value": "t_bool" }, - "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "t_mapping(t_bytes32,t_struct(RoleData)77_storage)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => struct AccessControl.RoleData)", "numberOfBytes": "32", - "value": "t_struct(RoleData)19_storage" + "value": "t_struct(RoleData)77_storage" }, "t_mapping(t_bytes32,t_uint256)": { "encoding": "mapping", @@ -1140,12 +1140,12 @@ "numberOfBytes": "32", "value": "t_uint256" }, - "t_struct(RoleData)19_storage": { + "t_struct(RoleData)77_storage": { "encoding": "inplace", "label": "struct AccessControl.RoleData", "members": [ { - "astId": 16, + "astId": 74, "contract": "contracts/TimeLock.sol:TimeLock", "label": "members", "offset": 0, @@ -1153,7 +1153,7 @@ "type": "t_mapping(t_address,t_bool)" }, { - "astId": 18, + "astId": 76, "contract": "contracts/TimeLock.sol:TimeLock", "label": "adminRole", "offset": 0, diff --git a/deployments/localhost/solcInputs/0934ff3c9c2ecd6d365975d91fef7cb5.json b/deployments/localhost/solcInputs/0934ff3c9c2ecd6d365975d91fef7cb5.json deleted file mode 100644 index 2411c7d..0000000 --- a/deployments/localhost/solcInputs/0934ff3c9c2ecd6d365975d91fef7cb5.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/FundProject.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract FundProject is Ownable {\n error FundProject__NotApporovedByDao();\n\n uint256 public projectId = 1;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => bool) public _isApporovedByDao;\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n }\n\n function apporoveFundingByDao(string memory _ipfsHash) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n _isApporovedByDao[projectId] = true;\n projectId++;\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_projecID] = false;\n }\n\n function _isapporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n}\n" - }, - "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/deployments/localhost/solcInputs/66f18b8ec322110c2dd2cceea16c0aca.json b/deployments/localhost/solcInputs/865f8451b79a875f15c7120a0497c47b.json similarity index 93% rename from deployments/localhost/solcInputs/66f18b8ec322110c2dd2cceea16c0aca.json rename to deployments/localhost/solcInputs/865f8451b79a875f15c7120a0497c47b.json index 753b548..186dbd7 100644 --- a/deployments/localhost/solcInputs/66f18b8ec322110c2dd2cceea16c0aca.json +++ b/deployments/localhost/solcInputs/865f8451b79a875f15c7120a0497c47b.json @@ -1,80 +1,65 @@ { "language": "Solidity", "sources": { - "contracts/Box.sol": { - "content": "// contracts/Box.sol\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract Box is Ownable {\n uint256 private value;\n\n // Emitted when the stored value changes\n event ValueChanged(uint256 newValue);\n\n // Stores a new value in the contract\n function store(uint256 newValue) public onlyOwner {\n value = newValue;\n emit ValueChanged(newValue);\n }\n\n // Reads the last stored value\n function retrieve() public view returns (uint256) {\n return value;\n }\n}\n" + "contracts/FundProject.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n error FundProject__NotApporovedByDao();\n error FundProject__UpkeepNeeded();\n error FundProject__TransferFailed(uint256 _projectId);\n error FundProject__NotEnoughPayment();\n error FundProject__withdrawFund();\n error FundProject__WithdrawTransferFailed();\n\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n address payable projectOwners;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n projectId++;\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (\n bool upkeepNeeded,\n bytes memory /* performData */\n )\n {\n upkeepNeeded = (_isFunding[projectId] &&\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\n projectToTime[projectId][time[projectId]]);\n }\n\n function performUpkeep(\n bytes calldata /* performData */\n ) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n _isFunding[projectId] = false;\n _isApporovedByDao[projectId] = false;\n\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\n 100;\n (bool success, ) = (projectOwnerAddress[projectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[projectId]);\n }\n\n emit projectSuccessfullyFunded(projectId);\n } else {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(projectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value < enteranceFee) {\n revert FundProject__NotEnoughPayment();\n }\n projectOwners = payable(msg.sender);\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n}\n" }, "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" }, + "@chainlink/contracts/src/v0.8/AutomationCompatible.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./AutomationBase.sol\";\nimport \"./interfaces/AutomationCompatibleInterface.sol\";\n\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\n" + }, "@openzeppelin/contracts/utils/Context.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" }, - "@openzeppelin/contracts/token/ERC20/ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + "@chainlink/contracts/src/v0.8/AutomationBase.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract AutomationBase {\n error OnlySimulatedBackend();\n\n /**\n * @notice method that allows it to be simulated via eth_call by checking that\n * the sender is the zero address.\n */\n function preventExecution() internal view {\n if (tx.origin != address(0)) {\n revert OnlySimulatedBackend();\n }\n }\n\n /**\n * @notice modifier that allows it to be simulated via eth_call by checking\n * that the sender is the zero address.\n */\n modifier cannotExecute() {\n preventExecution();\n _;\n }\n}\n" }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AutomationCompatibleInterface {\n /**\n * @notice method that is simulated by the keepers to see if any work actually\n * needs to be performed. This method does does not actually need to be\n * executable, and since it is only ever simulated it can consume lots of gas.\n * @dev To ensure that it is never called, you may want to add the\n * cannotExecute modifier from KeeperBase to your implementation of this\n * method.\n * @param checkData specified in the upkeep registration so it is always the\n * same for a registered upkeep. This can easily be broken down into specific\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\n * same contract and easily differentiated by the contract.\n * @return upkeepNeeded boolean to indicate whether the keeper should call\n * performUpkeep or not.\n * @return performData bytes that the keeper should call performUpkeep with, if\n * upkeep is needed. If you would like to encode data to decode later, try\n * `abi.encode`.\n */\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\n\n /**\n * @notice method that is actually executed by the keepers, via the registry.\n * The data returned by the checkUpkeep simulation will be passed into\n * this method to actually be executed.\n * @dev The input to this method should not be trusted, and the caller of the\n * method should not even be restricted to any single registry. Anyone should\n * be able call it, and the input should be validated, there is no guarantee\n * that the data passed in is the performData returned from checkUpkeep. This\n * could happen due to malicious keepers, racing keepers, or simply a state\n * change while the performUpkeep transaction is waiting for confirmation.\n * Always validate the data passed in.\n * @param performData is the data which was passed back from the checkData\n * simulation. If it is encoded, it can easily be decoded into other types by\n * calling `abi.decode`. This data should not be trusted, and should be\n * validated against the contract's current state.\n */\n function performUpkeep(bytes calldata performData) external;\n}\n" }, - "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" - }, - "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" + "contracts/GovernerContract.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\nimport \"./FundProject.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl,\n FundProject\n{\n error GovernerContract__NotApporovedByDaoFoundation();\n\n mapping(address => bool) public inWhiteList;\n\n modifier isSubmitFeePaid() {\n paySubmitFee();\n _;\n }\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage,\n uint256 _enteranceFee,\n uint256 _daoPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n FundProject(_enteranceFee, _daoPercentage)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) isSubmitFeePaid returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + "@openzeppelin/contracts/governance/Governor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, - "@openzeppelin/contracts/utils/Counters.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" }, - "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" }, - "@openzeppelin/contracts/utils/Strings.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 Strings {\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" + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" }, - "@openzeppelin/contracts/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" }, - "@openzeppelin/contracts/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + "@openzeppelin/contracts/governance/IGovernor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" }, "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, - "@openzeppelin/contracts/governance/TimelockController.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" + "@openzeppelin/contracts/utils/Timers.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" }, "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/Governor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IGovernor.sol\";\n\n/**\n * @dev Extension of the {IGovernor} for timelock supporting modules.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernorTimelock is IGovernor {\n event ProposalQueued(uint256 proposalId, uint256 eta);\n\n function timelock() public view virtual returns (address);\n\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\n\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual returns (uint256 proposalId);\n}\n" - }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" + "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" }, - "@openzeppelin/contracts/utils/Timers.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" }, "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" @@ -82,20 +67,26 @@ "@openzeppelin/contracts/utils/math/SafeCast.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" }, - "contracts/GovernerContract.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl\n{\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" + "@openzeppelin/contracts/utils/Strings.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 Strings {\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" }, - "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" + "@openzeppelin/contracts/governance/TimelockController.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IGovernor.sol\";\n\n/**\n * @dev Extension of the {IGovernor} for timelock supporting modules.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernorTimelock is IGovernor {\n event ProposalQueued(uint256 proposalId, uint256 eta);\n\n function timelock() public view virtual returns (address);\n\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\n\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual returns (uint256 proposalId);\n}\n" + }, + "@openzeppelin/contracts/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" }, "@openzeppelin/contracts/governance/utils/IVotes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" @@ -109,11 +100,29 @@ "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" }, - "contracts/GovernanceToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\n\ncontract GovernanceToken is ERC20Votes {\n uint256 public s_initialSupply = 1000000e18;\n address private immutable i_owner;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n modifier onlyOwner() {\n require(i_owner == msg.sender, \"Ownable: caller is not the owner\");\n _;\n }\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n i_owner = msg.sender;\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" + "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" }, "contracts/TimeLock.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/TimelockController.sol\";\n\ncontract TimeLock is TimelockController {\n // minDelay: How long you have to wait before executing\n // proposers is the list of addresses that can purpose\n // executers: Who can execute when proposal passes\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executers\n ) TimelockController(minDelay, proposers, executers) {}\n}\n" + }, + "contracts/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract GovernanceToken is ERC20Votes, Ownable {\n uint256 public s_initialSupply = 1000000e18;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" } }, "settings": { diff --git a/deployments/localhost/solcInputs/c3bd0fff8e093c1104055db0ec135b98.json b/deployments/localhost/solcInputs/f3989c9674956bada0a1ffc4cf72c075.json similarity index 92% rename from deployments/localhost/solcInputs/c3bd0fff8e093c1104055db0ec135b98.json rename to deployments/localhost/solcInputs/f3989c9674956bada0a1ffc4cf72c075.json index b0471c2..7dfae5b 100644 --- a/deployments/localhost/solcInputs/c3bd0fff8e093c1104055db0ec135b98.json +++ b/deployments/localhost/solcInputs/f3989c9674956bada0a1ffc4cf72c075.json @@ -1,14 +1,32 @@ { "language": "Solidity", "sources": { + "contracts/FundProject.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n error FundProject__NotApporovedByDao();\n error FundProject__UpkeepNeeded();\n error FundProject__TransferFailed(uint256 _projectId);\n error FundProject__NotEnoughPayment();\n error FundProject__withdrawFund();\n error FundProject__WithdrawTransferFailed();\n\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n address payable projectOwners;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n projectId++;\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (\n bool upkeepNeeded,\n bytes memory /* performData */\n )\n {\n upkeepNeeded = (_isFunding[projectId] &&\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\n projectToTime[projectId][time[projectId]]);\n }\n\n function performUpkeep(\n bytes calldata /* performData */\n ) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n _isFunding[projectId] = false;\n _isApporovedByDao[projectId] = false;\n\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\n 100;\n (bool success, ) = (projectOwnerAddress[projectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[projectId]);\n }\n\n emit projectSuccessfullyFunded(projectId);\n } else {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(projectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value > enteranceFee) {\n projectOwners = payable(msg.sender);\n } else {\n revert FundProject__NotEnoughPayment();\n }\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n}\n" + }, + "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" + }, + "@chainlink/contracts/src/v0.8/AutomationCompatible.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./AutomationBase.sol\";\nimport \"./interfaces/AutomationCompatibleInterface.sol\";\n\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" + }, + "@chainlink/contracts/src/v0.8/AutomationBase.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract AutomationBase {\n error OnlySimulatedBackend();\n\n /**\n * @notice method that allows it to be simulated via eth_call by checking that\n * the sender is the zero address.\n */\n function preventExecution() internal view {\n if (tx.origin != address(0)) {\n revert OnlySimulatedBackend();\n }\n }\n\n /**\n * @notice modifier that allows it to be simulated via eth_call by checking\n * that the sender is the zero address.\n */\n modifier cannotExecute() {\n preventExecution();\n _;\n }\n}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AutomationCompatibleInterface {\n /**\n * @notice method that is simulated by the keepers to see if any work actually\n * needs to be performed. This method does does not actually need to be\n * executable, and since it is only ever simulated it can consume lots of gas.\n * @dev To ensure that it is never called, you may want to add the\n * cannotExecute modifier from KeeperBase to your implementation of this\n * method.\n * @param checkData specified in the upkeep registration so it is always the\n * same for a registered upkeep. This can easily be broken down into specific\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\n * same contract and easily differentiated by the contract.\n * @return upkeepNeeded boolean to indicate whether the keeper should call\n * performUpkeep or not.\n * @return performData bytes that the keeper should call performUpkeep with, if\n * upkeep is needed. If you would like to encode data to decode later, try\n * `abi.encode`.\n */\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\n\n /**\n * @notice method that is actually executed by the keepers, via the registry.\n * The data returned by the checkUpkeep simulation will be passed into\n * this method to actually be executed.\n * @dev The input to this method should not be trusted, and the caller of the\n * method should not even be restricted to any single registry. Anyone should\n * be able call it, and the input should be validated, there is no guarantee\n * that the data passed in is the performData returned from checkUpkeep. This\n * could happen due to malicious keepers, racing keepers, or simply a state\n * change while the performUpkeep transaction is waiting for confirmation.\n * Always validate the data passed in.\n * @param performData is the data which was passed back from the checkData\n * simulation. If it is encoded, it can easily be decoded into other types by\n * calling `abi.decode`. This data should not be trusted, and should be\n * validated against the contract's current state.\n */\n function performUpkeep(bytes calldata performData) external;\n}\n" + }, "contracts/GovernerContract.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl\n{\n error GovernerContract__NotApporovedByDaoFoundation();\n\n mapping(address => bool) public inWhiteList;\n\n modifier isApporovedByDaoFoundation() {\n if (!inWhiteList[msg.sender])\n revert GovernerContract__NotApporovedByDaoFoundation();\n _;\n }\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\nimport \"./FundProject.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl,\n FundProject\n{\n error GovernerContract__NotApporovedByDaoFoundation();\n\n mapping(address => bool) public inWhiteList;\n\n modifier isSubmitFeePaid() {\n paySubmitFee();\n _;\n }\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage,\n uint256 _enteranceFee,\n uint256 _daoPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n FundProject(_enteranceFee, _daoPercentage)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) isSubmitFeePaid returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" }, "@openzeppelin/contracts/governance/Governor.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" }, "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" @@ -19,48 +37,54 @@ "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" }, "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" - }, "@openzeppelin/contracts/utils/Timers.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + "@openzeppelin/contracts/governance/IGovernor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" }, - "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" + "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" }, "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + }, "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, - "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" }, "@openzeppelin/contracts/utils/math/SafeCast.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, "@openzeppelin/contracts/utils/introspection/IERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" }, "@openzeppelin/contracts/utils/Strings.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 Strings {\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" }, + "@openzeppelin/contracts/utils/Checkpoints.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" + }, "@openzeppelin/contracts/governance/TimelockController.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, @@ -72,21 +96,6 @@ }, "@openzeppelin/contracts/access/IAccessControl.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" - }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" - }, - "@openzeppelin/contracts/utils/Checkpoints.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" - }, - "contracts/FundProject.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract FundProject is Ownable {\n error FundProject__NotApporovedByDao();\n\n mapping(bytes32 => mapping(address => uint256)) public funders;\n mapping(bytes32 => bool) public _isApporovedByDao;\n\n modifier isApporovedByDao(bytes32 _ipfsHash) {\n if (!_isApporovedByDao[_ipfsHash])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n function fund(bytes32 ipfsHash) public payable isApporovedByDao(ipfsHash) {\n funders[ipfsHash][msg.sender] += msg.value;\n }\n\n function apporoveFundingByDao(bytes32 _project) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_project] = true;\n }\n\n function cancelApporovelFundingByDao(bytes32 _project) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_project] = false;\n }\n}\n" - }, - "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" } }, "settings": { diff --git a/helper-config.js b/helper-config.js index 19fd7f0..5a3493a 100644 --- a/helper-config.js +++ b/helper-config.js @@ -3,9 +3,13 @@ const { ethers } = require("hardhat"); const networkConfig = { 5: { name: "goerli", + enteranceFee: ethers.utils.parseEther("0.01"), + daoPercentage: "10", }, 31337: { name: "hardhat", + enteranceFee: ethers.utils.parseEther("0.01"), + daoPercentage: "10", }, }; @@ -31,6 +35,7 @@ const s_video = const s_fundRaisingGoalAmount = 10000; const s_roadMap = "Just click the video"; const s_otherSources = "You dont need anything else"; +const s_fundingTime = 60; // 10 sec. module.exports = { developmentChains, @@ -53,6 +58,7 @@ module.exports = { s_fundRaisingGoalAmount, s_roadMap, s_otherSources, + s_fundingTime, FUNC_FUND, FUNC_CANCEL_APPOROVEL, }; diff --git a/proposals.json b/proposals.json index c76301b..3b80a80 100644 --- a/proposals.json +++ b/proposals.json @@ -1 +1 @@ -{"31337":["80593019978336960554916183662682172860336371144993872300230438883412700739697"]} \ No newline at end of file +{"31337":["99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927"]} \ No newline at end of file diff --git a/test/unit/dao.test.js b/test/unit/dao.test.js index c49a380..917eb7e 100644 --- a/test/unit/dao.test.js +++ b/test/unit/dao.test.js @@ -38,7 +38,6 @@ const fs = require("fs"); gtToken = await ethers.getContract("GovernanceToken"); governor = await ethers.getContract("GovernerContract"); timeLock = await ethers.getContract("TimeLock"); - box = await ethers.getContract("Box"); gtToken = await ethers.getContract("GovernanceToken", deployer); }); @@ -47,7 +46,6 @@ const fs = require("fs"); assert(gtToken.address); assert(governor.address); assert(timeLock.address); - assert(box.address); }); it("Only Owner can mint token", async () => { From eb6206b0ae2c4630eca544d7151488d62e069b6d Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Tue, 8 Nov 2022 22:41:20 +0300 Subject: [PATCH 18/28] Add chainlink automation without testing V4. This will break old test for now. Fix bugs --- contracts/FundProject.sol | 24 +- contracts/GovernerContract.sol | 12 +- deploy/02-deploy-GovernerToken.js | 18 +- deploy/03-deploy-governorContract.js | 11 +- deployments/localhost/GovernanceToken.json | 8 +- deployments/localhost/GovernerContract.json | 155 +++--- deployments/localhost/TimeLock.json | 16 +- ... => 3cf270c0d0efd91caec1ecd679be00ea.json} | 62 +-- proposals.json | 2 +- scripts/queue-and-execute-afterSubmit.js | 23 +- scripts/submit_and_propose.js | 10 +- test/unit/dao.test.js | 115 +++-- test/unit/fundProjectContract.test.js | 450 ------------------ 13 files changed, 262 insertions(+), 644 deletions(-) rename deployments/localhost/solcInputs/{f3989c9674956bada0a1ffc4cf72c075.json => 3cf270c0d0efd91caec1ecd679be00ea.json} (94%) delete mode 100644 test/unit/fundProjectContract.test.js diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index 503d9d6..4b18d2c 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -4,15 +4,15 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@chainlink/contracts/src/v0.8/AutomationCompatible.sol"; -contract FundProject is Ownable, AutomationCompatibleInterface { - error FundProject__NotApporovedByDao(); - error FundProject__UpkeepNeeded(); - error FundProject__TransferFailed(uint256 _projectId); - error FundProject__NotEnoughPayment(); - error FundProject__withdrawFund(); - error FundProject__WithdrawTransferFailed(); - error FundProject__EnteranceFeeNeeded(); +error FundProject__NotApporovedByDao(); +error FundProject__UpkeepNeeded(); +error FundProject__TransferFailed(uint256 _projectId); +error FundProject__NotEnoughPayment(); +error FundProject__withdrawFund(); +error FundProject__WithdrawTransferFailed(); +error FundProject__EnteranceFeeNeeded(); +contract FundProject is Ownable, AutomationCompatibleInterface { enum ProjectFundingStatus { ONPROGRESS, SUCCESS, @@ -42,6 +42,8 @@ contract FundProject is Ownable, AutomationCompatibleInterface { event projectSuccessfullyFunded(uint256 indexed _projectId); event projectFundingFailed(uint256 indexed _projectId); + event enteranceFeePaid(address indexed _projectOwner); + event projectGoesToFunding(uint256 indexed _projectId); modifier isApporovedByDao(uint256 _projecID) { if (!_isApporovedByDao[_projecID]) @@ -83,6 +85,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { projectOwnerAddress[projectId] = _projectOwnerAddress; _isApporovedByDao[projectId] = true; _isFunding[projectId] = true; + emit projectGoesToFunding(projectId); projectId++; } } @@ -143,6 +146,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { revert FundProject__NotEnoughPayment(); } else { _isEnteranceFeePaid[msg.sender] = true; + emit enteranceFeePaid(msg.sender); } } @@ -215,4 +219,8 @@ contract FundProject is Ownable, AutomationCompatibleInterface { function getEnteranceFee() public view returns (uint256) { return enteranceFee; } + + function isEnteranceFeePaid(address account) public view returns (bool) { + return _isEnteranceFeePaid[account]; + } } diff --git a/contracts/GovernerContract.sol b/contracts/GovernerContract.sol index 8b6b870..de034bc 100644 --- a/contracts/GovernerContract.sol +++ b/contracts/GovernerContract.sol @@ -7,7 +7,7 @@ import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; - +import "./FundProject.sol"; contract GovernerContract is Governor, @@ -16,15 +16,18 @@ contract GovernerContract is GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl, - + FundProject { + error GovernerContract__NeedEnteranceFee(); + constructor( IVotes _token, TimelockController _timelock, uint256 _votingDelay, uint256 _votingPeriod, uint256 _quorumPercentage, - + uint256 _enteranceFee, + uint256 _daoPercentage ) Governor("GovernerContract") GovernorSettings( @@ -82,6 +85,9 @@ contract GovernerContract is bytes[] memory calldatas, string memory description ) public override(Governor, IGovernor) returns (uint256) { + if (!_isEnteranceFeePaid[msg.sender]) { + revert GovernerContract__NeedEnteranceFee(); + } return super.propose(targets, values, calldatas, description); } diff --git a/deploy/02-deploy-GovernerToken.js b/deploy/02-deploy-GovernerToken.js index 5d739ba..6318f5c 100644 --- a/deploy/02-deploy-GovernerToken.js +++ b/deploy/02-deploy-GovernerToken.js @@ -12,6 +12,8 @@ module.exports = async ({ getNamedAccounts, deployments }) => { waitConfirmations: network.config.blockConfirmations || 1, }); log(`governanceToken deployed at ${governanceToken.address}`); + await delegate(governanceToken.address, deployer); + console.log(`Delegated!`); if ( !developmentChains.includes(network.name) && @@ -20,7 +22,7 @@ module.exports = async ({ getNamedAccounts, deployments }) => { await verify(governanceToken.address, []); } - const timeLock = await ethers.getContract("TimeLock"); + /* const timeLock = await ethers.getContract("TimeLock"); const governanceTokenContract = await ethers.getContractAt( "GovernanceToken", governanceToken.address @@ -29,7 +31,19 @@ module.exports = async ({ getNamedAccounts, deployments }) => { timeLock.address ); await transferOwnerTx.wait(1); - log("governanceTokenContract Ownership transfered!"); + log("governanceTokenContract Ownership transfered!"); */ +}; + +const delegate = async (governanceTokenAddress, delegatedAccount) => { + const governanceToken = await ethers.getContractAt( + "GovernanceToken", + governanceTokenAddress + ); + const tx = await governanceToken.delegate(delegatedAccount); + await tx.wait(1); + console.log( + `Checkpoint ${await governanceToken.numCheckpoints(delegatedAccount)}` + ); }; module.exports.tags = ["all", "governanceToken"]; diff --git a/deploy/03-deploy-governorContract.js b/deploy/03-deploy-governorContract.js index c54523b..3010b61 100644 --- a/deploy/03-deploy-governorContract.js +++ b/deploy/03-deploy-governorContract.js @@ -13,7 +13,6 @@ module.exports = async ({ getNamedAccounts, deployments }) => { const { deployer } = await getNamedAccounts(); const governanceToken = await ethers.getContract("GovernanceToken"); const timelock = await ethers.getContract("TimeLock"); - const chainId = network.config.chainId; const enteranceFee = networkConfig[chainId]["enteranceFee"]; const daoPercentage = networkConfig[chainId]["daoPercentage"]; @@ -41,6 +40,16 @@ module.exports = async ({ getNamedAccounts, deployments }) => { ) { await verify(governorContract.address, args); } + const timeLock = await ethers.getContract("TimeLock"); + const governanceContract = await ethers.getContractAt( + "GovernanceToken", + governorContract.address + ); + const transferOwnerTx = await governanceContract.transferOwnership( + timeLock.address + ); + await transferOwnerTx.wait(1); + log("governanceContract Ownership transfered!"); }; module.exports.tags = ["all", "governorContract"]; diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index 8152f4e..dd91c5e 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -723,7 +723,7 @@ "transactionIndex": 0, "gasUsed": "3780772", "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000410000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000001000000000002000000008000000000020000000000000000000000000200000000000000000000000800000000000000000", - "blockHash": "0x14a20147e8e5d17e8e2c574d64f5d52a86318524af00f8d351404b1cf0cf2a14", + "blockHash": "0x4eceb63bf3105a8f69b6864c3260b41e6c3a792a0ee7fef8db508fee62be49a3", "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", "logs": [ { @@ -738,7 +738,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x14a20147e8e5d17e8e2c574d64f5d52a86318524af00f8d351404b1cf0cf2a14" + "blockHash": "0x4eceb63bf3105a8f69b6864c3260b41e6c3a792a0ee7fef8db508fee62be49a3" }, { "transactionIndex": 0, @@ -752,7 +752,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 1, - "blockHash": "0x14a20147e8e5d17e8e2c574d64f5d52a86318524af00f8d351404b1cf0cf2a14" + "blockHash": "0x4eceb63bf3105a8f69b6864c3260b41e6c3a792a0ee7fef8db508fee62be49a3" }, { "transactionIndex": 0, @@ -766,7 +766,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 2, - "blockHash": "0x14a20147e8e5d17e8e2c574d64f5d52a86318524af00f8d351404b1cf0cf2a14" + "blockHash": "0x4eceb63bf3105a8f69b6864c3260b41e6c3a792a0ee7fef8db508fee62be49a3" } ], "blockNumber": 2, diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json index 46ae64d..0afdc6d 100644 --- a/deployments/localhost/GovernerContract.json +++ b/deployments/localhost/GovernerContract.json @@ -47,6 +47,11 @@ "name": "Empty", "type": "error" }, + { + "inputs": [], + "name": "FundProject__EnteranceFeeNeeded", + "type": "error" + }, { "inputs": [], "name": "FundProject__NotApporovedByDao", @@ -85,7 +90,7 @@ }, { "inputs": [], - "name": "GovernerContract__NotApporovedByDaoFoundation", + "name": "GovernerContract__NeedEnteranceFee", "type": "error" }, { @@ -388,6 +393,19 @@ "name": "VotingPeriodSet", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "_projectOwner", + "type": "address" + } + ], + "name": "enteranceFeePaid", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -401,6 +419,19 @@ "name": "projectFundingFailed", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_projectId", + "type": "uint256" + } + ], + "name": "projectGoesToFunding", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -605,6 +636,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "_isEnteranceFeePaid", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1127,11 +1177,11 @@ "inputs": [ { "internalType": "address", - "name": "", + "name": "account", "type": "address" } ], - "name": "inWhiteList", + "name": "isEnteranceFeePaid", "outputs": [ { "internalType": "bool", @@ -1905,81 +1955,81 @@ "type": "receive" } ], - "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "transactionIndex": 0, - "gasUsed": "7895230", + "gasUsed": "8012021", "logsBloom": "0x00000000000000000100000000001000000000000000000000800000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000001000000000000000010000000000000000000020000080002000100000800000000000000000000000000000000401000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000200000000000000000000000003000000000080000800020000000000000000000000000000000000000000000000000000000000000002000", - "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755", - "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475", + "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "logs": [ { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 0, - "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" + "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" ], "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8", "logIndex": 1, - "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" + "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 2, - "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" + "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 3, - "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" + "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3", "logIndex": 4, - "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" + "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xed0e14535137302ac6de984d51bc4f928439f8595ade3f4bc74fbe94d75d2199", + "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", @@ -1988,11 +2038,11 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0xe084a662dc1820bd903bad87f1b82fa26cd0d57a21d17721ae101e156d921755" + "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" } ], "blockNumber": 4, - "cumulativeGasUsed": "7895230", + "cumulativeGasUsed": "8012021", "status": 1, "byzantium": true }, @@ -2006,10 +2056,10 @@ "10" ], "numDeployments": 1, - "solcInputHash": "f3989c9674956bada0a1ffc4cf72c075", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enteranceFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_daoPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotEnoughPayment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"FundProject__TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__UpkeepNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__WithdrawTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__withdrawFund\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NotApporovedByDaoFoundation\",\"type\":\"error\"},{\"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\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectFundingFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectSuccessfullyFunded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_ProjectFundingStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getBalanceOfProject\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"_getProjectStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isApporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_fundingGoalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_projectOwnerAddress\",\"type\":\"address\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEnteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"inWhiteList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"is_funding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paySubmitFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectToTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"withdrawFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"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.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/AutomationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract AutomationBase {\\n error OnlySimulatedBackend();\\n\\n /**\\n * @notice method that allows it to be simulated via eth_call by checking that\\n * the sender is the zero address.\\n */\\n function preventExecution() internal view {\\n if (tx.origin != address(0)) {\\n revert OnlySimulatedBackend();\\n }\\n }\\n\\n /**\\n * @notice modifier that allows it to be simulated via eth_call by checking\\n * that the sender is the zero address.\\n */\\n modifier cannotExecute() {\\n preventExecution();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x5d354afa1a97dffe66094397cdcbb0c14713cf3d609d88fd8f9891010e9a351a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AutomationBase.sol\\\";\\nimport \\\"./interfaces/AutomationCompatibleInterface.sol\\\";\\n\\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\\n\",\"keccak256\":\"0x40e5ae0eff4edd0740c1b5590d09c344f84dee031e82d5294563e99603774f80\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\\\";\\n\\ncontract FundProject is Ownable, AutomationCompatibleInterface {\\n error FundProject__NotApporovedByDao();\\n error FundProject__UpkeepNeeded();\\n error FundProject__TransferFailed(uint256 _projectId);\\n error FundProject__NotEnoughPayment();\\n error FundProject__withdrawFund();\\n error FundProject__WithdrawTransferFailed();\\n\\n enum ProjectFundingStatus {\\n ONPROGRESS,\\n SUCCESS,\\n FAILED,\\n CANCELED\\n }\\n\\n uint256 public projectId = 1;\\n\\n uint public lastTimeStamp;\\n uint256 public daoPercentage;\\n uint256 public enteranceFee;\\n address payable projectOwners;\\n\\n mapping(uint256 => bool) public _isFunding;\\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\\n mapping(uint256 => uint256) public time;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders;\\n mapping(uint256 => uint256) public projectFunds;\\n mapping(uint256 => uint256) public projectFundingGoalAmount;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n mapping(uint256 => address) public projectOwnerAddress;\\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\\n\\n event projectSuccessfullyFunded(uint256 indexed _projectId);\\n event projectFundingFailed(uint256 indexed _projectId);\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\\n lastTimeStamp = block.timestamp;\\n daoPercentage = _daoPercentage;\\n enteranceFee = _enteranceFee;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n projectFunds[_projecID] += msg.value;\\n }\\n\\n function apporoveFundingByDao(\\n string memory _ipfsHash,\\n uint256 _fundingGoalAmount,\\n uint256 _time,\\n address _projectOwnerAddress\\n ) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n projectToTime[projectId][_time] = block.timestamp;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\\n time[projectId] = _time;\\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n projectOwnerAddress[projectId] = _projectOwnerAddress;\\n _isApporovedByDao[projectId] = true;\\n _isFunding[projectId] = true;\\n projectId++;\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call this function (after deployement we will transfer ownership to dao)\\n _isApporovedByDao[_projecID] = false;\\n _isFunding[projectId] = false;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\\n }\\n\\n function checkUpkeep(\\n bytes memory /* checkData */\\n )\\n public\\n view\\n override\\n returns (\\n bool upkeepNeeded,\\n bytes memory /* performData */\\n )\\n {\\n upkeepNeeded = (_isFunding[projectId] &&\\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\\n projectToTime[projectId][time[projectId]]);\\n }\\n\\n function performUpkeep(\\n bytes calldata /* performData */\\n ) external override {\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\n if (!upkeepNeeded) {\\n revert FundProject__UpkeepNeeded();\\n }\\n _isFunding[projectId] = false;\\n _isApporovedByDao[projectId] = false;\\n\\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\\n 100;\\n (bool success, ) = (projectOwnerAddress[projectId]).call{\\n value: fundsToSent\\n }(\\\"\\\");\\n if (!success) {\\n revert FundProject__TransferFailed(projectFunds[projectId]);\\n }\\n\\n emit projectSuccessfullyFunded(projectId);\\n } else {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\\n emit projectFundingFailed(projectId);\\n }\\n }\\n\\n function paySubmitFee() public payable {\\n if (msg.value > enteranceFee) {\\n projectOwners = payable(msg.sender);\\n } else {\\n revert FundProject__NotEnoughPayment();\\n }\\n }\\n\\n function withdrawFund(uint256 _projectID) public {\\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\\n uint256 fundToSent = funders[_projectID][msg.sender];\\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\\n \\\"\\\"\\n );\\n if (!success) {\\n revert FundProject__WithdrawTransferFailed();\\n }\\n } else {\\n revert FundProject__withdrawFund();\\n }\\n }\\n\\n function _isApporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n\\n function _getBalanceOfProject(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFunds[_projecID];\\n }\\n\\n function _getFundingGoalAmount(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFundingGoalAmount[_projecID];\\n }\\n\\n function is_funding(uint256 _projectID) public view returns (bool) {\\n return _isFunding[_projectID];\\n }\\n\\n function _getProjectStatus(uint256 _projectID)\\n public\\n view\\n returns (ProjectFundingStatus)\\n {\\n return _ProjectFundingStatus[_projectID];\\n }\\n\\n function getEnteranceFee() public view returns (uint256) {\\n return enteranceFee;\\n }\\n}\\n\",\"keccak256\":\"0x88f61ecad2c488affe55ae76435d6bebcfc383456f00ab7d05367d0a6e6ba98d\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\nimport \\\"./FundProject.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl,\\n FundProject\\n{\\n error GovernerContract__NotApporovedByDaoFoundation();\\n\\n mapping(address => bool) public inWhiteList;\\n\\n modifier isSubmitFeePaid() {\\n paySubmitFee();\\n _;\\n }\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage,\\n uint256 _enteranceFee,\\n uint256 _daoPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n FundProject(_enteranceFee, _daoPercentage)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) isSubmitFeePaid returns (uint256) {\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x543f86614fb6a4d4f4f3ad5ca725d1f89fa4fb76efc3922a95a70ae0b1e3b7d7\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6101606040526001600d553480156200001757600080fd5b5060405162009d2f38038062009d2f83398181016040528101906200003d919062000bff565b818187858a898960006040518060400160405280601081526020017f476f7665726e6572436f6e747261637400000000000000000000000000000000815250806200008d6200022660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f68184846200026360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000150919062000f22565b505062000163836200029f60201b60201c565b6200017482620002e660201b60201c565b62000185816200037360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001cf81620003ba60201b60201c565b50620001e1816200059960201b60201c565b5062000202620001f66200063a60201b60201c565b6200064260201b60201c565b42600e8190555080600f81905550816010819055505050505050505050506200142d565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200028095949392919062001046565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051620002d4929190620010a3565b60405180910390a18060048190555050565b600081116200032c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003239062001157565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405162000361929190620010a3565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051620003a8929190620010a3565b60405180910390a18060068190555050565b620003ca6200070860201b60201c565b8111156200040f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004069062001215565b60405180910390fd5b6000620004216200071160201b60201c565b9050600081141580156200043d57506000600960000180549050145b156200053d5760096000016040518060400160405280600063ffffffff16815260200162000476846200074960201b620034751760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000558826009620007b760201b620034e01790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200058d929190620010a3565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ee92919062001237565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064905090565b6000806009600001805490501462000740576200073a6009620009f560201b620036e21760201c565b62000744565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a690620012da565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620007d986620009f560201b60201c565b90506000821180156200083557504386600001600184620007fb91906200132b565b815481106200080f576200080e62001366565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008d95762000851856200074960201b620034751760201c565b866000016001846200086491906200132b565b8154811062000878576200087762001366565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009e6565b856000016040518060400160405280620008fe4362000a9760201b6200377d1760201c565b63ffffffff1681526020016200091f886200074960201b620034751760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811462000a6e578260000160018262000a1e91906200132b565b8154811062000a325762000a3162001366565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000a71565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff801682111562000ae5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000adc906200140b565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b1f8262000af2565b9050919050565b600062000b338262000b12565b9050919050565b62000b458162000b26565b811462000b5157600080fd5b50565b60008151905062000b658162000b3a565b92915050565b600062000b788262000af2565b9050919050565b600062000b8c8262000b6b565b9050919050565b62000b9e8162000b7f565b811462000baa57600080fd5b50565b60008151905062000bbe8162000b93565b92915050565b6000819050919050565b62000bd98162000bc4565b811462000be557600080fd5b50565b60008151905062000bf98162000bce565b92915050565b600080600080600080600060e0888a03121562000c215762000c2062000aed565b5b600062000c318a828b0162000b54565b975050602062000c448a828b0162000bad565b965050604062000c578a828b0162000be8565b955050606062000c6a8a828b0162000be8565b945050608062000c7d8a828b0162000be8565b93505060a062000c908a828b0162000be8565b92505060c062000ca38a828b0162000be8565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d3457607f821691505b60208210810362000d4a5762000d4962000cec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000db47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d75565b62000dc0868362000d75565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000e0362000dfd62000df78462000bc4565b62000dd8565b62000bc4565b9050919050565b6000819050919050565b62000e1f8362000de2565b62000e3762000e2e8262000e0a565b84845462000d82565b825550505050565b600090565b62000e4e62000e3f565b62000e5b81848462000e14565b505050565b5b8181101562000e835762000e7760008262000e44565b60018101905062000e61565b5050565b601f82111562000ed25762000e9c8162000d50565b62000ea78462000d65565b8101602085101562000eb7578190505b62000ecf62000ec68562000d65565b83018262000e60565b50505b505050565b600082821c905092915050565b600062000ef76000198460080262000ed7565b1980831691505092915050565b600062000f12838362000ee4565b9150826002028217905092915050565b62000f2d8262000cb2565b67ffffffffffffffff81111562000f495762000f4862000cbd565b5b62000f55825462000d1b565b62000f6282828562000e87565b600060209050601f83116001811462000f9a576000841562000f85578287015190505b62000f91858262000f04565b86555062001001565b601f19841662000faa8662000d50565b60005b8281101562000fd45784890151825560018201915060208501945060208101905062000fad565b8683101562000ff4578489015162000ff0601f89168262000ee4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6200101e8162001009565b82525050565b6200102f8162000bc4565b82525050565b620010408162000b12565b82525050565b600060a0820190506200105d600083018862001013565b6200106c602083018762001013565b6200107b604083018662001013565b6200108a606083018562001024565b62001099608083018462001035565b9695505050505050565b6000604082019050620010ba600083018562001024565b620010c9602083018462001024565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200113f602783620010d0565b91506200114c82620010e1565b604082019050919050565b60006020820190508181036000830152620011728162001130565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620011fd604383620010d0565b91506200120a8262001179565b606082019050919050565b600060208201905081810360008301526200123081620011ee565b9050919050565b60006040820190506200124e600083018562001035565b6200125d602083018462001035565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620012c2602783620010d0565b9150620012cf8262001264565b604082019050919050565b60006020820190508181036000830152620012f581620012b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013388262000bc4565b9150620013458362000bc4565b925082820390508181111562001360576200135f620012fc565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620013f3602683620010d0565b9150620014008262001395565b604082019050919050565b600060208201905081810360008301526200142681620013e4565b9050919050565b60805160a05160c05160e05161010051610120516101405161889962001496600039600081816133cf0152818161466d01526148e101526000614ba701526000614be901526000614bc801526000614afd01526000614b5301526000614b7c01526188996000f3fe6080604052600436106104405760003560e01c8063794d556011610234578063bc197c811161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e61146112ee578063f2fde38b1461132b578063f8ce560a14611354578063fc0c546a14611391578063fea856a1146113bc57610486565b8063deaaa7cc146111f7578063e0c410cc14611222578063ea0217cf1461125f578063eb9019d414611288578063ece40cc1146112c557610486565b8063ca1d209d116100fd578063ca1d209d1461110b578063cf68625914611127578063d33219b414611164578063dc73204b1461118f578063dd4e2ba5146111cc57610486565b8063bc197c811461102b578063c01f9e3714611068578063c28bc2fa146110a5578063c59057e4146110ce57610486565b806396aa167e116101bc578063ab58fb8e11610180578063ab58fb8e14610f0c578063abe1aae614610f49578063b58131b014610f86578063b59d18a014610fb1578063bba9c21914610fee57610486565b806396aa167e14610e2557806397c3d33414610e505780639a802a6d14610e7b578063a7713a7014610eb8578063a890c91014610ee357610486565b8063868661cb11610203578063868661cb14610d2c57806387030f4d14610d575780638da5cb5b14610d805780638fb5548f14610dab578063902bfa2414610de857610486565b8063794d556014610c385780637b3c71d314610c755780637d5e81e214610cb2578063809b268e14610cef57610486565b80633f3b3b271161034557806356781388116102cd57806369e0e3461161029157806369e0e34614610b405780636e04ff0d14610b7d57806370084d7a14610bbb57806370b0f66014610bf8578063715018a614610c2157610486565b80635678138814610a0f5780635b6b465214610a4c5780635ced7d4014610a895780635f398a1414610ac657806360c4247f14610b0357610486565b80634585e33b116103145780634585e33b146109145780634fac2bb71461093d578063535bf50f1461097a578063544ffc9c146109a557806354fd4d50146109e457610486565b80633f3b3b27146108445780633fafa1271461086f578063438596321461089a578063446a156f146108d757610486565b8063156277be116103c85780632fe3e261116103975780632fe3e2611461074b5780633932abb1146107765780633bccf4fd146107a15780633be2f2a3146107de5780633e4f49e61461080757610486565b8063156277be14610664578063160cbed7146106a15780632656227d146106de5780632d63f6931461070e57610486565b806306fdde031161040f57806306fdde03146105595780630cee172514610584578063141a6c22146105ad578063148038b0146105ea578063150b7a021461062757610486565b806301ffc9a71461048b57806302a251a3146104c857806303420181146104f357806306f3f9e61461053057610486565b36610486573073ffffffffffffffffffffffffffffffffffffffff166104646113c6565b73ffffffffffffffffffffffffffffffffffffffff161461048457600080fd5b005b600080fd5b34801561049757600080fd5b506104b260048036038101906104ad91906157ec565b6113d5565b6040516104bf9190615834565b60405180910390f35b3480156104d457600080fd5b506104dd6113e7565b6040516104ea9190615868565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190615ac4565b6113f6565b6040516105279190615868565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190615ba2565b6114db565b005b34801561056557600080fd5b5061056e6115d2565b60405161057b9190615c4e565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615ba2565b611664565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615d11565b6117e4565b6040516105e19190615868565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190615db8565b61180c565b60405161061e9190615868565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190615df8565b611831565b60405161065b9190615e8a565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190615ba2565b611845565b6040516106989190615eb4565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190616136565b611878565b6040516106d59190615868565b60405180910390f35b6106f860048036038101906106f39190616136565b611b32565b6040516107059190615868565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190615ba2565b611c7f565b6040516107429190615868565b60405180910390f35b34801561075757600080fd5b50610760611ced565b60405161076d9190616200565b60405180910390f35b34801561078257600080fd5b5061078b611d11565b6040516107989190615868565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c3919061621b565b611d20565b6040516107d59190615868565b60405180910390f35b3480156107ea57600080fd5b5061080560048036038101906108009190616296565b611daa565b005b34801561081357600080fd5b5061082e60048036038101906108299190615ba2565b611f65565b60405161083b9190616390565b60405180910390f35b34801561085057600080fd5b50610859611f77565b6040516108669190615868565b60405180910390f35b34801561087b57600080fd5b50610884611f7d565b6040516108919190615868565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc9190615db8565b611f83565b6040516108ce9190615834565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190615ba2565b611fee565b60405161090b91906163f3565b60405180910390f35b34801561092057600080fd5b5061093b60048036038101906109369190616464565b612018565b005b34801561094957600080fd5b50610964600480360381019061095f9190615ba2565b61230c565b6040516109719190615834565b60405180910390f35b34801561098657600080fd5b5061098f61232c565b60405161099c9190615868565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190615ba2565b612336565b6040516109db939291906164b1565b60405180910390f35b3480156109f057600080fd5b506109f961236e565b604051610a069190615c4e565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a3191906164e8565b6123ab565b604051610a439190615868565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190615ba2565b6123dc565b604051610a809190615868565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190615ba2565b6123f4565b604051610abd9190615868565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190616528565b61240c565b604051610afa9190615868565b60405180910390f35b348015610b0f57600080fd5b50610b2a6004803603810190610b259190615ba2565b612476565b604051610b379190615868565b60405180910390f35b348015610b4c57600080fd5b50610b676004803603810190610b6291906165cc565b6125c2565b604051610b749190615834565b60405180910390f35b348015610b8957600080fd5b50610ba46004803603810190610b9f91906165f9565b6125e2565b604051610bb2929190616697565b60405180910390f35b348015610bc757600080fd5b50610be26004803603810190610bdd9190615ba2565b61269c565b604051610bef91906163f3565b60405180910390f35b348015610c0457600080fd5b50610c1f6004803603810190610c1a9190615ba2565b6126bc565b005b348015610c2d57600080fd5b50610c366127b3565b005b348015610c4457600080fd5b50610c5f6004803603810190610c5a9190615ba2565b6127c7565b604051610c6c9190615868565b60405180910390f35b348015610c8157600080fd5b50610c9c6004803603810190610c9791906166c7565b6127df565b604051610ca99190615868565b60405180910390f35b348015610cbe57600080fd5b50610cd96004803603810190610cd4919061673b565b612847565b604051610ce69190615868565b60405180910390f35b348015610cfb57600080fd5b50610d166004803603810190610d119190615ba2565b612867565b604051610d239190615834565b60405180910390f35b348015610d3857600080fd5b50610d41612891565b604051610d4e9190615868565b60405180910390f35b348015610d6357600080fd5b50610d7e6004803603810190610d799190615ba2565b612897565b005b348015610d8c57600080fd5b50610d9561293a565b604051610da29190615eb4565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd9190615ba2565b612964565b604051610ddf9190615c4e565b60405180910390f35b348015610df457600080fd5b50610e0f6004803603810190610e0a9190615ba2565b612a04565b604051610e1c9190615834565b60405180910390f35b348015610e3157600080fd5b50610e3a612a24565b604051610e479190615868565b60405180910390f35b348015610e5c57600080fd5b50610e65612a2a565b604051610e729190615868565b60405180910390f35b348015610e8757600080fd5b50610ea26004803603810190610e9d9190616812565b612a33565b604051610eaf9190615868565b60405180910390f35b348015610ec457600080fd5b50610ecd612a49565b604051610eda9190615868565b60405180910390f35b348015610eef57600080fd5b50610f0a6004803603810190610f0591906168d1565b612a72565b005b348015610f1857600080fd5b50610f336004803603810190610f2e9190615ba2565b612b69565b604051610f409190615868565b60405180910390f35b348015610f5557600080fd5b50610f706004803603810190610f6b9190615ba2565b612c36565b604051610f7d9190615c4e565b60405180910390f35b348015610f9257600080fd5b50610f9b612cdb565b604051610fa89190615868565b60405180910390f35b348015610fbd57600080fd5b50610fd86004803603810190610fd39190615ba2565b612cea565b604051610fe59190615868565b60405180910390f35b348015610ffa57600080fd5b5061101560048036038101906110109190615ba2565b612d07565b6040516110229190615868565b60405180910390f35b34801561103757600080fd5b50611052600480360381019061104d91906168fe565b612d24565b60405161105f9190615e8a565b60405180910390f35b34801561107457600080fd5b5061108f600480360381019061108a9190615ba2565b612d39565b60405161109c9190615868565b60405180910390f35b3480156110b157600080fd5b506110cc60048036038101906110c791906169cd565b612da7565b005b3480156110da57600080fd5b506110f560048036038101906110f09190616136565b612ee8565b6040516111029190615868565b60405180910390f35b61112560048036038101906111209190615ba2565b612f24565b005b34801561113357600080fd5b5061114e60048036038101906111499190615d11565b613011565b60405161115b9190615868565b60405180910390f35b34801561117057600080fd5b5061117961303f565b6040516111869190615eb4565b60405180910390f35b34801561119b57600080fd5b506111b660048036038101906111b19190616a41565b613069565b6040516111c39190615868565b60405180910390f35b3480156111d857600080fd5b506111e161308e565b6040516111ee9190615c4e565b60405180910390f35b34801561120357600080fd5b5061120c6130cb565b6040516112199190616200565b60405180910390f35b34801561122e57600080fd5b5061124960048036038101906112449190615ba2565b6130ef565b6040516112569190615834565b60405180910390f35b34801561126b57600080fd5b5061128660048036038101906112819190615ba2565b613119565b005b34801561129457600080fd5b506112af60048036038101906112aa9190616a81565b613210565b6040516112bc9190615868565b60405180910390f35b3480156112d157600080fd5b506112ec60048036038101906112e79190615ba2565b61322c565b005b3480156112fa57600080fd5b5061131560048036038101906113109190616ac1565b613323565b6040516113229190615e8a565b60405180910390f35b34801561133757600080fd5b50611352600480360381019061134d91906165cc565b613338565b005b34801561136057600080fd5b5061137b60048036038101906113769190615ba2565b6133bb565b6040516113889190615868565b60405180910390f35b34801561139d57600080fd5b506113a66133cd565b6040516113b39190616bb7565b60405180910390f35b6113c46133f1565b005b60006113d06137d0565b905090565b60006113e0826137fa565b9050919050565b60006113f1613874565b905090565b6000806114796114717fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051611432929190616c02565b60405180910390208b80519060200120604051602001611456959493929190616c2a565b6040516020818303038152906040528051906020012061387e565b868686613898565b90506114cc8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a6138c3565b91505098975050505050505050565b6114e36113c6565b73ffffffffffffffffffffffffffffffffffffffff16611501613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115766113c6565b73ffffffffffffffffffffffffffffffffffffffff16146115c657600061159b613a87565b6040516115a9929190616c02565b604051809103902090505b806115bf6002613a94565b036115b457505b6115cf81613b70565b50565b6060600080546115e190616d18565b80601f016020809104026020016040519081016040528092919081815260200182805461160d90616d18565b801561165a5780601f1061162f5761010080835404028352916020019161165a565b820191906000526020600020905b81548152906001019060200180831161163d57829003601f168201915b5050505050905090565b6002600381111561167857611677616319565b5b601c600083815260200190815260200160002060009054906101000a900460ff1660038111156116ab576116aa616319565b5b036117af5760006017600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161172b90616d6f565b60006040518083038185875af1925050503d8060008114611768576040519150601f19603f3d011682016040523d82523d6000602084013e61176d565b606091505b50509050806117a8576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506117e1565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006015826040516117f69190616dc0565b9081526020016040518091039020549050919050565b6017602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061188786868686612ee8565b90506004600781111561189d5761189c616319565b5b6118a682611f65565b60078111156118b8576118b7616319565b5b146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90616e49565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190616e7e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b81526004016119f195949392919061717b565b602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3291906171f8565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611aaf96959493929190617225565b600060405180830381600087803b158015611ac957600080fd5b505af1158015611add573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b0f91906172ca565b604051611b1d9291906172fe565b60405180910390a18192505050949350505050565b600080611b4186868686612ee8565b90506000611b4e82611f65565b905060046007811115611b6457611b63616319565b5b816007811115611b7757611b76616319565b5b1480611ba7575060056007811115611b9257611b91616319565b5b816007811115611ba557611ba4616319565b5b145b611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90616e49565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c439190615868565b60405180910390a1611c588288888888613d24565b611c658288888888613e07565b611c728288888888613e1b565b8192505050949350505050565b6000611cdc600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d1b613e84565b905090565b600080611d81611d797f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611d5e93929190617327565b6040516020818303038152906040528051906020012061387e565b868686613898565b9050611d9e87828860405180602001604052806000815250613e8e565b91505095945050505050565b611db2613eae565b4260136000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601c6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611e1657611e15616319565b5b02179055508160146000600d548152602001908152602001600020819055508260196000600d54815260200190815260200160002081905550600d54601585604051611e629190616dc0565b9081526020016040518091039020819055508360166000600d5481526020019081526020016000209081611e969190617500565b5080601b6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a6000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d6000815480929190611f5a906175d2565b919050555050505050565b6000611f7082613f2c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601c600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000612032604051806020016040528060008152506125e2565b5090508061206c576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060126000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601a6000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060196000600d5481526020019081526020016000205460186000600d548152602001908152602001600020541115612299576001601c6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561213357612132616319565b5b021790555060006064600f5460186000600d5481526020019081526020016000205461215f919061761a565b612169919061768b565b90506000601b6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516121c690616d6f565b60006040518083038185875af1925050503d8060008114612203576040519150601f19603f3d011682016040523d82523d6000602084013e612208565b606091505b50509050806122635760186000600d548152602001908152602001600020546040517f265b39fb00000000000000000000000000000000000000000000000000000000815260040161225a9190615868565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612307565b6002601c6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156122d2576122d1616319565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b601a6020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806123b6613a7f565b90506123d384828560405180602001604052806000815250613e8e565b91505092915050565b60196020528060005260406000206000915090505481565b60146020528060005260406000206000915090505481565b600080612417613a7f565b905061246a87828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876138c3565b91505095945050505050565b600080600960000180549050905060008103612497576008549150506125bd565b600060096000016001836124ab91906176bc565b815481106124bc576124bb6176f0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff16116125a45780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506125bd565b6125b88460096140ff90919063ffffffff16565b925050505b919050565b601d6020528060005260406000206000915054906101000a900460ff1681565b6000606060126000600d54815260200190815260200160002060009054906101000a900460ff168015612695575060136000600d548152602001908152602001600020600060146000600d5481526020019081526020016000205481526020019081526020016000205460136000600d548152602001908152602001600020600060146000600d548152602001908152602001600020548152602001908152602001600020544261269391906176bc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b6126c46113c6565b73ffffffffffffffffffffffffffffffffffffffff166126e2613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166127576113c6565b73ffffffffffffffffffffffffffffffffffffffff16146127a757600061277c613a87565b60405161278a929190616c02565b604051809103902090505b806127a06002613a94565b0361279557505b6127b081614257565b50565b6127bb613eae565b6127c5600061429c565b565b60186020528060005260406000206000915090505481565b6000806127ea613a7f565b905061283c86828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613e8e565b915050949350505050565b60006128516133f1565b61285d85858585614362565b9050949350505050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b61289f613eae565b6000601a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060126000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601c6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561293257612931616319565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6016602052806000526040600020600091509050805461298390616d18565b80601f01602080910402602001604051908101604052809291908181526020018280546129af90616d18565b80156129fc5780601f106129d1576101008083540402835291602001916129fc565b820191906000526020600020905b8154815290600101906020018083116129df57829003601f168201915b505050505081565b60126020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612a40848484614669565b90509392505050565b60008060096000018054905014612a6957612a6460096136e2565b612a6d565b6008545b905090565b612a7a6113c6565b73ffffffffffffffffffffffffffffffffffffffff16612a98613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612b0d6113c6565b73ffffffffffffffffffffffffffffffffffffffff1614612b5d576000612b32613a87565b604051612b40929190616c02565b604051809103902090505b80612b566002613a94565b03612b4b57505b612b6681614710565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612bda9190616200565b602060405180830381865afa158015612bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1b9190616e7e565b905060018114612c2b5780612c2e565b60005b915050919050565b6060601660008381526020019081526020016000208054612c5690616d18565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8290616d18565b8015612ccf5780601f10612ca457610100808354040283529160200191612ccf565b820191906000526020600020905b815481529060010190602001808311612cb257829003601f168201915b50505050509050919050565b6000612ce56147af565b905090565b600060196000838152602001908152602001600020549050919050565b600060186000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612d96600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff169050919050565b612daf6113c6565b73ffffffffffffffffffffffffffffffffffffffff16612dcd613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612e426113c6565b73ffffffffffffffffffffffffffffffffffffffff1614612e92576000612e67613a87565b604051612e75929190616c02565b604051809103902090505b80612e8b6002613a94565b03612e8057505b612ee18483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856147b9565b5050505050565b600084848484604051602001612f01949392919061771f565b6040516020818303038152906040528051906020012060001c9050949350505050565b80601a600082815260200190815260200160002060009054906101000a900460ff16612f7c576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346017600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fdc91906172ca565b925050819055503460186000848152602001908152602001600020600082825461300691906172ca565b925050819055505050565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6013602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b6000601a600083815260200190815260200160002060009054906101000a900460ff169050919050565b6131216113c6565b73ffffffffffffffffffffffffffffffffffffffff1661313f613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614613195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318c90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166131b46113c6565b73ffffffffffffffffffffffffffffffffffffffff16146132045760006131d9613a87565b6040516131e7929190616c02565b604051809103902090505b806131fd6002613a94565b036131f257505b61320d816147e8565b50565b6000613224838361321f614870565b614669565b905092915050565b6132346113c6565b73ffffffffffffffffffffffffffffffffffffffff16613252613a7f565b73ffffffffffffffffffffffffffffffffffffffff16146132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166132c76113c6565b73ffffffffffffffffffffffffffffffffffffffff16146133175760006132ec613a87565b6040516132fa929190616c02565b604051809103902090505b806133106002613a94565b0361330557505b61332081614887565b50565b600063f23a6e6160e01b905095945050505050565b613340613eae565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a6906177eb565b60405180910390fd5b6133b88161429c565b50565b60006133c6826148cc565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543411156134415733601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613473565b6040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156134d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cf9061787d565b60405180910390fd5b819050919050565b60008060008460000180549050905060006134fa866136e2565b90506000821180156135505750438660000160018461351991906176bc565b8154811061352a576135296176f0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156135e05761355e85613475565b8660000160018461356f91906176bc565b815481106135805761357f6176f0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506136d3565b8560000160405180604001604052806135f84361377d565b63ffffffff16815260200161360c88613475565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613754578260000160018261370891906176bc565b81548110613719576137186176f0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613757565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156137c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bf9061790f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061386d575061386c82614994565b5b9050919050565b6000600554905090565b600061389161388b614af9565b83614c13565b9050919050565b60008060006138a987878787614c46565b915091506138b681614d52565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156138ef576138ee616319565b5b6138f888611f65565b600781111561390a57613909616319565b5b1461394a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613941906179a1565b60405180910390fd5b60006139a987613999846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff1686614669565b90506139b88888888488614f1e565b6000845103613a1a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613a0d94939291906179c1565b60405180910390a2613a71565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613a68959493929190617a0d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613a9f82615122565b15613ad6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613b78612a2a565b811115613bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bb190617b06565b60405180910390fd5b6000613bc4612a49565b905060008114158015613bdf57506000600960000180549050145b15613cd15760096000016040518060400160405280600063ffffffff168152602001613c0a84613475565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613ce58260096134e090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613d189291906172fe565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613d436113c6565b73ffffffffffffffffffffffffffffffffffffffff1614613e005760005b8451811015613dfe573073ffffffffffffffffffffffffffffffffffffffff16858281518110613d9457613d936176f0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603613ded57613dec838281518110613dcd57613dcc6176f0565b5b602002602001015180519060200120600261515790919063ffffffff16565b5b80613df7906175d2565b9050613d61565b505b5050505050565b613e1485858585856151d3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff16613e3a6113c6565b73ffffffffffffffffffffffffffffffffffffffff1614613e6f57613e5f6002615122565b613e6e57613e6d6002615271565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b6000613ea485858585613e9f614870565b6138c3565b9050949350505050565b613eb6613a7f565b73ffffffffffffffffffffffffffffffffffffffff16613ed461293a565b73ffffffffffffffffffffffffffffffffffffffff1614613f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f2190617b72565b60405180910390fd5b565b600080613f38836152f2565b905060046007811115613f4e57613f4d616319565b5b816007811115613f6157613f60616319565b5b14613f6f57809150506140fa565b6000600b60008581526020019081526020016000205490506000801b8103613f9b5781925050506140fa565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b8152600401613ff69190616200565b602060405180830381865afa158015614013573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140379190617bbe565b15614047576007925050506140fa565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016140a29190616200565b602060405180830381865afa1580156140bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140e39190617bbe565b156140f3576005925050506140fa565b6002925050505b919050565b6000438210614143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161413a90617c37565b60405180910390fd5b60008360000180549050905060005b818110156141c75760006141668284615406565b90508486600001828154811061417f5761417e6176f0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156141b1578092506141c1565b6001816141be91906172ca565b91505b50614152565b6000821461422c57846000016001836141e091906176bc565b815481106141f1576141f06176f0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661422f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a936004548260405161428a9291906172fe565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061436c612cdb565b614389614377613a7f565b60014361438491906176bc565b613210565b10156143ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143c190617cc9565b60405180910390fd5b60006143df8686868680519060200120612ee8565b90508451865114614425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161441c90617d5b565b60405180910390fd5b8351865114614469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161446090617d5b565b60405180910390fd5b60008651116144ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144a490617dc7565b60405180910390fd5b600060016000838152602001908152602001600020905061450d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061542c565b61454c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161454390617e59565b60405180910390fd5b600061455e614559611d11565b615446565b61456743615446565b6145719190617e8d565b905060006145856145806113e7565b615446565b826145909190617e8d565b90506145a8828460000161549d90919063ffffffff16565b6145be818460010161549d90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e0846145e8613a7f565b8b8b8d5167ffffffffffffffff81111561460557614604615963565b5b60405190808252806020026020018201604052801561463857816020015b60608152602001906001900390816146235790505b508c88888e60405161465299989796959493929190618006565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016146c69291906180b6565b602060405180830381865afa1580156146e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147079190616e7e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516147639291906180df565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606147df84848460405180606001604052806029815260200161883b602991396154cc565b90509392505050565b6000811161482b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148229061817a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405161485e9291906172fe565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516148ba9291906172fe565b60405180910390a18060068190555050565b60006148d6612a2a565b6148df83612476565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016149389190615868565b602060405180830381865afa158015614955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149799190616e7e565b614983919061761a565b61498d919061768b565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614a7a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614ae257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614af25750614af1826155e0565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614b7557507f000000000000000000000000000000000000000000000000000000000000000046145b15614ba2577f00000000000000000000000000000000000000000000000000000000000000009050614c10565b614c0d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061564a565b90505b90565b60008282604051602001614c28929190618207565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614c81576000600391509150614d49565b601b8560ff1614158015614c995750601c8560ff1614155b15614cab576000600491509150614d49565b600060018787878760405160008152602001604052604051614cd0949392919061823e565b6020604051602081039080840390855afa158015614cf2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614d4057600060019250925050614d49565b80600092509250505b94509492505050565b60006004811115614d6657614d65616319565b5b816004811115614d7957614d78616319565b5b0315614f1b5760016004811115614d9357614d92616319565b5b816004811115614da657614da5616319565b5b03614de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ddd906182cf565b60405180910390fd5b60026004811115614dfa57614df9616319565b5b816004811115614e0d57614e0c616319565b5b03614e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614e449061833b565b60405180910390fd5b60036004811115614e6157614e60616319565b5b816004811115614e7457614e73616319565b5b03614eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614eab906183cd565b60405180910390fd5b600480811115614ec757614ec6616319565b5b816004811115614eda57614ed9616319565b5b03614f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614f119061845f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614fbb906184f1565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561503257615031616319565b5b60ff168460ff160361505e578281600001600082825461505291906172ca565b9250508190555061511a565b6001600281111561507257615071616319565b5b60ff168460ff160361509e578281600101600082825461509291906172ca565b92505081905550615119565b6002808111156150b1576150b0616319565b5b60ff168460ff16036150dd57828160020160008282546150d191906172ca565b92505081905550615118565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161510f90618583565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161523895949392919061717b565b6000604051808303818588803b15801561525157600080fd5b505af1158015615265573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561532b576007915050615401565b8060020160019054906101000a900460ff161561534c576002915050615401565b600061535784611c7f565b90506000810361539c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615393906185ef565b60405180910390fd5b4381106153ae57600092505050615401565b60006153b985612d39565b90504381106153ce5760019350505050615401565b6153d785615684565b80156153e857506153e7856156cb565b5b156153f95760049350505050615401565b600393505050505b919050565b60006002828418615417919061768b565b82841661542491906172ca565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115615495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161548c90618681565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161550890618713565b60405180910390fd5b61551a856156f6565b615559576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155509061877f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161558291906187d0565b60006040518083038185875af1925050503d80600081146155bf576040519150601f19603f3d011682016040523d82523d6000602084013e6155c4565b606091505b50915091506155d4828286615719565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600083838346306040516020016156659594939291906187e7565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546156b091906172ca565b6156c16156bc85611c7f565b6133bb565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561572957829050615779565b60008351111561573c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709190615c4e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6157c981615794565b81146157d457600080fd5b50565b6000813590506157e6816157c0565b92915050565b6000602082840312156158025761580161578a565b5b6000615810848285016157d7565b91505092915050565b60008115159050919050565b61582e81615819565b82525050565b60006020820190506158496000830184615825565b92915050565b6000819050919050565b6158628161584f565b82525050565b600060208201905061587d6000830184615859565b92915050565b61588c8161584f565b811461589757600080fd5b50565b6000813590506158a981615883565b92915050565b600060ff82169050919050565b6158c5816158af565b81146158d057600080fd5b50565b6000813590506158e2816158bc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261590d5761590c6158e8565b5b8235905067ffffffffffffffff81111561592a576159296158ed565b5b602083019150836001820283011115615946576159456158f2565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61599b82615952565b810181811067ffffffffffffffff821117156159ba576159b9615963565b5b80604052505050565b60006159cd615780565b90506159d98282615992565b919050565b600067ffffffffffffffff8211156159f9576159f8615963565b5b615a0282615952565b9050602081019050919050565b82818337600083830152505050565b6000615a31615a2c846159de565b6159c3565b905082815260208101848484011115615a4d57615a4c61594d565b5b615a58848285615a0f565b509392505050565b600082601f830112615a7557615a746158e8565b5b8135615a85848260208601615a1e565b91505092915050565b6000819050919050565b615aa181615a8e565b8114615aac57600080fd5b50565b600081359050615abe81615a98565b92915050565b60008060008060008060008060e0898b031215615ae457615ae361578a565b5b6000615af28b828c0161589a565b9850506020615b038b828c016158d3565b975050604089013567ffffffffffffffff811115615b2457615b2361578f565b5b615b308b828c016158f7565b9650965050606089013567ffffffffffffffff811115615b5357615b5261578f565b5b615b5f8b828c01615a60565b9450506080615b708b828c016158d3565b93505060a0615b818b828c01615aaf565b92505060c0615b928b828c01615aaf565b9150509295985092959890939650565b600060208284031215615bb857615bb761578a565b5b6000615bc68482850161589a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615c09578082015181840152602081019050615bee565b60008484015250505050565b6000615c2082615bcf565b615c2a8185615bda565b9350615c3a818560208601615beb565b615c4381615952565b840191505092915050565b60006020820190508181036000830152615c688184615c15565b905092915050565b600067ffffffffffffffff821115615c8b57615c8a615963565b5b615c9482615952565b9050602081019050919050565b6000615cb4615caf84615c70565b6159c3565b905082815260208101848484011115615cd057615ccf61594d565b5b615cdb848285615a0f565b509392505050565b600082601f830112615cf857615cf76158e8565b5b8135615d08848260208601615ca1565b91505092915050565b600060208284031215615d2757615d2661578a565b5b600082013567ffffffffffffffff811115615d4557615d4461578f565b5b615d5184828501615ce3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615d8582615d5a565b9050919050565b615d9581615d7a565b8114615da057600080fd5b50565b600081359050615db281615d8c565b92915050565b60008060408385031215615dcf57615dce61578a565b5b6000615ddd8582860161589a565b9250506020615dee85828601615da3565b9150509250929050565b60008060008060808587031215615e1257615e1161578a565b5b6000615e2087828801615da3565b9450506020615e3187828801615da3565b9350506040615e428782880161589a565b925050606085013567ffffffffffffffff811115615e6357615e6261578f565b5b615e6f87828801615a60565b91505092959194509250565b615e8481615794565b82525050565b6000602082019050615e9f6000830184615e7b565b92915050565b615eae81615d7a565b82525050565b6000602082019050615ec96000830184615ea5565b92915050565b600067ffffffffffffffff821115615eea57615ee9615963565b5b602082029050602081019050919050565b6000615f0e615f0984615ecf565b6159c3565b90508083825260208201905060208402830185811115615f3157615f306158f2565b5b835b81811015615f5a5780615f468882615da3565b845260208401935050602081019050615f33565b5050509392505050565b600082601f830112615f7957615f786158e8565b5b8135615f89848260208601615efb565b91505092915050565b600067ffffffffffffffff821115615fad57615fac615963565b5b602082029050602081019050919050565b6000615fd1615fcc84615f92565b6159c3565b90508083825260208201905060208402830185811115615ff457615ff36158f2565b5b835b8181101561601d5780616009888261589a565b845260208401935050602081019050615ff6565b5050509392505050565b600082601f83011261603c5761603b6158e8565b5b813561604c848260208601615fbe565b91505092915050565b600067ffffffffffffffff8211156160705761606f615963565b5b602082029050602081019050919050565b600061609461608f84616055565b6159c3565b905080838252602082019050602084028301858111156160b7576160b66158f2565b5b835b818110156160fe57803567ffffffffffffffff8111156160dc576160db6158e8565b5b8086016160e98982615a60565b855260208501945050506020810190506160b9565b5050509392505050565b600082601f83011261611d5761611c6158e8565b5b813561612d848260208601616081565b91505092915050565b600080600080608085870312156161505761614f61578a565b5b600085013567ffffffffffffffff81111561616e5761616d61578f565b5b61617a87828801615f64565b945050602085013567ffffffffffffffff81111561619b5761619a61578f565b5b6161a787828801616027565b935050604085013567ffffffffffffffff8111156161c8576161c761578f565b5b6161d487828801616108565b92505060606161e587828801615aaf565b91505092959194509250565b6161fa81615a8e565b82525050565b600060208201905061621560008301846161f1565b92915050565b600080600080600060a086880312156162375761623661578a565b5b60006162458882890161589a565b9550506020616256888289016158d3565b9450506040616267888289016158d3565b935050606061627888828901615aaf565b925050608061628988828901615aaf565b9150509295509295909350565b600080600080608085870312156162b0576162af61578a565b5b600085013567ffffffffffffffff8111156162ce576162cd61578f565b5b6162da87828801615ce3565b94505060206162eb8782880161589a565b93505060406162fc8782880161589a565b925050606061630d87828801615da3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061635957616358616319565b5b50565b600081905061636a82616348565b919050565b600061637a8261635c565b9050919050565b61638a8161636f565b82525050565b60006020820190506163a56000830184616381565b92915050565b600481106163bc576163bb616319565b5b50565b60008190506163cd826163ab565b919050565b60006163dd826163bf565b9050919050565b6163ed816163d2565b82525050565b600060208201905061640860008301846163e4565b92915050565b60008083601f840112616424576164236158e8565b5b8235905067ffffffffffffffff811115616441576164406158ed565b5b60208301915083600182028301111561645d5761645c6158f2565b5b9250929050565b6000806020838503121561647b5761647a61578a565b5b600083013567ffffffffffffffff8111156164995761649861578f565b5b6164a58582860161640e565b92509250509250929050565b60006060820190506164c66000830186615859565b6164d36020830185615859565b6164e06040830184615859565b949350505050565b600080604083850312156164ff576164fe61578a565b5b600061650d8582860161589a565b925050602061651e858286016158d3565b9150509250929050565b6000806000806000608086880312156165445761654361578a565b5b60006165528882890161589a565b9550506020616563888289016158d3565b945050604086013567ffffffffffffffff8111156165845761658361578f565b5b616590888289016158f7565b9350935050606086013567ffffffffffffffff8111156165b3576165b261578f565b5b6165bf88828901615a60565b9150509295509295909350565b6000602082840312156165e2576165e161578a565b5b60006165f084828501615da3565b91505092915050565b60006020828403121561660f5761660e61578a565b5b600082013567ffffffffffffffff81111561662d5761662c61578f565b5b61663984828501615a60565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061666982616642565b616673818561664d565b9350616683818560208601615beb565b61668c81615952565b840191505092915050565b60006040820190506166ac6000830185615825565b81810360208301526166be818461665e565b90509392505050565b600080600080606085870312156166e1576166e061578a565b5b60006166ef8782880161589a565b9450506020616700878288016158d3565b935050604085013567ffffffffffffffff8111156167215761672061578f565b5b61672d878288016158f7565b925092505092959194509250565b600080600080608085870312156167555761675461578a565b5b600085013567ffffffffffffffff8111156167735761677261578f565b5b61677f87828801615f64565b945050602085013567ffffffffffffffff8111156167a05761679f61578f565b5b6167ac87828801616027565b935050604085013567ffffffffffffffff8111156167cd576167cc61578f565b5b6167d987828801616108565b925050606085013567ffffffffffffffff8111156167fa576167f961578f565b5b61680687828801615ce3565b91505092959194509250565b60008060006060848603121561682b5761682a61578a565b5b600061683986828701615da3565b935050602061684a8682870161589a565b925050604084013567ffffffffffffffff81111561686b5761686a61578f565b5b61687786828701615a60565b9150509250925092565b600061688c82615d5a565b9050919050565b600061689e82616881565b9050919050565b6168ae81616893565b81146168b957600080fd5b50565b6000813590506168cb816168a5565b92915050565b6000602082840312156168e7576168e661578a565b5b60006168f5848285016168bc565b91505092915050565b600080600080600060a0868803121561691a5761691961578a565b5b600061692888828901615da3565b955050602061693988828901615da3565b945050604086013567ffffffffffffffff81111561695a5761695961578f565b5b61696688828901616027565b935050606086013567ffffffffffffffff8111156169875761698661578f565b5b61699388828901616027565b925050608086013567ffffffffffffffff8111156169b4576169b361578f565b5b6169c088828901615a60565b9150509295509295909350565b600080600080606085870312156169e7576169e661578a565b5b60006169f587828801615da3565b9450506020616a068782880161589a565b935050604085013567ffffffffffffffff811115616a2757616a2661578f565b5b616a338782880161640e565b925092505092959194509250565b60008060408385031215616a5857616a5761578a565b5b6000616a668582860161589a565b9250506020616a778582860161589a565b9150509250929050565b60008060408385031215616a9857616a9761578a565b5b6000616aa685828601615da3565b9250506020616ab78582860161589a565b9150509250929050565b600080600080600060a08688031215616add57616adc61578a565b5b6000616aeb88828901615da3565b9550506020616afc88828901615da3565b9450506040616b0d8882890161589a565b9350506060616b1e8882890161589a565b925050608086013567ffffffffffffffff811115616b3f57616b3e61578f565b5b616b4b88828901615a60565b9150509295509295909350565b6000819050919050565b6000616b7d616b78616b7384615d5a565b616b58565b615d5a565b9050919050565b6000616b8f82616b62565b9050919050565b6000616ba182616b84565b9050919050565b616bb181616b96565b82525050565b6000602082019050616bcc6000830184616ba8565b92915050565b600081905092915050565b6000616be98385616bd2565b9350616bf6838584615a0f565b82840190509392505050565b6000616c0f828486616bdd565b91508190509392505050565b616c24816158af565b82525050565b600060a082019050616c3f60008301886161f1565b616c4c6020830187615859565b616c596040830186616c1b565b616c6660608301856161f1565b616c7360808301846161f1565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616cb3601883615bda565b9150616cbe82616c7d565b602082019050919050565b60006020820190508181036000830152616ce281616ca6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616d3057607f821691505b602082108103616d4357616d42616ce9565b5b50919050565b50565b6000616d59600083616bd2565b9150616d6482616d49565b600082019050919050565b6000616d7a82616d4c565b9150819050919050565b600081905092915050565b6000616d9a82615bcf565b616da48185616d84565b9350616db4818560208601615beb565b80840191505092915050565b6000616dcc8284616d8f565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000616e33602183615bda565b9150616e3e82616dd7565b604082019050919050565b60006020820190508181036000830152616e6281616e26565b9050919050565b600081519050616e7881615883565b92915050565b600060208284031215616e9457616e9361578a565b5b6000616ea284828501616e69565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616ee081615d7a565b82525050565b6000616ef28383616ed7565b60208301905092915050565b6000602082019050919050565b6000616f1682616eab565b616f208185616eb6565b9350616f2b83616ec7565b8060005b83811015616f5c578151616f438882616ee6565b9750616f4e83616efe565b925050600181019050616f2f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616f9e8161584f565b82525050565b6000616fb08383616f95565b60208301905092915050565b6000602082019050919050565b6000616fd482616f69565b616fde8185616f74565b9350616fe983616f85565b8060005b8381101561701a5781516170018882616fa4565b975061700c83616fbc565b925050600181019050616fed565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061706f82616642565b6170798185617053565b9350617089818560208601615beb565b61709281615952565b840191505092915050565b60006170a98383617064565b905092915050565b6000602082019050919050565b60006170c982617027565b6170d38185617032565b9350836020820285016170e585617043565b8060005b858110156171215784840389528151617102858261709d565b945061710d836170b1565b925060208a019950506001810190506170e9565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061716561716061715b84617133565b61713d565b615a8e565b9050919050565b6171758161714a565b82525050565b600060a08201905081810360008301526171958188616f0b565b905081810360208301526171a98187616fc9565b905081810360408301526171bd81866170be565b90506171cc606083018561716c565b6171d960808301846161f1565b9695505050505050565b6000815190506171f281615a98565b92915050565b60006020828403121561720e5761720d61578a565b5b600061721c848285016171e3565b91505092915050565b600060c082019050818103600083015261723f8189616f0b565b905081810360208301526172538188616fc9565b9050818103604083015261726781876170be565b9050617276606083018661716c565b61728360808301856161f1565b61729060a0830184615859565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006172d58261584f565b91506172e08361584f565b92508282019050808211156172f8576172f761729b565b5b92915050565b60006040820190506173136000830185615859565b6173206020830184615859565b9392505050565b600060608201905061733c60008301866161f1565b6173496020830185615859565b6173566040830184616c1b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026173c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617383565b6173ca8683617383565b95508019841693508086168417925050509392505050565b60006173fd6173f86173f38461584f565b616b58565b61584f565b9050919050565b6000819050919050565b617417836173e2565b61742b61742382617404565b848454617390565b825550505050565b600090565b617440617433565b61744b81848461740e565b505050565b5b8181101561746f57617464600082617438565b600181019050617451565b5050565b601f8211156174b4576174858161735e565b61748e84617373565b8101602085101561749d578190505b6174b16174a985617373565b830182617450565b50505b505050565b600082821c905092915050565b60006174d7600019846008026174b9565b1980831691505092915050565b60006174f083836174c6565b9150826002028217905092915050565b61750982615bcf565b67ffffffffffffffff81111561752257617521615963565b5b61752c8254616d18565b617537828285617473565b600060209050601f83116001811461756a5760008415617558578287015190505b61756285826174e4565b8655506175ca565b601f1984166175788661735e565b60005b828110156175a05784890151825560018201915060208501945060208101905061757b565b868310156175bd57848901516175b9601f8916826174c6565b8355505b6001600288020188555050505b505050505050565b60006175dd8261584f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361760f5761760e61729b565b5b600182019050919050565b60006176258261584f565b91506176308361584f565b925082820261763e8161584f565b915082820484148315176176555761765461729b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006176968261584f565b91506176a18361584f565b9250826176b1576176b061765c565b5b828204905092915050565b60006176c78261584f565b91506176d28361584f565b92508282039050818111156176ea576176e961729b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201905081810360008301526177398187616f0b565b9050818103602083015261774d8186616fc9565b9050818103604083015261776181856170be565b905061777060608301846161f1565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006177d5602683615bda565b91506177e082617779565b604082019050919050565b60006020820190508181036000830152617804816177c8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617867602783615bda565b91506178728261780b565b604082019050919050565b600060208201905081810360008301526178968161785a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006178f9602683615bda565b91506179048261789d565b604082019050919050565b60006020820190508181036000830152617928816178ec565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b600061798b602383615bda565b91506179968261792f565b604082019050919050565b600060208201905081810360008301526179ba8161797e565b9050919050565b60006080820190506179d66000830187615859565b6179e36020830186616c1b565b6179f06040830185615859565b8181036060830152617a028184615c15565b905095945050505050565b600060a082019050617a226000830188615859565b617a2f6020830187616c1b565b617a3c6040830186615859565b8181036060830152617a4e8185615c15565b90508181036080830152617a62818461665e565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617af0604383615bda565b9150617afb82617a6e565b606082019050919050565b60006020820190508181036000830152617b1f81617ae3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617b5c602083615bda565b9150617b6782617b26565b602082019050919050565b60006020820190508181036000830152617b8b81617b4f565b9050919050565b617b9b81615819565b8114617ba657600080fd5b50565b600081519050617bb881617b92565b92915050565b600060208284031215617bd457617bd361578a565b5b6000617be284828501617ba9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617c21602083615bda565b9150617c2c82617beb565b602082019050919050565b60006020820190508181036000830152617c5081617c14565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617cb3603183615bda565b9150617cbe82617c57565b604082019050919050565b60006020820190508181036000830152617ce281617ca6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617d45602183615bda565b9150617d5082617ce9565b604082019050919050565b60006020820190508181036000830152617d7481617d38565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617db1601883615bda565b9150617dbc82617d7b565b602082019050919050565b60006020820190508181036000830152617de081617da4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000617e43602183615bda565b9150617e4e82617de7565b604082019050919050565b60006020820190508181036000830152617e7281617e36565b9050919050565b600067ffffffffffffffff82169050919050565b6000617e9882617e79565b9150617ea383617e79565b9250828201905067ffffffffffffffff811115617ec357617ec261729b565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000617f1182615bcf565b617f1b8185617ef5565b9350617f2b818560208601615beb565b617f3481615952565b840191505092915050565b6000617f4b8383617f06565b905092915050565b6000602082019050919050565b6000617f6b82617ec9565b617f758185617ed4565b935083602082028501617f8785617ee5565b8060005b85811015617fc35784840389528151617fa48582617f3f565b9450617faf83617f53565b925060208a01995050600181019050617f8b565b50829750879550505050505092915050565b6000617ff0617feb617fe684617e79565b616b58565b61584f565b9050919050565b61800081617fd5565b82525050565b60006101208201905061801c600083018c615859565b618029602083018b615ea5565b818103604083015261803b818a616f0b565b9050818103606083015261804f8189616fc9565b905081810360808301526180638188617f60565b905081810360a083015261807781876170be565b905061808660c0830186617ff7565b61809360e0830185617ff7565b8181036101008301526180a68184615c15565b90509a9950505050505050505050565b60006040820190506180cb6000830185615ea5565b6180d86020830184615859565b9392505050565b60006040820190506180f46000830185615ea5565b6181016020830184615ea5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618164602783615bda565b915061816f82618108565b604082019050919050565b6000602082019050818103600083015261819381618157565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006181d0600283616d84565b91506181db8261819a565b600282019050919050565b6000819050919050565b6182016181fc82615a8e565b6181e6565b82525050565b6000618212826181c3565b915061821e82856181f0565b60208201915061822e82846181f0565b6020820191508190509392505050565b600060808201905061825360008301876161f1565b6182606020830186616c1b565b61826d60408301856161f1565b61827a60608301846161f1565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006182b9601883615bda565b91506182c482618283565b602082019050919050565b600060208201905081810360008301526182e8816182ac565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618325601f83615bda565b9150618330826182ef565b602082019050919050565b6000602082019050818103600083015261835481618318565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006183b7602283615bda565b91506183c28261835b565b604082019050919050565b600060208201905081810360008301526183e6816183aa565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618449602283615bda565b9150618454826183ed565b604082019050919050565b600060208201905081810360008301526184788161843c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006184db602783615bda565b91506184e68261847f565b604082019050919050565b6000602082019050818103600083015261850a816184ce565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061856d603583615bda565b915061857882618511565b604082019050919050565b6000602082019050818103600083015261859c81618560565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006185d9601d83615bda565b91506185e4826185a3565b602082019050919050565b60006020820190508181036000830152618608816185cc565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061866b602683615bda565b91506186768261860f565b604082019050919050565b6000602082019050818103600083015261869a8161865e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006186fd602683615bda565b9150618708826186a1565b604082019050919050565b6000602082019050818103600083015261872c816186f0565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618769601d83615bda565b915061877482618733565b602082019050919050565b600060208201905081810360008301526187988161875c565b9050919050565b60006187aa82616642565b6187b48185616bd2565b93506187c4818560208601615beb565b80840191505092915050565b60006187dc828461879f565b915081905092915050565b600060a0820190506187fc60008301886161f1565b61880960208301876161f1565b61881660408301866161f1565b6188236060830185615859565b6188306080830184615ea5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220c2f510f48babb01f26563e04fd4d581d09065fd3103913bd8e2508c65acef2cf64736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106104405760003560e01c8063794d556011610234578063bc197c811161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e61146112ee578063f2fde38b1461132b578063f8ce560a14611354578063fc0c546a14611391578063fea856a1146113bc57610486565b8063deaaa7cc146111f7578063e0c410cc14611222578063ea0217cf1461125f578063eb9019d414611288578063ece40cc1146112c557610486565b8063ca1d209d116100fd578063ca1d209d1461110b578063cf68625914611127578063d33219b414611164578063dc73204b1461118f578063dd4e2ba5146111cc57610486565b8063bc197c811461102b578063c01f9e3714611068578063c28bc2fa146110a5578063c59057e4146110ce57610486565b806396aa167e116101bc578063ab58fb8e11610180578063ab58fb8e14610f0c578063abe1aae614610f49578063b58131b014610f86578063b59d18a014610fb1578063bba9c21914610fee57610486565b806396aa167e14610e2557806397c3d33414610e505780639a802a6d14610e7b578063a7713a7014610eb8578063a890c91014610ee357610486565b8063868661cb11610203578063868661cb14610d2c57806387030f4d14610d575780638da5cb5b14610d805780638fb5548f14610dab578063902bfa2414610de857610486565b8063794d556014610c385780637b3c71d314610c755780637d5e81e214610cb2578063809b268e14610cef57610486565b80633f3b3b271161034557806356781388116102cd57806369e0e3461161029157806369e0e34614610b405780636e04ff0d14610b7d57806370084d7a14610bbb57806370b0f66014610bf8578063715018a614610c2157610486565b80635678138814610a0f5780635b6b465214610a4c5780635ced7d4014610a895780635f398a1414610ac657806360c4247f14610b0357610486565b80634585e33b116103145780634585e33b146109145780634fac2bb71461093d578063535bf50f1461097a578063544ffc9c146109a557806354fd4d50146109e457610486565b80633f3b3b27146108445780633fafa1271461086f578063438596321461089a578063446a156f146108d757610486565b8063156277be116103c85780632fe3e261116103975780632fe3e2611461074b5780633932abb1146107765780633bccf4fd146107a15780633be2f2a3146107de5780633e4f49e61461080757610486565b8063156277be14610664578063160cbed7146106a15780632656227d146106de5780632d63f6931461070e57610486565b806306fdde031161040f57806306fdde03146105595780630cee172514610584578063141a6c22146105ad578063148038b0146105ea578063150b7a021461062757610486565b806301ffc9a71461048b57806302a251a3146104c857806303420181146104f357806306f3f9e61461053057610486565b36610486573073ffffffffffffffffffffffffffffffffffffffff166104646113c6565b73ffffffffffffffffffffffffffffffffffffffff161461048457600080fd5b005b600080fd5b34801561049757600080fd5b506104b260048036038101906104ad91906157ec565b6113d5565b6040516104bf9190615834565b60405180910390f35b3480156104d457600080fd5b506104dd6113e7565b6040516104ea9190615868565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190615ac4565b6113f6565b6040516105279190615868565b60405180910390f35b34801561053c57600080fd5b5061055760048036038101906105529190615ba2565b6114db565b005b34801561056557600080fd5b5061056e6115d2565b60405161057b9190615c4e565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615ba2565b611664565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615d11565b6117e4565b6040516105e19190615868565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190615db8565b61180c565b60405161061e9190615868565b60405180910390f35b34801561063357600080fd5b5061064e60048036038101906106499190615df8565b611831565b60405161065b9190615e8a565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190615ba2565b611845565b6040516106989190615eb4565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c39190616136565b611878565b6040516106d59190615868565b60405180910390f35b6106f860048036038101906106f39190616136565b611b32565b6040516107059190615868565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190615ba2565b611c7f565b6040516107429190615868565b60405180910390f35b34801561075757600080fd5b50610760611ced565b60405161076d9190616200565b60405180910390f35b34801561078257600080fd5b5061078b611d11565b6040516107989190615868565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c3919061621b565b611d20565b6040516107d59190615868565b60405180910390f35b3480156107ea57600080fd5b5061080560048036038101906108009190616296565b611daa565b005b34801561081357600080fd5b5061082e60048036038101906108299190615ba2565b611f65565b60405161083b9190616390565b60405180910390f35b34801561085057600080fd5b50610859611f77565b6040516108669190615868565b60405180910390f35b34801561087b57600080fd5b50610884611f7d565b6040516108919190615868565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc9190615db8565b611f83565b6040516108ce9190615834565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190615ba2565b611fee565b60405161090b91906163f3565b60405180910390f35b34801561092057600080fd5b5061093b60048036038101906109369190616464565b612018565b005b34801561094957600080fd5b50610964600480360381019061095f9190615ba2565b61230c565b6040516109719190615834565b60405180910390f35b34801561098657600080fd5b5061098f61232c565b60405161099c9190615868565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c79190615ba2565b612336565b6040516109db939291906164b1565b60405180910390f35b3480156109f057600080fd5b506109f961236e565b604051610a069190615c4e565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a3191906164e8565b6123ab565b604051610a439190615868565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190615ba2565b6123dc565b604051610a809190615868565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190615ba2565b6123f4565b604051610abd9190615868565b60405180910390f35b348015610ad257600080fd5b50610aed6004803603810190610ae89190616528565b61240c565b604051610afa9190615868565b60405180910390f35b348015610b0f57600080fd5b50610b2a6004803603810190610b259190615ba2565b612476565b604051610b379190615868565b60405180910390f35b348015610b4c57600080fd5b50610b676004803603810190610b6291906165cc565b6125c2565b604051610b749190615834565b60405180910390f35b348015610b8957600080fd5b50610ba46004803603810190610b9f91906165f9565b6125e2565b604051610bb2929190616697565b60405180910390f35b348015610bc757600080fd5b50610be26004803603810190610bdd9190615ba2565b61269c565b604051610bef91906163f3565b60405180910390f35b348015610c0457600080fd5b50610c1f6004803603810190610c1a9190615ba2565b6126bc565b005b348015610c2d57600080fd5b50610c366127b3565b005b348015610c4457600080fd5b50610c5f6004803603810190610c5a9190615ba2565b6127c7565b604051610c6c9190615868565b60405180910390f35b348015610c8157600080fd5b50610c9c6004803603810190610c9791906166c7565b6127df565b604051610ca99190615868565b60405180910390f35b348015610cbe57600080fd5b50610cd96004803603810190610cd4919061673b565b612847565b604051610ce69190615868565b60405180910390f35b348015610cfb57600080fd5b50610d166004803603810190610d119190615ba2565b612867565b604051610d239190615834565b60405180910390f35b348015610d3857600080fd5b50610d41612891565b604051610d4e9190615868565b60405180910390f35b348015610d6357600080fd5b50610d7e6004803603810190610d799190615ba2565b612897565b005b348015610d8c57600080fd5b50610d9561293a565b604051610da29190615eb4565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd9190615ba2565b612964565b604051610ddf9190615c4e565b60405180910390f35b348015610df457600080fd5b50610e0f6004803603810190610e0a9190615ba2565b612a04565b604051610e1c9190615834565b60405180910390f35b348015610e3157600080fd5b50610e3a612a24565b604051610e479190615868565b60405180910390f35b348015610e5c57600080fd5b50610e65612a2a565b604051610e729190615868565b60405180910390f35b348015610e8757600080fd5b50610ea26004803603810190610e9d9190616812565b612a33565b604051610eaf9190615868565b60405180910390f35b348015610ec457600080fd5b50610ecd612a49565b604051610eda9190615868565b60405180910390f35b348015610eef57600080fd5b50610f0a6004803603810190610f0591906168d1565b612a72565b005b348015610f1857600080fd5b50610f336004803603810190610f2e9190615ba2565b612b69565b604051610f409190615868565b60405180910390f35b348015610f5557600080fd5b50610f706004803603810190610f6b9190615ba2565b612c36565b604051610f7d9190615c4e565b60405180910390f35b348015610f9257600080fd5b50610f9b612cdb565b604051610fa89190615868565b60405180910390f35b348015610fbd57600080fd5b50610fd86004803603810190610fd39190615ba2565b612cea565b604051610fe59190615868565b60405180910390f35b348015610ffa57600080fd5b5061101560048036038101906110109190615ba2565b612d07565b6040516110229190615868565b60405180910390f35b34801561103757600080fd5b50611052600480360381019061104d91906168fe565b612d24565b60405161105f9190615e8a565b60405180910390f35b34801561107457600080fd5b5061108f600480360381019061108a9190615ba2565b612d39565b60405161109c9190615868565b60405180910390f35b3480156110b157600080fd5b506110cc60048036038101906110c791906169cd565b612da7565b005b3480156110da57600080fd5b506110f560048036038101906110f09190616136565b612ee8565b6040516111029190615868565b60405180910390f35b61112560048036038101906111209190615ba2565b612f24565b005b34801561113357600080fd5b5061114e60048036038101906111499190615d11565b613011565b60405161115b9190615868565b60405180910390f35b34801561117057600080fd5b5061117961303f565b6040516111869190615eb4565b60405180910390f35b34801561119b57600080fd5b506111b660048036038101906111b19190616a41565b613069565b6040516111c39190615868565b60405180910390f35b3480156111d857600080fd5b506111e161308e565b6040516111ee9190615c4e565b60405180910390f35b34801561120357600080fd5b5061120c6130cb565b6040516112199190616200565b60405180910390f35b34801561122e57600080fd5b5061124960048036038101906112449190615ba2565b6130ef565b6040516112569190615834565b60405180910390f35b34801561126b57600080fd5b5061128660048036038101906112819190615ba2565b613119565b005b34801561129457600080fd5b506112af60048036038101906112aa9190616a81565b613210565b6040516112bc9190615868565b60405180910390f35b3480156112d157600080fd5b506112ec60048036038101906112e79190615ba2565b61322c565b005b3480156112fa57600080fd5b5061131560048036038101906113109190616ac1565b613323565b6040516113229190615e8a565b60405180910390f35b34801561133757600080fd5b50611352600480360381019061134d91906165cc565b613338565b005b34801561136057600080fd5b5061137b60048036038101906113769190615ba2565b6133bb565b6040516113889190615868565b60405180910390f35b34801561139d57600080fd5b506113a66133cd565b6040516113b39190616bb7565b60405180910390f35b6113c46133f1565b005b60006113d06137d0565b905090565b60006113e0826137fa565b9050919050565b60006113f1613874565b905090565b6000806114796114717fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051611432929190616c02565b60405180910390208b80519060200120604051602001611456959493929190616c2a565b6040516020818303038152906040528051906020012061387e565b868686613898565b90506114cc8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a6138c3565b91505098975050505050505050565b6114e36113c6565b73ffffffffffffffffffffffffffffffffffffffff16611501613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115766113c6565b73ffffffffffffffffffffffffffffffffffffffff16146115c657600061159b613a87565b6040516115a9929190616c02565b604051809103902090505b806115bf6002613a94565b036115b457505b6115cf81613b70565b50565b6060600080546115e190616d18565b80601f016020809104026020016040519081016040528092919081815260200182805461160d90616d18565b801561165a5780601f1061162f5761010080835404028352916020019161165a565b820191906000526020600020905b81548152906001019060200180831161163d57829003601f168201915b5050505050905090565b6002600381111561167857611677616319565b5b601c600083815260200190815260200160002060009054906101000a900460ff1660038111156116ab576116aa616319565b5b036117af5760006017600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161172b90616d6f565b60006040518083038185875af1925050503d8060008114611768576040519150601f19603f3d011682016040523d82523d6000602084013e61176d565b606091505b50509050806117a8576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506117e1565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006015826040516117f69190616dc0565b9081526020016040518091039020549050919050565b6017602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061188786868686612ee8565b90506004600781111561189d5761189c616319565b5b6118a682611f65565b60078111156118b8576118b7616319565b5b146118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90616e49565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190616e7e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b81526004016119f195949392919061717b565b602060405180830381865afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3291906171f8565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611aaf96959493929190617225565b600060405180830381600087803b158015611ac957600080fd5b505af1158015611add573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b0f91906172ca565b604051611b1d9291906172fe565b60405180910390a18192505050949350505050565b600080611b4186868686612ee8565b90506000611b4e82611f65565b905060046007811115611b6457611b63616319565b5b816007811115611b7757611b76616319565b5b1480611ba7575060056007811115611b9257611b91616319565b5b816007811115611ba557611ba4616319565b5b145b611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd90616e49565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c439190615868565b60405180910390a1611c588288888888613d24565b611c658288888888613e07565b611c728288888888613e1b565b8192505050949350505050565b6000611cdc600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d1b613e84565b905090565b600080611d81611d797f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611d5e93929190617327565b6040516020818303038152906040528051906020012061387e565b868686613898565b9050611d9e87828860405180602001604052806000815250613e8e565b91505095945050505050565b611db2613eae565b4260136000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601c6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611e1657611e15616319565b5b02179055508160146000600d548152602001908152602001600020819055508260196000600d54815260200190815260200160002081905550600d54601585604051611e629190616dc0565b9081526020016040518091039020819055508360166000600d5481526020019081526020016000209081611e969190617500565b5080601b6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a6000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160126000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d6000815480929190611f5a906175d2565b919050555050505050565b6000611f7082613f2c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601c600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000612032604051806020016040528060008152506125e2565b5090508061206c576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060126000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601a6000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060196000600d5481526020019081526020016000205460186000600d548152602001908152602001600020541115612299576001601c6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561213357612132616319565b5b021790555060006064600f5460186000600d5481526020019081526020016000205461215f919061761a565b612169919061768b565b90506000601b6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516121c690616d6f565b60006040518083038185875af1925050503d8060008114612203576040519150601f19603f3d011682016040523d82523d6000602084013e612208565b606091505b50509050806122635760186000600d548152602001908152602001600020546040517f265b39fb00000000000000000000000000000000000000000000000000000000815260040161225a9190615868565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612307565b6002601c6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156122d2576122d1616319565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b601a6020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806123b6613a7f565b90506123d384828560405180602001604052806000815250613e8e565b91505092915050565b60196020528060005260406000206000915090505481565b60146020528060005260406000206000915090505481565b600080612417613a7f565b905061246a87828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050876138c3565b91505095945050505050565b600080600960000180549050905060008103612497576008549150506125bd565b600060096000016001836124ab91906176bc565b815481106124bc576124bb6176f0565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff16116125a45780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506125bd565b6125b88460096140ff90919063ffffffff16565b925050505b919050565b601d6020528060005260406000206000915054906101000a900460ff1681565b6000606060126000600d54815260200190815260200160002060009054906101000a900460ff168015612695575060136000600d548152602001908152602001600020600060146000600d5481526020019081526020016000205481526020019081526020016000205460136000600d548152602001908152602001600020600060146000600d548152602001908152602001600020548152602001908152602001600020544261269391906176bc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b6126c46113c6565b73ffffffffffffffffffffffffffffffffffffffff166126e2613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166127576113c6565b73ffffffffffffffffffffffffffffffffffffffff16146127a757600061277c613a87565b60405161278a929190616c02565b604051809103902090505b806127a06002613a94565b0361279557505b6127b081614257565b50565b6127bb613eae565b6127c5600061429c565b565b60186020528060005260406000206000915090505481565b6000806127ea613a7f565b905061283c86828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613e8e565b915050949350505050565b60006128516133f1565b61285d85858585614362565b9050949350505050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b61289f613eae565b6000601a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060126000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601c6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561293257612931616319565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6016602052806000526040600020600091509050805461298390616d18565b80601f01602080910402602001604051908101604052809291908181526020018280546129af90616d18565b80156129fc5780601f106129d1576101008083540402835291602001916129fc565b820191906000526020600020905b8154815290600101906020018083116129df57829003601f168201915b505050505081565b60126020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612a40848484614669565b90509392505050565b60008060096000018054905014612a6957612a6460096136e2565b612a6d565b6008545b905090565b612a7a6113c6565b73ffffffffffffffffffffffffffffffffffffffff16612a98613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612b0d6113c6565b73ffffffffffffffffffffffffffffffffffffffff1614612b5d576000612b32613a87565b604051612b40929190616c02565b604051809103902090505b80612b566002613a94565b03612b4b57505b612b6681614710565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612bda9190616200565b602060405180830381865afa158015612bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1b9190616e7e565b905060018114612c2b5780612c2e565b60005b915050919050565b6060601660008381526020019081526020016000208054612c5690616d18565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8290616d18565b8015612ccf5780601f10612ca457610100808354040283529160200191612ccf565b820191906000526020600020905b815481529060010190602001808311612cb257829003601f168201915b50505050509050919050565b6000612ce56147af565b905090565b600060196000838152602001908152602001600020549050919050565b600060186000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612d96600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff169050919050565b612daf6113c6565b73ffffffffffffffffffffffffffffffffffffffff16612dcd613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612e426113c6565b73ffffffffffffffffffffffffffffffffffffffff1614612e92576000612e67613a87565b604051612e75929190616c02565b604051809103902090505b80612e8b6002613a94565b03612e8057505b612ee18483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856147b9565b5050505050565b600084848484604051602001612f01949392919061771f565b6040516020818303038152906040528051906020012060001c9050949350505050565b80601a600082815260200190815260200160002060009054906101000a900460ff16612f7c576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346017600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fdc91906172ca565b925050819055503460186000848152602001908152602001600020600082825461300691906172ca565b925050819055505050565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6013602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b6000601a600083815260200190815260200160002060009054906101000a900460ff169050919050565b6131216113c6565b73ffffffffffffffffffffffffffffffffffffffff1661313f613a7f565b73ffffffffffffffffffffffffffffffffffffffff1614613195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318c90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166131b46113c6565b73ffffffffffffffffffffffffffffffffffffffff16146132045760006131d9613a87565b6040516131e7929190616c02565b604051809103902090505b806131fd6002613a94565b036131f257505b61320d816147e8565b50565b6000613224838361321f614870565b614669565b905092915050565b6132346113c6565b73ffffffffffffffffffffffffffffffffffffffff16613252613a7f565b73ffffffffffffffffffffffffffffffffffffffff16146132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f90616cc9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166132c76113c6565b73ffffffffffffffffffffffffffffffffffffffff16146133175760006132ec613a87565b6040516132fa929190616c02565b604051809103902090505b806133106002613a94565b0361330557505b61332081614887565b50565b600063f23a6e6160e01b905095945050505050565b613340613eae565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a6906177eb565b60405180910390fd5b6133b88161429c565b50565b60006133c6826148cc565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543411156134415733601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613473565b6040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156134d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cf9061787d565b60405180910390fd5b819050919050565b60008060008460000180549050905060006134fa866136e2565b90506000821180156135505750438660000160018461351991906176bc565b8154811061352a576135296176f0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156135e05761355e85613475565b8660000160018461356f91906176bc565b815481106135805761357f6176f0565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506136d3565b8560000160405180604001604052806135f84361377d565b63ffffffff16815260200161360c88613475565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613754578260000160018261370891906176bc565b81548110613719576137186176f0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613757565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156137c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137bf9061790f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061386d575061386c82614994565b5b9050919050565b6000600554905090565b600061389161388b614af9565b83614c13565b9050919050565b60008060006138a987878787614c46565b915091506138b681614d52565b8192505050949350505050565b600080600160008881526020019081526020016000209050600160078111156138ef576138ee616319565b5b6138f888611f65565b600781111561390a57613909616319565b5b1461394a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613941906179a1565b60405180910390fd5b60006139a987613999846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050613e76565b67ffffffffffffffff1686614669565b90506139b88888888488614f1e565b6000845103613a1a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613a0d94939291906179c1565b60405180910390a2613a71565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613a68959493929190617a0d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613a9f82615122565b15613ad6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613b78612a2a565b811115613bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bb190617b06565b60405180910390fd5b6000613bc4612a49565b905060008114158015613bdf57506000600960000180549050145b15613cd15760096000016040518060400160405280600063ffffffff168152602001613c0a84613475565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613ce58260096134e090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613d189291906172fe565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613d436113c6565b73ffffffffffffffffffffffffffffffffffffffff1614613e005760005b8451811015613dfe573073ffffffffffffffffffffffffffffffffffffffff16858281518110613d9457613d936176f0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603613ded57613dec838281518110613dcd57613dcc6176f0565b5b602002602001015180519060200120600261515790919063ffffffff16565b5b80613df7906175d2565b9050613d61565b505b5050505050565b613e1485858585856151d3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff16613e3a6113c6565b73ffffffffffffffffffffffffffffffffffffffff1614613e6f57613e5f6002615122565b613e6e57613e6d6002615271565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b6000613ea485858585613e9f614870565b6138c3565b9050949350505050565b613eb6613a7f565b73ffffffffffffffffffffffffffffffffffffffff16613ed461293a565b73ffffffffffffffffffffffffffffffffffffffff1614613f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f2190617b72565b60405180910390fd5b565b600080613f38836152f2565b905060046007811115613f4e57613f4d616319565b5b816007811115613f6157613f60616319565b5b14613f6f57809150506140fa565b6000600b60008581526020019081526020016000205490506000801b8103613f9b5781925050506140fa565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b8152600401613ff69190616200565b602060405180830381865afa158015614013573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140379190617bbe565b15614047576007925050506140fa565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016140a29190616200565b602060405180830381865afa1580156140bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140e39190617bbe565b156140f3576005925050506140fa565b6002925050505b919050565b6000438210614143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161413a90617c37565b60405180910390fd5b60008360000180549050905060005b818110156141c75760006141668284615406565b90508486600001828154811061417f5761417e6176f0565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156141b1578092506141c1565b6001816141be91906172ca565b91505b50614152565b6000821461422c57846000016001836141e091906176bc565b815481106141f1576141f06176f0565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661422f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a936004548260405161428a9291906172fe565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061436c612cdb565b614389614377613a7f565b60014361438491906176bc565b613210565b10156143ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143c190617cc9565b60405180910390fd5b60006143df8686868680519060200120612ee8565b90508451865114614425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161441c90617d5b565b60405180910390fd5b8351865114614469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161446090617d5b565b60405180910390fd5b60008651116144ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144a490617dc7565b60405180910390fd5b600060016000838152602001908152602001600020905061450d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061542c565b61454c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161454390617e59565b60405180910390fd5b600061455e614559611d11565b615446565b61456743615446565b6145719190617e8d565b905060006145856145806113e7565b615446565b826145909190617e8d565b90506145a8828460000161549d90919063ffffffff16565b6145be818460010161549d90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e0846145e8613a7f565b8b8b8d5167ffffffffffffffff81111561460557614604615963565b5b60405190808252806020026020018201604052801561463857816020015b60608152602001906001900390816146235790505b508c88888e60405161465299989796959493929190618006565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016146c69291906180b6565b602060405180830381865afa1580156146e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147079190616e7e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516147639291906180df565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606147df84848460405180606001604052806029815260200161883b602991396154cc565b90509392505050565b6000811161482b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148229061817a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405161485e9291906172fe565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461600654826040516148ba9291906172fe565b60405180910390a18060068190555050565b60006148d6612a2a565b6148df83612476565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b81526004016149389190615868565b602060405180830381865afa158015614955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149799190616e7e565b614983919061761a565b61498d919061768b565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614a7a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614ae257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614af25750614af1826155e0565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614b7557507f000000000000000000000000000000000000000000000000000000000000000046145b15614ba2577f00000000000000000000000000000000000000000000000000000000000000009050614c10565b614c0d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061564a565b90505b90565b60008282604051602001614c28929190618207565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614c81576000600391509150614d49565b601b8560ff1614158015614c995750601c8560ff1614155b15614cab576000600491509150614d49565b600060018787878760405160008152602001604052604051614cd0949392919061823e565b6020604051602081039080840390855afa158015614cf2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614d4057600060019250925050614d49565b80600092509250505b94509492505050565b60006004811115614d6657614d65616319565b5b816004811115614d7957614d78616319565b5b0315614f1b5760016004811115614d9357614d92616319565b5b816004811115614da657614da5616319565b5b03614de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ddd906182cf565b60405180910390fd5b60026004811115614dfa57614df9616319565b5b816004811115614e0d57614e0c616319565b5b03614e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614e449061833b565b60405180910390fd5b60036004811115614e6157614e60616319565b5b816004811115614e7457614e73616319565b5b03614eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614eab906183cd565b60405180910390fd5b600480811115614ec757614ec6616319565b5b816004811115614eda57614ed9616319565b5b03614f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614f119061845f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614fbb906184f1565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561503257615031616319565b5b60ff168460ff160361505e578281600001600082825461505291906172ca565b9250508190555061511a565b6001600281111561507257615071616319565b5b60ff168460ff160361509e578281600101600082825461509291906172ca565b92505081905550615119565b6002808111156150b1576150b0616319565b5b60ff168460ff16036150dd57828160020160008282546150d191906172ca565b92505081905550615118565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161510f90618583565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161523895949392919061717b565b6000604051808303818588803b15801561525157600080fd5b505af1158015615265573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561532b576007915050615401565b8060020160019054906101000a900460ff161561534c576002915050615401565b600061535784611c7f565b90506000810361539c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615393906185ef565b60405180910390fd5b4381106153ae57600092505050615401565b60006153b985612d39565b90504381106153ce5760019350505050615401565b6153d785615684565b80156153e857506153e7856156cb565b5b156153f95760049350505050615401565b600393505050505b919050565b60006002828418615417919061768b565b82841661542491906172ca565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115615495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161548c90618681565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161550890618713565b60405180910390fd5b61551a856156f6565b615559576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155509061877f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161558291906187d0565b60006040518083038185875af1925050503d80600081146155bf576040519150601f19603f3d011682016040523d82523d6000602084013e6155c4565b606091505b50915091506155d4828286615719565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600083838346306040516020016156659594939291906187e7565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546156b091906172ca565b6156c16156bc85611c7f565b6133bb565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561572957829050615779565b60008351111561573c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709190615c4e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6157c981615794565b81146157d457600080fd5b50565b6000813590506157e6816157c0565b92915050565b6000602082840312156158025761580161578a565b5b6000615810848285016157d7565b91505092915050565b60008115159050919050565b61582e81615819565b82525050565b60006020820190506158496000830184615825565b92915050565b6000819050919050565b6158628161584f565b82525050565b600060208201905061587d6000830184615859565b92915050565b61588c8161584f565b811461589757600080fd5b50565b6000813590506158a981615883565b92915050565b600060ff82169050919050565b6158c5816158af565b81146158d057600080fd5b50565b6000813590506158e2816158bc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261590d5761590c6158e8565b5b8235905067ffffffffffffffff81111561592a576159296158ed565b5b602083019150836001820283011115615946576159456158f2565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61599b82615952565b810181811067ffffffffffffffff821117156159ba576159b9615963565b5b80604052505050565b60006159cd615780565b90506159d98282615992565b919050565b600067ffffffffffffffff8211156159f9576159f8615963565b5b615a0282615952565b9050602081019050919050565b82818337600083830152505050565b6000615a31615a2c846159de565b6159c3565b905082815260208101848484011115615a4d57615a4c61594d565b5b615a58848285615a0f565b509392505050565b600082601f830112615a7557615a746158e8565b5b8135615a85848260208601615a1e565b91505092915050565b6000819050919050565b615aa181615a8e565b8114615aac57600080fd5b50565b600081359050615abe81615a98565b92915050565b60008060008060008060008060e0898b031215615ae457615ae361578a565b5b6000615af28b828c0161589a565b9850506020615b038b828c016158d3565b975050604089013567ffffffffffffffff811115615b2457615b2361578f565b5b615b308b828c016158f7565b9650965050606089013567ffffffffffffffff811115615b5357615b5261578f565b5b615b5f8b828c01615a60565b9450506080615b708b828c016158d3565b93505060a0615b818b828c01615aaf565b92505060c0615b928b828c01615aaf565b9150509295985092959890939650565b600060208284031215615bb857615bb761578a565b5b6000615bc68482850161589a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615c09578082015181840152602081019050615bee565b60008484015250505050565b6000615c2082615bcf565b615c2a8185615bda565b9350615c3a818560208601615beb565b615c4381615952565b840191505092915050565b60006020820190508181036000830152615c688184615c15565b905092915050565b600067ffffffffffffffff821115615c8b57615c8a615963565b5b615c9482615952565b9050602081019050919050565b6000615cb4615caf84615c70565b6159c3565b905082815260208101848484011115615cd057615ccf61594d565b5b615cdb848285615a0f565b509392505050565b600082601f830112615cf857615cf76158e8565b5b8135615d08848260208601615ca1565b91505092915050565b600060208284031215615d2757615d2661578a565b5b600082013567ffffffffffffffff811115615d4557615d4461578f565b5b615d5184828501615ce3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615d8582615d5a565b9050919050565b615d9581615d7a565b8114615da057600080fd5b50565b600081359050615db281615d8c565b92915050565b60008060408385031215615dcf57615dce61578a565b5b6000615ddd8582860161589a565b9250506020615dee85828601615da3565b9150509250929050565b60008060008060808587031215615e1257615e1161578a565b5b6000615e2087828801615da3565b9450506020615e3187828801615da3565b9350506040615e428782880161589a565b925050606085013567ffffffffffffffff811115615e6357615e6261578f565b5b615e6f87828801615a60565b91505092959194509250565b615e8481615794565b82525050565b6000602082019050615e9f6000830184615e7b565b92915050565b615eae81615d7a565b82525050565b6000602082019050615ec96000830184615ea5565b92915050565b600067ffffffffffffffff821115615eea57615ee9615963565b5b602082029050602081019050919050565b6000615f0e615f0984615ecf565b6159c3565b90508083825260208201905060208402830185811115615f3157615f306158f2565b5b835b81811015615f5a5780615f468882615da3565b845260208401935050602081019050615f33565b5050509392505050565b600082601f830112615f7957615f786158e8565b5b8135615f89848260208601615efb565b91505092915050565b600067ffffffffffffffff821115615fad57615fac615963565b5b602082029050602081019050919050565b6000615fd1615fcc84615f92565b6159c3565b90508083825260208201905060208402830185811115615ff457615ff36158f2565b5b835b8181101561601d5780616009888261589a565b845260208401935050602081019050615ff6565b5050509392505050565b600082601f83011261603c5761603b6158e8565b5b813561604c848260208601615fbe565b91505092915050565b600067ffffffffffffffff8211156160705761606f615963565b5b602082029050602081019050919050565b600061609461608f84616055565b6159c3565b905080838252602082019050602084028301858111156160b7576160b66158f2565b5b835b818110156160fe57803567ffffffffffffffff8111156160dc576160db6158e8565b5b8086016160e98982615a60565b855260208501945050506020810190506160b9565b5050509392505050565b600082601f83011261611d5761611c6158e8565b5b813561612d848260208601616081565b91505092915050565b600080600080608085870312156161505761614f61578a565b5b600085013567ffffffffffffffff81111561616e5761616d61578f565b5b61617a87828801615f64565b945050602085013567ffffffffffffffff81111561619b5761619a61578f565b5b6161a787828801616027565b935050604085013567ffffffffffffffff8111156161c8576161c761578f565b5b6161d487828801616108565b92505060606161e587828801615aaf565b91505092959194509250565b6161fa81615a8e565b82525050565b600060208201905061621560008301846161f1565b92915050565b600080600080600060a086880312156162375761623661578a565b5b60006162458882890161589a565b9550506020616256888289016158d3565b9450506040616267888289016158d3565b935050606061627888828901615aaf565b925050608061628988828901615aaf565b9150509295509295909350565b600080600080608085870312156162b0576162af61578a565b5b600085013567ffffffffffffffff8111156162ce576162cd61578f565b5b6162da87828801615ce3565b94505060206162eb8782880161589a565b93505060406162fc8782880161589a565b925050606061630d87828801615da3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061635957616358616319565b5b50565b600081905061636a82616348565b919050565b600061637a8261635c565b9050919050565b61638a8161636f565b82525050565b60006020820190506163a56000830184616381565b92915050565b600481106163bc576163bb616319565b5b50565b60008190506163cd826163ab565b919050565b60006163dd826163bf565b9050919050565b6163ed816163d2565b82525050565b600060208201905061640860008301846163e4565b92915050565b60008083601f840112616424576164236158e8565b5b8235905067ffffffffffffffff811115616441576164406158ed565b5b60208301915083600182028301111561645d5761645c6158f2565b5b9250929050565b6000806020838503121561647b5761647a61578a565b5b600083013567ffffffffffffffff8111156164995761649861578f565b5b6164a58582860161640e565b92509250509250929050565b60006060820190506164c66000830186615859565b6164d36020830185615859565b6164e06040830184615859565b949350505050565b600080604083850312156164ff576164fe61578a565b5b600061650d8582860161589a565b925050602061651e858286016158d3565b9150509250929050565b6000806000806000608086880312156165445761654361578a565b5b60006165528882890161589a565b9550506020616563888289016158d3565b945050604086013567ffffffffffffffff8111156165845761658361578f565b5b616590888289016158f7565b9350935050606086013567ffffffffffffffff8111156165b3576165b261578f565b5b6165bf88828901615a60565b9150509295509295909350565b6000602082840312156165e2576165e161578a565b5b60006165f084828501615da3565b91505092915050565b60006020828403121561660f5761660e61578a565b5b600082013567ffffffffffffffff81111561662d5761662c61578f565b5b61663984828501615a60565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061666982616642565b616673818561664d565b9350616683818560208601615beb565b61668c81615952565b840191505092915050565b60006040820190506166ac6000830185615825565b81810360208301526166be818461665e565b90509392505050565b600080600080606085870312156166e1576166e061578a565b5b60006166ef8782880161589a565b9450506020616700878288016158d3565b935050604085013567ffffffffffffffff8111156167215761672061578f565b5b61672d878288016158f7565b925092505092959194509250565b600080600080608085870312156167555761675461578a565b5b600085013567ffffffffffffffff8111156167735761677261578f565b5b61677f87828801615f64565b945050602085013567ffffffffffffffff8111156167a05761679f61578f565b5b6167ac87828801616027565b935050604085013567ffffffffffffffff8111156167cd576167cc61578f565b5b6167d987828801616108565b925050606085013567ffffffffffffffff8111156167fa576167f961578f565b5b61680687828801615ce3565b91505092959194509250565b60008060006060848603121561682b5761682a61578a565b5b600061683986828701615da3565b935050602061684a8682870161589a565b925050604084013567ffffffffffffffff81111561686b5761686a61578f565b5b61687786828701615a60565b9150509250925092565b600061688c82615d5a565b9050919050565b600061689e82616881565b9050919050565b6168ae81616893565b81146168b957600080fd5b50565b6000813590506168cb816168a5565b92915050565b6000602082840312156168e7576168e661578a565b5b60006168f5848285016168bc565b91505092915050565b600080600080600060a0868803121561691a5761691961578a565b5b600061692888828901615da3565b955050602061693988828901615da3565b945050604086013567ffffffffffffffff81111561695a5761695961578f565b5b61696688828901616027565b935050606086013567ffffffffffffffff8111156169875761698661578f565b5b61699388828901616027565b925050608086013567ffffffffffffffff8111156169b4576169b361578f565b5b6169c088828901615a60565b9150509295509295909350565b600080600080606085870312156169e7576169e661578a565b5b60006169f587828801615da3565b9450506020616a068782880161589a565b935050604085013567ffffffffffffffff811115616a2757616a2661578f565b5b616a338782880161640e565b925092505092959194509250565b60008060408385031215616a5857616a5761578a565b5b6000616a668582860161589a565b9250506020616a778582860161589a565b9150509250929050565b60008060408385031215616a9857616a9761578a565b5b6000616aa685828601615da3565b9250506020616ab78582860161589a565b9150509250929050565b600080600080600060a08688031215616add57616adc61578a565b5b6000616aeb88828901615da3565b9550506020616afc88828901615da3565b9450506040616b0d8882890161589a565b9350506060616b1e8882890161589a565b925050608086013567ffffffffffffffff811115616b3f57616b3e61578f565b5b616b4b88828901615a60565b9150509295509295909350565b6000819050919050565b6000616b7d616b78616b7384615d5a565b616b58565b615d5a565b9050919050565b6000616b8f82616b62565b9050919050565b6000616ba182616b84565b9050919050565b616bb181616b96565b82525050565b6000602082019050616bcc6000830184616ba8565b92915050565b600081905092915050565b6000616be98385616bd2565b9350616bf6838584615a0f565b82840190509392505050565b6000616c0f828486616bdd565b91508190509392505050565b616c24816158af565b82525050565b600060a082019050616c3f60008301886161f1565b616c4c6020830187615859565b616c596040830186616c1b565b616c6660608301856161f1565b616c7360808301846161f1565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616cb3601883615bda565b9150616cbe82616c7d565b602082019050919050565b60006020820190508181036000830152616ce281616ca6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616d3057607f821691505b602082108103616d4357616d42616ce9565b5b50919050565b50565b6000616d59600083616bd2565b9150616d6482616d49565b600082019050919050565b6000616d7a82616d4c565b9150819050919050565b600081905092915050565b6000616d9a82615bcf565b616da48185616d84565b9350616db4818560208601615beb565b80840191505092915050565b6000616dcc8284616d8f565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000616e33602183615bda565b9150616e3e82616dd7565b604082019050919050565b60006020820190508181036000830152616e6281616e26565b9050919050565b600081519050616e7881615883565b92915050565b600060208284031215616e9457616e9361578a565b5b6000616ea284828501616e69565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616ee081615d7a565b82525050565b6000616ef28383616ed7565b60208301905092915050565b6000602082019050919050565b6000616f1682616eab565b616f208185616eb6565b9350616f2b83616ec7565b8060005b83811015616f5c578151616f438882616ee6565b9750616f4e83616efe565b925050600181019050616f2f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b616f9e8161584f565b82525050565b6000616fb08383616f95565b60208301905092915050565b6000602082019050919050565b6000616fd482616f69565b616fde8185616f74565b9350616fe983616f85565b8060005b8381101561701a5781516170018882616fa4565b975061700c83616fbc565b925050600181019050616fed565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061706f82616642565b6170798185617053565b9350617089818560208601615beb565b61709281615952565b840191505092915050565b60006170a98383617064565b905092915050565b6000602082019050919050565b60006170c982617027565b6170d38185617032565b9350836020820285016170e585617043565b8060005b858110156171215784840389528151617102858261709d565b945061710d836170b1565b925060208a019950506001810190506170e9565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061716561716061715b84617133565b61713d565b615a8e565b9050919050565b6171758161714a565b82525050565b600060a08201905081810360008301526171958188616f0b565b905081810360208301526171a98187616fc9565b905081810360408301526171bd81866170be565b90506171cc606083018561716c565b6171d960808301846161f1565b9695505050505050565b6000815190506171f281615a98565b92915050565b60006020828403121561720e5761720d61578a565b5b600061721c848285016171e3565b91505092915050565b600060c082019050818103600083015261723f8189616f0b565b905081810360208301526172538188616fc9565b9050818103604083015261726781876170be565b9050617276606083018661716c565b61728360808301856161f1565b61729060a0830184615859565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006172d58261584f565b91506172e08361584f565b92508282019050808211156172f8576172f761729b565b5b92915050565b60006040820190506173136000830185615859565b6173206020830184615859565b9392505050565b600060608201905061733c60008301866161f1565b6173496020830185615859565b6173566040830184616c1b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026173c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617383565b6173ca8683617383565b95508019841693508086168417925050509392505050565b60006173fd6173f86173f38461584f565b616b58565b61584f565b9050919050565b6000819050919050565b617417836173e2565b61742b61742382617404565b848454617390565b825550505050565b600090565b617440617433565b61744b81848461740e565b505050565b5b8181101561746f57617464600082617438565b600181019050617451565b5050565b601f8211156174b4576174858161735e565b61748e84617373565b8101602085101561749d578190505b6174b16174a985617373565b830182617450565b50505b505050565b600082821c905092915050565b60006174d7600019846008026174b9565b1980831691505092915050565b60006174f083836174c6565b9150826002028217905092915050565b61750982615bcf565b67ffffffffffffffff81111561752257617521615963565b5b61752c8254616d18565b617537828285617473565b600060209050601f83116001811461756a5760008415617558578287015190505b61756285826174e4565b8655506175ca565b601f1984166175788661735e565b60005b828110156175a05784890151825560018201915060208501945060208101905061757b565b868310156175bd57848901516175b9601f8916826174c6565b8355505b6001600288020188555050505b505050505050565b60006175dd8261584f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361760f5761760e61729b565b5b600182019050919050565b60006176258261584f565b91506176308361584f565b925082820261763e8161584f565b915082820484148315176176555761765461729b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006176968261584f565b91506176a18361584f565b9250826176b1576176b061765c565b5b828204905092915050565b60006176c78261584f565b91506176d28361584f565b92508282039050818111156176ea576176e961729b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060808201905081810360008301526177398187616f0b565b9050818103602083015261774d8186616fc9565b9050818103604083015261776181856170be565b905061777060608301846161f1565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006177d5602683615bda565b91506177e082617779565b604082019050919050565b60006020820190508181036000830152617804816177c8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617867602783615bda565b91506178728261780b565b604082019050919050565b600060208201905081810360008301526178968161785a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006178f9602683615bda565b91506179048261789d565b604082019050919050565b60006020820190508181036000830152617928816178ec565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b600061798b602383615bda565b91506179968261792f565b604082019050919050565b600060208201905081810360008301526179ba8161797e565b9050919050565b60006080820190506179d66000830187615859565b6179e36020830186616c1b565b6179f06040830185615859565b8181036060830152617a028184615c15565b905095945050505050565b600060a082019050617a226000830188615859565b617a2f6020830187616c1b565b617a3c6040830186615859565b8181036060830152617a4e8185615c15565b90508181036080830152617a62818461665e565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617af0604383615bda565b9150617afb82617a6e565b606082019050919050565b60006020820190508181036000830152617b1f81617ae3565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617b5c602083615bda565b9150617b6782617b26565b602082019050919050565b60006020820190508181036000830152617b8b81617b4f565b9050919050565b617b9b81615819565b8114617ba657600080fd5b50565b600081519050617bb881617b92565b92915050565b600060208284031215617bd457617bd361578a565b5b6000617be284828501617ba9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617c21602083615bda565b9150617c2c82617beb565b602082019050919050565b60006020820190508181036000830152617c5081617c14565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617cb3603183615bda565b9150617cbe82617c57565b604082019050919050565b60006020820190508181036000830152617ce281617ca6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617d45602183615bda565b9150617d5082617ce9565b604082019050919050565b60006020820190508181036000830152617d7481617d38565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617db1601883615bda565b9150617dbc82617d7b565b602082019050919050565b60006020820190508181036000830152617de081617da4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000617e43602183615bda565b9150617e4e82617de7565b604082019050919050565b60006020820190508181036000830152617e7281617e36565b9050919050565b600067ffffffffffffffff82169050919050565b6000617e9882617e79565b9150617ea383617e79565b9250828201905067ffffffffffffffff811115617ec357617ec261729b565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000617f1182615bcf565b617f1b8185617ef5565b9350617f2b818560208601615beb565b617f3481615952565b840191505092915050565b6000617f4b8383617f06565b905092915050565b6000602082019050919050565b6000617f6b82617ec9565b617f758185617ed4565b935083602082028501617f8785617ee5565b8060005b85811015617fc35784840389528151617fa48582617f3f565b9450617faf83617f53565b925060208a01995050600181019050617f8b565b50829750879550505050505092915050565b6000617ff0617feb617fe684617e79565b616b58565b61584f565b9050919050565b61800081617fd5565b82525050565b60006101208201905061801c600083018c615859565b618029602083018b615ea5565b818103604083015261803b818a616f0b565b9050818103606083015261804f8189616fc9565b905081810360808301526180638188617f60565b905081810360a083015261807781876170be565b905061808660c0830186617ff7565b61809360e0830185617ff7565b8181036101008301526180a68184615c15565b90509a9950505050505050505050565b60006040820190506180cb6000830185615ea5565b6180d86020830184615859565b9392505050565b60006040820190506180f46000830185615ea5565b6181016020830184615ea5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618164602783615bda565b915061816f82618108565b604082019050919050565b6000602082019050818103600083015261819381618157565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006181d0600283616d84565b91506181db8261819a565b600282019050919050565b6000819050919050565b6182016181fc82615a8e565b6181e6565b82525050565b6000618212826181c3565b915061821e82856181f0565b60208201915061822e82846181f0565b6020820191508190509392505050565b600060808201905061825360008301876161f1565b6182606020830186616c1b565b61826d60408301856161f1565b61827a60608301846161f1565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006182b9601883615bda565b91506182c482618283565b602082019050919050565b600060208201905081810360008301526182e8816182ac565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618325601f83615bda565b9150618330826182ef565b602082019050919050565b6000602082019050818103600083015261835481618318565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006183b7602283615bda565b91506183c28261835b565b604082019050919050565b600060208201905081810360008301526183e6816183aa565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618449602283615bda565b9150618454826183ed565b604082019050919050565b600060208201905081810360008301526184788161843c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006184db602783615bda565b91506184e68261847f565b604082019050919050565b6000602082019050818103600083015261850a816184ce565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061856d603583615bda565b915061857882618511565b604082019050919050565b6000602082019050818103600083015261859c81618560565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006185d9601d83615bda565b91506185e4826185a3565b602082019050919050565b60006020820190508181036000830152618608816185cc565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061866b602683615bda565b91506186768261860f565b604082019050919050565b6000602082019050818103600083015261869a8161865e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006186fd602683615bda565b9150618708826186a1565b604082019050919050565b6000602082019050818103600083015261872c816186f0565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618769601d83615bda565b915061877482618733565b602082019050919050565b600060208201905081810360008301526187988161875c565b9050919050565b60006187aa82616642565b6187b48185616bd2565b93506187c4818560208601615beb565b80840191505092915050565b60006187dc828461879f565b915081905092915050565b600060a0820190506187fc60008301886161f1565b61880960208301876161f1565b61881660408301866161f1565b6188236060830185615859565b6188306080830184615ea5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220c2f510f48babb01f26563e04fd4d581d09065fd3103913bd8e2508c65acef2cf64736f6c63430008110033", + "solcInputHash": "3cf270c0d0efd91caec1ecd679be00ea", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enteranceFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_daoPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__EnteranceFeeNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotEnoughPayment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"FundProject__TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__UpkeepNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__WithdrawTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__withdrawFund\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NeedEnteranceFee\",\"type\":\"error\"},{\"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\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_projectOwner\",\"type\":\"address\"}],\"name\":\"enteranceFeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectFundingFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectGoesToFunding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectSuccessfullyFunded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_ProjectFundingStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getBalanceOfProject\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"_getProjectStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isApporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_fundingGoalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_projectOwnerAddress\",\"type\":\"address\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEnteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"is_funding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paySubmitFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectToTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"withdrawFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"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.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/AutomationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract AutomationBase {\\n error OnlySimulatedBackend();\\n\\n /**\\n * @notice method that allows it to be simulated via eth_call by checking that\\n * the sender is the zero address.\\n */\\n function preventExecution() internal view {\\n if (tx.origin != address(0)) {\\n revert OnlySimulatedBackend();\\n }\\n }\\n\\n /**\\n * @notice modifier that allows it to be simulated via eth_call by checking\\n * that the sender is the zero address.\\n */\\n modifier cannotExecute() {\\n preventExecution();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x5d354afa1a97dffe66094397cdcbb0c14713cf3d609d88fd8f9891010e9a351a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AutomationBase.sol\\\";\\nimport \\\"./interfaces/AutomationCompatibleInterface.sol\\\";\\n\\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\\n\",\"keccak256\":\"0x40e5ae0eff4edd0740c1b5590d09c344f84dee031e82d5294563e99603774f80\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\\\";\\n\\nerror FundProject__NotApporovedByDao();\\nerror FundProject__UpkeepNeeded();\\nerror FundProject__TransferFailed(uint256 _projectId);\\nerror FundProject__NotEnoughPayment();\\nerror FundProject__withdrawFund();\\nerror FundProject__WithdrawTransferFailed();\\nerror FundProject__EnteranceFeeNeeded();\\n\\ncontract FundProject is Ownable, AutomationCompatibleInterface {\\n enum ProjectFundingStatus {\\n ONPROGRESS,\\n SUCCESS,\\n FAILED,\\n CANCELED\\n }\\n\\n uint256 public projectId = 1;\\n\\n uint public lastTimeStamp;\\n uint256 public daoPercentage;\\n uint256 public enteranceFee;\\n\\n mapping(uint256 => bool) public _isFunding;\\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\\n mapping(uint256 => uint256) public time;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders;\\n mapping(uint256 => uint256) public projectFunds;\\n mapping(uint256 => uint256) public projectFundingGoalAmount;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n mapping(uint256 => address) public projectOwnerAddress;\\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\\n mapping(address => bool) public _isEnteranceFeePaid;\\n\\n event projectSuccessfullyFunded(uint256 indexed _projectId);\\n event projectFundingFailed(uint256 indexed _projectId);\\n event enteranceFeePaid(address indexed _projectOwner);\\n event projectGoesToFunding(uint256 indexed _projectId);\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\\n lastTimeStamp = block.timestamp;\\n daoPercentage = _daoPercentage;\\n enteranceFee = _enteranceFee;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n projectFunds[_projecID] += msg.value;\\n }\\n\\n function apporoveFundingByDao(\\n string memory _ipfsHash,\\n uint256 _fundingGoalAmount,\\n uint256 _time,\\n address _projectOwnerAddress\\n ) external onlyOwner {\\n // only dao can call it\\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\\n revert FundProject__EnteranceFeeNeeded();\\n } else {\\n projectToTime[projectId][_time] = block.timestamp;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\\n time[projectId] = _time;\\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n projectOwnerAddress[projectId] = _projectOwnerAddress;\\n _isApporovedByDao[projectId] = true;\\n _isFunding[projectId] = true;\\n emit projectGoesToFunding(projectId);\\n projectId++;\\n }\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call it\\n _isApporovedByDao[_projecID] = false;\\n _isFunding[projectId] = false;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\\n }\\n\\n function checkUpkeep(\\n bytes memory /* checkData */\\n )\\n public\\n view\\n override\\n returns (\\n bool upkeepNeeded,\\n bytes memory /* performData */\\n )\\n {\\n upkeepNeeded = (_isFunding[projectId] &&\\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\\n projectToTime[projectId][time[projectId]]);\\n }\\n\\n function performUpkeep(\\n bytes calldata /* performData */\\n ) external override {\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\n if (!upkeepNeeded) {\\n revert FundProject__UpkeepNeeded();\\n }\\n _isFunding[projectId] = false;\\n _isApporovedByDao[projectId] = false;\\n\\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\\n 100;\\n (bool success, ) = (projectOwnerAddress[projectId]).call{\\n value: fundsToSent\\n }(\\\"\\\");\\n if (!success) {\\n revert FundProject__TransferFailed(projectFunds[projectId]);\\n }\\n\\n emit projectSuccessfullyFunded(projectId);\\n } else {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\\n emit projectFundingFailed(projectId);\\n }\\n }\\n\\n function paySubmitFee() public payable {\\n if (msg.value < enteranceFee) {\\n revert FundProject__NotEnoughPayment();\\n } else {\\n _isEnteranceFeePaid[msg.sender] = true;\\n emit enteranceFeePaid(msg.sender);\\n }\\n }\\n\\n function withdrawFund(uint256 _projectID) public {\\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\\n uint256 fundToSent = funders[_projectID][msg.sender];\\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\\n \\\"\\\"\\n );\\n if (!success) {\\n revert FundProject__WithdrawTransferFailed();\\n }\\n } else {\\n revert FundProject__withdrawFund();\\n }\\n }\\n\\n function _isApporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n\\n function _getBalanceOfProject(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFunds[_projecID];\\n }\\n\\n function _getFundingGoalAmount(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFundingGoalAmount[_projecID];\\n }\\n\\n function is_funding(uint256 _projectID) public view returns (bool) {\\n return _isFunding[_projectID];\\n }\\n\\n function _getProjectStatus(uint256 _projectID)\\n public\\n view\\n returns (ProjectFundingStatus)\\n {\\n return _ProjectFundingStatus[_projectID];\\n }\\n\\n function getEnteranceFee() public view returns (uint256) {\\n return enteranceFee;\\n }\\n\\n function isEnteranceFeePaid(address account) public view returns (bool) {\\n return _isEnteranceFeePaid[account];\\n }\\n}\\n\",\"keccak256\":\"0x7d2d6bff2be12dc301152566f3eb52b2fcede1f35d28b494928f530da9dac90a\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\nimport \\\"./FundProject.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl,\\n FundProject\\n{\\n error GovernerContract__NeedEnteranceFee();\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage,\\n uint256 _enteranceFee,\\n uint256 _daoPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n FundProject(_enteranceFee, _daoPercentage)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n if (!_isEnteranceFeePaid[msg.sender]) {\\n revert GovernerContract__NeedEnteranceFee();\\n }\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x1713670032ac0e6e45120b9ea97b9727a23883448ec04fc1f6722a7c8520c8be\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101606040526001600d553480156200001757600080fd5b5060405162009f4f38038062009f4f83398181016040528101906200003d919062000bff565b818187858a898960006040518060400160405280601081526020017f476f7665726e6572436f6e747261637400000000000000000000000000000000815250806200008d6200022660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f68184846200026360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000150919062000f22565b505062000163836200029f60201b60201c565b6200017482620002e660201b60201c565b62000185816200037360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001cf81620003ba60201b60201c565b50620001e1816200059960201b60201c565b5062000202620001f66200063a60201b60201c565b6200064260201b60201c565b42600e8190555080600f81905550816010819055505050505050505050506200142d565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200028095949392919062001046565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051620002d4929190620010a3565b60405180910390a18060048190555050565b600081116200032c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003239062001157565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405162000361929190620010a3565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051620003a8929190620010a3565b60405180910390a18060068190555050565b620003ca6200070860201b60201c565b8111156200040f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004069062001215565b60405180910390fd5b6000620004216200071160201b60201c565b9050600081141580156200043d57506000600960000180549050145b156200053d5760096000016040518060400160405280600063ffffffff16815260200162000476846200074960201b620036951760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000558826009620007b760201b620037001790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200058d929190620010a3565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ee92919062001237565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064905090565b6000806009600001805490501462000740576200073a6009620009f560201b620039021760201c565b62000744565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a690620012da565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620007d986620009f560201b60201c565b90506000821180156200083557504386600001600184620007fb91906200132b565b815481106200080f576200080e62001366565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008d95762000851856200074960201b620036951760201c565b866000016001846200086491906200132b565b8154811062000878576200087762001366565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009e6565b856000016040518060400160405280620008fe4362000a9760201b6200399d1760201c565b63ffffffff1681526020016200091f886200074960201b620036951760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811462000a6e578260000160018262000a1e91906200132b565b8154811062000a325762000a3162001366565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000a71565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff801682111562000ae5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000adc906200140b565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b1f8262000af2565b9050919050565b600062000b338262000b12565b9050919050565b62000b458162000b26565b811462000b5157600080fd5b50565b60008151905062000b658162000b3a565b92915050565b600062000b788262000af2565b9050919050565b600062000b8c8262000b6b565b9050919050565b62000b9e8162000b7f565b811462000baa57600080fd5b50565b60008151905062000bbe8162000b93565b92915050565b6000819050919050565b62000bd98162000bc4565b811462000be557600080fd5b50565b60008151905062000bf98162000bce565b92915050565b600080600080600080600060e0888a03121562000c215762000c2062000aed565b5b600062000c318a828b0162000b54565b975050602062000c448a828b0162000bad565b965050604062000c578a828b0162000be8565b955050606062000c6a8a828b0162000be8565b945050608062000c7d8a828b0162000be8565b93505060a062000c908a828b0162000be8565b92505060c062000ca38a828b0162000be8565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d3457607f821691505b60208210810362000d4a5762000d4962000cec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000db47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d75565b62000dc0868362000d75565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000e0362000dfd62000df78462000bc4565b62000dd8565b62000bc4565b9050919050565b6000819050919050565b62000e1f8362000de2565b62000e3762000e2e8262000e0a565b84845462000d82565b825550505050565b600090565b62000e4e62000e3f565b62000e5b81848462000e14565b505050565b5b8181101562000e835762000e7760008262000e44565b60018101905062000e61565b5050565b601f82111562000ed25762000e9c8162000d50565b62000ea78462000d65565b8101602085101562000eb7578190505b62000ecf62000ec68562000d65565b83018262000e60565b50505b505050565b600082821c905092915050565b600062000ef76000198460080262000ed7565b1980831691505092915050565b600062000f12838362000ee4565b9150826002028217905092915050565b62000f2d8262000cb2565b67ffffffffffffffff81111562000f495762000f4862000cbd565b5b62000f55825462000d1b565b62000f6282828562000e87565b600060209050601f83116001811462000f9a576000841562000f85578287015190505b62000f91858262000f04565b86555062001001565b601f19841662000faa8662000d50565b60005b8281101562000fd45784890151825560018201915060208501945060208101905062000fad565b8683101562000ff4578489015162000ff0601f89168262000ee4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6200101e8162001009565b82525050565b6200102f8162000bc4565b82525050565b620010408162000b12565b82525050565b600060a0820190506200105d600083018862001013565b6200106c602083018762001013565b6200107b604083018662001013565b6200108a606083018562001024565b62001099608083018462001035565b9695505050505050565b6000604082019050620010ba600083018562001024565b620010c9602083018462001024565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200113f602783620010d0565b91506200114c82620010e1565b604082019050919050565b60006020820190508181036000830152620011728162001130565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620011fd604383620010d0565b91506200120a8262001179565b606082019050919050565b600060208201905081810360008301526200123081620011ee565b9050919050565b60006040820190506200124e600083018562001035565b6200125d602083018462001035565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620012c2602783620010d0565b9150620012cf8262001264565b604082019050919050565b60006020820190508181036000830152620012f581620012b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013388262000bc4565b9150620013458362000bc4565b925082820390508181111562001360576200135f620012fc565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620013f3602683620010d0565b9150620014008262001395565b604082019050919050565b600060208201905081810360008301526200142681620013e4565b9050919050565b60805160a05160c05160e051610100516101205161014051618ab9620014966000396000818161359a0152818161488d0152614b0101526000614dc701526000614e0901526000614de801526000614d1d01526000614d7301526000614d9c0152618ab96000f3fe60806040526004361061044b5760003560e01c80637b3c71d311610234578063c01f9e371161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e6114611336578063f2fde38b14611373578063f8ce560a1461139c578063fc0c546a146113d9578063fea856a11461140457610491565b8063deaaa7cc1461123f578063e0c410cc1461126a578063ea0217cf146112a7578063eb9019d4146112d0578063ece40cc11461130d57610491565b8063ca1d209d116100fd578063ca1d209d14611153578063cf6862591461116f578063d33219b4146111ac578063dc73204b146111d7578063dd4e2ba51461121457610491565b8063c01f9e3714611073578063c0d55329146110b0578063c28bc2fa146110ed578063c59057e41461111657610491565b806397c3d334116101bc578063abe1aae611610180578063abe1aae614610f54578063b58131b014610f91578063b59d18a014610fbc578063bba9c21914610ff9578063bc197c811461103657610491565b806397c3d33414610e5b5780639a802a6d14610e86578063a7713a7014610ec3578063a890c91014610eee578063ab58fb8e14610f1757610491565b806387030f4d1161020357806387030f4d14610d625780638da5cb5b14610d8b5780638fb5548f14610db6578063902bfa2414610df357806396aa167e14610e3057610491565b80637b3c71d314610c805780637d5e81e214610cbd578063809b268e14610cfa578063868661cb14610d3757610491565b80633fafa127116103455780635b6b4652116102cd5780636ee8e8ef116102915780636ee8e8ef14610b8957806370084d7a14610bc657806370b0f66014610c03578063715018a614610c2c578063794d556014610c4357610491565b80635b6b465214610a575780635ced7d4014610a945780635f398a1414610ad157806360c4247f14610b0e5780636e04ff0d14610b4b57610491565b80634fac2bb7116103145780634fac2bb714610948578063535bf50f14610985578063544ffc9c146109b057806354fd4d50146109ef5780635678138814610a1a57610491565b80633fafa1271461087a57806343859632146108a5578063446a156f146108e25780634585e33b1461091f57610491565b8063156277be116103d35780633932abb1116103975780633932abb1146107815780633bccf4fd146107ac5780633be2f2a3146107e95780633e4f49e6146108125780633f3b3b271461084f57610491565b8063156277be1461066f578063160cbed7146106ac5780632656227d146106e95780632d63f693146107195780632fe3e2611461075657610491565b806306fdde031161041a57806306fdde03146105645780630cee17251461058f578063141a6c22146105b8578063148038b0146105f5578063150b7a021461063257610491565b806301ffc9a71461049657806302a251a3146104d357806303420181146104fe57806306f3f9e61461053b57610491565b36610491573073ffffffffffffffffffffffffffffffffffffffff1661046f61140e565b73ffffffffffffffffffffffffffffffffffffffff161461048f57600080fd5b005b600080fd5b3480156104a257600080fd5b506104bd60048036038101906104b89190615a0c565b61141d565b6040516104ca9190615a54565b60405180910390f35b3480156104df57600080fd5b506104e861142f565b6040516104f59190615a88565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190615ce4565b61143e565b6040516105329190615a88565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190615dc2565b611523565b005b34801561057057600080fd5b5061057961161a565b6040516105869190615e6e565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190615dc2565b6116ac565b005b3480156105c457600080fd5b506105df60048036038101906105da9190615f31565b61182c565b6040516105ec9190615a88565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190615fd8565b611854565b6040516106299190615a88565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190616018565b611879565b60405161066691906160aa565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190615dc2565b61188d565b6040516106a391906160d4565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190616356565b6118c0565b6040516106e09190615a88565b60405180910390f35b61070360048036038101906106fe9190616356565b611b7a565b6040516107109190615a88565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190615dc2565b611cc7565b60405161074d9190615a88565b60405180910390f35b34801561076257600080fd5b5061076b611d35565b6040516107789190616420565b60405180910390f35b34801561078d57600080fd5b50610796611d59565b6040516107a39190615a88565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061643b565b611d68565b6040516107e09190615a88565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906164b6565b611df2565b005b34801561081e57600080fd5b5061083960048036038101906108349190615dc2565b61205f565b60405161084691906165b0565b60405180910390f35b34801561085b57600080fd5b50610864612071565b6040516108719190615a88565b60405180910390f35b34801561088657600080fd5b5061088f612077565b60405161089c9190615a88565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190615fd8565b61207d565b6040516108d99190615a54565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190615dc2565b6120e8565b6040516109169190616613565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190616684565b612112565b005b34801561095457600080fd5b5061096f600480360381019061096a9190615dc2565b612406565b60405161097c9190615a54565b60405180910390f35b34801561099157600080fd5b5061099a612426565b6040516109a79190615a88565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d29190615dc2565b612430565b6040516109e6939291906166d1565b60405180910390f35b3480156109fb57600080fd5b50610a04612468565b604051610a119190615e6e565b60405180910390f35b348015610a2657600080fd5b50610a416004803603810190610a3c9190616708565b6124a5565b604051610a4e9190615a88565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190615dc2565b6124d6565b604051610a8b9190615a88565b60405180910390f35b348015610aa057600080fd5b50610abb6004803603810190610ab69190615dc2565b6124ee565b604051610ac89190615a88565b60405180910390f35b348015610add57600080fd5b50610af86004803603810190610af39190616748565b612506565b604051610b059190615a88565b60405180910390f35b348015610b1a57600080fd5b50610b356004803603810190610b309190615dc2565b612570565b604051610b429190615a88565b60405180910390f35b348015610b5757600080fd5b50610b726004803603810190610b6d91906167ec565b6126bc565b604051610b8092919061688a565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab91906168ba565b612776565b604051610bbd9190615a54565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be89190615dc2565b612796565b604051610bfa9190616613565b60405180910390f35b348015610c0f57600080fd5b50610c2a6004803603810190610c259190615dc2565b6127b6565b005b348015610c3857600080fd5b50610c416128ad565b005b348015610c4f57600080fd5b50610c6a6004803603810190610c659190615dc2565b6128c1565b604051610c779190615a88565b60405180910390f35b348015610c8c57600080fd5b50610ca76004803603810190610ca291906168e7565b6128d9565b604051610cb49190615a88565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf919061695b565b612941565b604051610cf19190615a88565b60405180910390f35b348015610d0657600080fd5b50610d216004803603810190610d1c9190615dc2565b6129dc565b604051610d2e9190615a54565b60405180910390f35b348015610d4357600080fd5b50610d4c612a06565b604051610d599190615a88565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d849190615dc2565b612a0c565b005b348015610d9757600080fd5b50610da0612aaf565b604051610dad91906160d4565b60405180910390f35b348015610dc257600080fd5b50610ddd6004803603810190610dd89190615dc2565b612ad9565b604051610dea9190615e6e565b60405180910390f35b348015610dff57600080fd5b50610e1a6004803603810190610e159190615dc2565b612b79565b604051610e279190615a54565b60405180910390f35b348015610e3c57600080fd5b50610e45612b99565b604051610e529190615a88565b60405180910390f35b348015610e6757600080fd5b50610e70612b9f565b604051610e7d9190615a88565b60405180910390f35b348015610e9257600080fd5b50610ead6004803603810190610ea89190616a32565b612ba8565b604051610eba9190615a88565b60405180910390f35b348015610ecf57600080fd5b50610ed8612bbe565b604051610ee59190615a88565b60405180910390f35b348015610efa57600080fd5b50610f156004803603810190610f109190616af1565b612be7565b005b348015610f2357600080fd5b50610f3e6004803603810190610f399190615dc2565b612cde565b604051610f4b9190615a88565b60405180910390f35b348015610f6057600080fd5b50610f7b6004803603810190610f769190615dc2565b612dab565b604051610f889190615e6e565b60405180910390f35b348015610f9d57600080fd5b50610fa6612e50565b604051610fb39190615a88565b60405180910390f35b348015610fc857600080fd5b50610fe36004803603810190610fde9190615dc2565b612e5f565b604051610ff09190615a88565b60405180910390f35b34801561100557600080fd5b50611020600480360381019061101b9190615dc2565b612e7c565b60405161102d9190615a88565b60405180910390f35b34801561104257600080fd5b5061105d60048036038101906110589190616b1e565b612e99565b60405161106a91906160aa565b60405180910390f35b34801561107f57600080fd5b5061109a60048036038101906110959190615dc2565b612eae565b6040516110a79190615a88565b60405180910390f35b3480156110bc57600080fd5b506110d760048036038101906110d291906168ba565b612f1c565b6040516110e49190615a54565b60405180910390f35b3480156110f957600080fd5b50611114600480360381019061110f9190616bed565b612f72565b005b34801561112257600080fd5b5061113d60048036038101906111389190616356565b6130b3565b60405161114a9190615a88565b60405180910390f35b61116d60048036038101906111689190615dc2565b6130ef565b005b34801561117b57600080fd5b5061119660048036038101906111919190615f31565b6131dc565b6040516111a39190615a88565b60405180910390f35b3480156111b857600080fd5b506111c161320a565b6040516111ce91906160d4565b60405180910390f35b3480156111e357600080fd5b506111fe60048036038101906111f99190616c61565b613234565b60405161120b9190615a88565b60405180910390f35b34801561122057600080fd5b50611229613259565b6040516112369190615e6e565b60405180910390f35b34801561124b57600080fd5b50611254613296565b6040516112619190616420565b60405180910390f35b34801561127657600080fd5b50611291600480360381019061128c9190615dc2565b6132ba565b60405161129e9190615a54565b60405180910390f35b3480156112b357600080fd5b506112ce60048036038101906112c99190615dc2565b6132e4565b005b3480156112dc57600080fd5b506112f760048036038101906112f29190616ca1565b6133db565b6040516113049190615a88565b60405180910390f35b34801561131957600080fd5b50611334600480360381019061132f9190615dc2565b6133f7565b005b34801561134257600080fd5b5061135d60048036038101906113589190616ce1565b6134ee565b60405161136a91906160aa565b60405180910390f35b34801561137f57600080fd5b5061139a600480360381019061139591906168ba565b613503565b005b3480156113a857600080fd5b506113c360048036038101906113be9190615dc2565b613586565b6040516113d09190615a88565b60405180910390f35b3480156113e557600080fd5b506113ee613598565b6040516113fb9190616dd7565b60405180910390f35b61140c6135bc565b005b60006114186139f0565b905090565b600061142882613a1a565b9050919050565b6000611439613a94565b905090565b6000806114c16114b97fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c60405161147a929190616e22565b60405180910390208b8051906020012060405160200161149e959493929190616e4a565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b90506115148a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613ae3565b91505098975050505050505050565b61152b61140e565b73ffffffffffffffffffffffffffffffffffffffff16611549613c9f565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115be61140e565b73ffffffffffffffffffffffffffffffffffffffff161461160e5760006115e3613ca7565b6040516115f1929190616e22565b604051809103902090505b806116076002613cb4565b036115fc57505b61161781613d90565b50565b60606000805461162990616f38565b80601f016020809104026020016040519081016040528092919081815260200182805461165590616f38565b80156116a25780601f10611677576101008083540402835291602001916116a2565b820191906000526020600020905b81548152906001019060200180831161168557829003601f168201915b5050505050905090565b600260038111156116c0576116bf616539565b5b601b600083815260200190815260200160002060009054906101000a900460ff1660038111156116f3576116f2616539565b5b036117f75760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161177390616f8f565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50509050806117f0576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611829565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600060148260405161183e9190616fe0565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806118cf868686866130b3565b9050600460078111156118e5576118e4616539565b5b6118ee8261205f565b6007811115611900576118ff616539565b5b14611940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193790617069565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d3919061709e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611a3995949392919061739b565b602060405180830381865afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a9190617418565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611af796959493929190617445565b600060405180830381600087803b158015611b1157600080fd5b505af1158015611b25573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b5791906174ea565b604051611b6592919061751e565b60405180910390a18192505050949350505050565b600080611b89868686866130b3565b90506000611b968261205f565b905060046007811115611bac57611bab616539565b5b816007811115611bbf57611bbe616539565b5b1480611bef575060056007811115611bda57611bd9616539565b5b816007811115611bed57611bec616539565b5b145b611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590617069565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c8b9190615a88565b60405180910390a1611ca08288888888613f44565b611cad8288888888614027565b611cba828888888861403b565b8192505050949350505050565b6000611d24600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d636140a4565b905090565b600080611dc9611dc17f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611da693929190617547565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b9050611de6878288604051806020016040528060008152506140ae565b91505095945050505050565b611dfa6140ce565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e7d576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611ee157611ee0616539565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d54601485604051611f2d9190616fe0565b9081526020016040518091039020819055508360156000600d5481526020019081526020016000209081611f619190617720565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d6000815480929190612054906177f2565b919050555050505050565b600061206a8261414c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061212c604051806020016040528060008152506126bc565b50905080612166576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600060196000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060186000600d5481526020019081526020016000205460176000600d548152602001908152602001600020541115612393576001601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561222d5761222c616539565b5b021790555060006064600f5460176000600d54815260200190815260200160002054612259919061783a565b61226391906178ab565b90506000601a6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516122c090616f8f565b60006040518083038185875af1925050503d80600081146122fd576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b606091505b505090508061235d5760176000600d548152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016123549190615a88565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612401565b6002601b6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156123cc576123cb616539565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806124b0613c9f565b90506124cd848285604051806020016040528060008152506140ae565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b600080612511613c9f565b905061256487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613ae3565b91505095945050505050565b600080600960000180549050905060008103612591576008549150506126b7565b600060096000016001836125a591906178dc565b815481106125b6576125b5617910565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161269e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506126b7565b6126b284600961431f90919063ffffffff16565b925050505b919050565b6000606060116000600d54815260200190815260200160002060009054906101000a900460ff16801561276f575060126000600d548152602001908152602001600020600060136000600d5481526020019081526020016000205481526020019081526020016000205460126000600d548152602001908152602001600020600060136000600d548152602001908152602001600020548152602001908152602001600020544261276d91906178dc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b6127be61140e565b73ffffffffffffffffffffffffffffffffffffffff166127dc613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661285161140e565b73ffffffffffffffffffffffffffffffffffffffff16146128a1576000612876613ca7565b604051612884929190616e22565b604051809103902090505b8061289a6002613cb4565b0361288f57505b6128aa81614477565b50565b6128b56140ce565b6128bf60006144bc565b565b60176020528060005260406000206000915090505481565b6000806128e4613c9f565b905061293686828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506140ae565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129c6576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129d285858585614582565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612a146140ce565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612aa757612aa6616539565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612af890616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2490616f38565b8015612b715780601f10612b4657610100808354040283529160200191612b71565b820191906000526020600020905b815481529060010190602001808311612b5457829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612bb5848484614889565b90509392505050565b60008060096000018054905014612bde57612bd96009613902565b612be2565b6008545b905090565b612bef61140e565b73ffffffffffffffffffffffffffffffffffffffff16612c0d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612c8261140e565b73ffffffffffffffffffffffffffffffffffffffff1614612cd2576000612ca7613ca7565b604051612cb5929190616e22565b604051809103902090505b80612ccb6002613cb4565b03612cc057505b612cdb81614930565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612d4f9190616420565b602060405180830381865afa158015612d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d90919061709e565b905060018114612da05780612da3565b60005b915050919050565b6060601560008381526020019081526020016000208054612dcb90616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612df790616f38565b8015612e445780601f10612e1957610100808354040283529160200191612e44565b820191906000526020600020905b815481529060010190602001808311612e2757829003601f168201915b50505050509050919050565b6000612e5a6149cf565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612f0b600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612f7a61140e565b73ffffffffffffffffffffffffffffffffffffffff16612f98613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661300d61140e565b73ffffffffffffffffffffffffffffffffffffffff161461305d576000613032613ca7565b604051613040929190616e22565b604051809103902090505b806130566002613cb4565b0361304b57505b6130ac8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856149d9565b5050505050565b6000848484846040516020016130cc949392919061793f565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff16613147576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a791906174ea565b92505081905550346017600084815260200190815260200160002060008282546131d191906174ea565b925050819055505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6132ec61140e565b73ffffffffffffffffffffffffffffffffffffffff1661330a613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335790616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661337f61140e565b73ffffffffffffffffffffffffffffffffffffffff16146133cf5760006133a4613ca7565b6040516133b2929190616e22565b604051809103902090505b806133c86002613cb4565b036133bd57505b6133d881614a08565b50565b60006133ef83836133ea614a90565b614889565b905092915050565b6133ff61140e565b73ffffffffffffffffffffffffffffffffffffffff1661341d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661349261140e565b73ffffffffffffffffffffffffffffffffffffffff16146134e25760006134b7613ca7565b6040516134c5929190616e22565b604051809103902090505b806134db6002613cb4565b036134d057505b6134eb81614aa7565b50565b600063f23a6e6160e01b905095945050505050565b61350b6140ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361357a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357190617a0b565b60405180910390fd5b613583816144bc565b50565b600061359182614aec565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543410156135f8576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156136f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ef90617a9d565b60405180910390fd5b819050919050565b600080600084600001805490509050600061371a86613902565b90506000821180156137705750438660000160018461373991906178dc565b8154811061374a57613749617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156138005761377e85613695565b8660000160018461378f91906178dc565b815481106137a05761379f617910565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506138f3565b8560000160405180604001604052806138184361399d565b63ffffffff16815260200161382c88613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613974578260000160018261392891906178dc565b8154811061393957613938617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613977565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156139e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139df90617b2f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a8d5750613a8c82614bb4565b5b9050919050565b6000600554905090565b6000613ab1613aab614d19565b83614e33565b9050919050565b6000806000613ac987878787614e66565b91509150613ad681614f72565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613b0f57613b0e616539565b5b613b188861205f565b6007811115613b2a57613b29616539565b5b14613b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6190617bc1565b60405180910390fd5b6000613bc987613bb9846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff1686614889565b9050613bd8888888848861513e565b6000845103613c3a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613c2d9493929190617be1565b60405180910390a2613c91565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613c88959493929190617c2d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613cbf82615342565b15613cf6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613d98612b9f565b811115613dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd190617d26565b60405180910390fd5b6000613de4612bbe565b905060008114158015613dff57506000600960000180549050145b15613ef15760096000016040518060400160405280600063ffffffff168152602001613e2a84613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613f0582600961370090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613f3892919061751e565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613f6361140e565b73ffffffffffffffffffffffffffffffffffffffff16146140205760005b845181101561401e573073ffffffffffffffffffffffffffffffffffffffff16858281518110613fb457613fb3617910565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361400d5761400c838281518110613fed57613fec617910565b5b602002602001015180519060200120600261537790919063ffffffff16565b5b80614017906177f2565b9050613f81565b505b5050505050565b61403485858585856153f3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661405a61140e565b73ffffffffffffffffffffffffffffffffffffffff161461408f5761407f6002615342565b61408e5761408d6002615491565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006140c4858585856140bf614a90565b613ae3565b9050949350505050565b6140d6613c9f565b73ffffffffffffffffffffffffffffffffffffffff166140f4612aaf565b73ffffffffffffffffffffffffffffffffffffffff161461414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161414190617d92565b60405180910390fd5b565b60008061415883615512565b90506004600781111561416e5761416d616539565b5b81600781111561418157614180616539565b5b1461418f578091505061431a565b6000600b60008581526020019081526020016000205490506000801b81036141bb57819250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016142169190616420565b602060405180830381865afa158015614233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142579190617dde565b156142675760079250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016142c29190616420565b602060405180830381865afa1580156142df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143039190617dde565b156143135760059250505061431a565b6002925050505b919050565b6000438210614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90617e57565b60405180910390fd5b60008360000180549050905060005b818110156143e75760006143868284615626565b90508486600001828154811061439f5761439e617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156143d1578092506143e1565b6001816143de91906174ea565b91505b50614372565b6000821461444c578460000160018361440091906178dc565b8154811061441157614410617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661444f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516144aa92919061751e565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061458c612e50565b6145a9614597613c9f565b6001436145a491906178dc565b6133db565b10156145ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145e190617ee9565b60405180910390fd5b60006145ff86868686805190602001206130b3565b90508451865114614645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161463c90617f7b565b60405180910390fd5b8351865114614689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468090617f7b565b60405180910390fd5b60008651116146cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146c490617fe7565b60405180910390fd5b600060016000838152602001908152602001600020905061472d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061564c565b61476c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161476390618079565b60405180910390fd5b600061477e614779611d59565b615666565b61478743615666565b61479191906180ad565b905060006147a56147a061142f565b615666565b826147b091906180ad565b90506147c882846000016156bd90919063ffffffff16565b6147de81846001016156bd90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614808613c9f565b8b8b8d5167ffffffffffffffff81111561482557614824615b83565b5b60405190808252806020026020018201604052801561485857816020015b60608152602001906001900390816148435790505b508c88888e60405161487299989796959493929190618226565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016148e69291906182d6565b602060405180830381865afa158015614903573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614927919061709e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516149839291906182ff565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606149ff848484604051806060016040528060298152602001618a5b602991396156ec565b90509392505050565b60008111614a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a429061839a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614a7e92919061751e565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614ada92919061751e565b60405180910390a18060068190555050565b6000614af6612b9f565b614aff83612570565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614b589190615a88565b602060405180830381865afa158015614b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b99919061709e565b614ba3919061783a565b614bad91906178ab565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614c9a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d0257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d125750614d1182615800565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614d9557507f000000000000000000000000000000000000000000000000000000000000000046145b15614dc2577f00000000000000000000000000000000000000000000000000000000000000009050614e30565b614e2d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061586a565b90505b90565b60008282604051602001614e48929190618427565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614ea1576000600391509150614f69565b601b8560ff1614158015614eb95750601c8560ff1614155b15614ecb576000600491509150614f69565b600060018787878760405160008152602001604052604051614ef0949392919061845e565b6020604051602081039080840390855afa158015614f12573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614f6057600060019250925050614f69565b80600092509250505b94509492505050565b60006004811115614f8657614f85616539565b5b816004811115614f9957614f98616539565b5b031561513b5760016004811115614fb357614fb2616539565b5b816004811115614fc657614fc5616539565b5b03615006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ffd906184ef565b60405180910390fd5b6002600481111561501a57615019616539565b5b81600481111561502d5761502c616539565b5b0361506d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150649061855b565b60405180910390fd5b6003600481111561508157615080616539565b5b81600481111561509457615093616539565b5b036150d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150cb906185ed565b60405180910390fd5b6004808111156150e7576150e6616539565b5b8160048111156150fa576150f9616539565b5b0361513a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151319061867f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156151e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151db90618711565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561525257615251616539565b5b60ff168460ff160361527e578281600001600082825461527291906174ea565b9250508190555061533a565b6001600281111561529257615291616539565b5b60ff168460ff16036152be57828160010160008282546152b291906174ea565b92505081905550615339565b6002808111156152d1576152d0616539565b5b60ff168460ff16036152fd57828160020160008282546152f191906174ea565b92505081905550615338565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161532f906187a3565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161545895949392919061739b565b6000604051808303818588803b15801561547157600080fd5b505af1158015615485573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561554b576007915050615621565b8060020160019054906101000a900460ff161561556c576002915050615621565b600061557784611cc7565b9050600081036155bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155b39061880f565b60405180910390fd5b4381106155ce57600092505050615621565b60006155d985612eae565b90504381106155ee5760019350505050615621565b6155f7856158a4565b80156156085750615607856158eb565b5b156156195760049350505050615621565b600393505050505b919050565b6000600282841861563791906178ab565b82841661564491906174ea565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff80168211156156b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016156ac906188a1565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161572890618933565b60405180910390fd5b61573a85615916565b615779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709061899f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516157a291906189f0565b60006040518083038185875af1925050503d80600081146157df576040519150601f19603f3d011682016040523d82523d6000602084013e6157e4565b606091505b50915091506157f4828286615939565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615885959493929190618a07565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546158d091906174ea565b6158e16158dc85611cc7565b613586565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561594957829050615999565b60008351111561595c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159909190615e6e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6159e9816159b4565b81146159f457600080fd5b50565b600081359050615a06816159e0565b92915050565b600060208284031215615a2257615a216159aa565b5b6000615a30848285016159f7565b91505092915050565b60008115159050919050565b615a4e81615a39565b82525050565b6000602082019050615a696000830184615a45565b92915050565b6000819050919050565b615a8281615a6f565b82525050565b6000602082019050615a9d6000830184615a79565b92915050565b615aac81615a6f565b8114615ab757600080fd5b50565b600081359050615ac981615aa3565b92915050565b600060ff82169050919050565b615ae581615acf565b8114615af057600080fd5b50565b600081359050615b0281615adc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615b2d57615b2c615b08565b5b8235905067ffffffffffffffff811115615b4a57615b49615b0d565b5b602083019150836001820283011115615b6657615b65615b12565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615bbb82615b72565b810181811067ffffffffffffffff82111715615bda57615bd9615b83565b5b80604052505050565b6000615bed6159a0565b9050615bf98282615bb2565b919050565b600067ffffffffffffffff821115615c1957615c18615b83565b5b615c2282615b72565b9050602081019050919050565b82818337600083830152505050565b6000615c51615c4c84615bfe565b615be3565b905082815260208101848484011115615c6d57615c6c615b6d565b5b615c78848285615c2f565b509392505050565b600082601f830112615c9557615c94615b08565b5b8135615ca5848260208601615c3e565b91505092915050565b6000819050919050565b615cc181615cae565b8114615ccc57600080fd5b50565b600081359050615cde81615cb8565b92915050565b60008060008060008060008060e0898b031215615d0457615d036159aa565b5b6000615d128b828c01615aba565b9850506020615d238b828c01615af3565b975050604089013567ffffffffffffffff811115615d4457615d436159af565b5b615d508b828c01615b17565b9650965050606089013567ffffffffffffffff811115615d7357615d726159af565b5b615d7f8b828c01615c80565b9450506080615d908b828c01615af3565b93505060a0615da18b828c01615ccf565b92505060c0615db28b828c01615ccf565b9150509295985092959890939650565b600060208284031215615dd857615dd76159aa565b5b6000615de684828501615aba565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615e29578082015181840152602081019050615e0e565b60008484015250505050565b6000615e4082615def565b615e4a8185615dfa565b9350615e5a818560208601615e0b565b615e6381615b72565b840191505092915050565b60006020820190508181036000830152615e888184615e35565b905092915050565b600067ffffffffffffffff821115615eab57615eaa615b83565b5b615eb482615b72565b9050602081019050919050565b6000615ed4615ecf84615e90565b615be3565b905082815260208101848484011115615ef057615eef615b6d565b5b615efb848285615c2f565b509392505050565b600082601f830112615f1857615f17615b08565b5b8135615f28848260208601615ec1565b91505092915050565b600060208284031215615f4757615f466159aa565b5b600082013567ffffffffffffffff811115615f6557615f646159af565b5b615f7184828501615f03565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615fa582615f7a565b9050919050565b615fb581615f9a565b8114615fc057600080fd5b50565b600081359050615fd281615fac565b92915050565b60008060408385031215615fef57615fee6159aa565b5b6000615ffd85828601615aba565b925050602061600e85828601615fc3565b9150509250929050565b60008060008060808587031215616032576160316159aa565b5b600061604087828801615fc3565b945050602061605187828801615fc3565b935050604061606287828801615aba565b925050606085013567ffffffffffffffff811115616083576160826159af565b5b61608f87828801615c80565b91505092959194509250565b6160a4816159b4565b82525050565b60006020820190506160bf600083018461609b565b92915050565b6160ce81615f9a565b82525050565b60006020820190506160e960008301846160c5565b92915050565b600067ffffffffffffffff82111561610a57616109615b83565b5b602082029050602081019050919050565b600061612e616129846160ef565b615be3565b9050808382526020820190506020840283018581111561615157616150615b12565b5b835b8181101561617a57806161668882615fc3565b845260208401935050602081019050616153565b5050509392505050565b600082601f83011261619957616198615b08565b5b81356161a984826020860161611b565b91505092915050565b600067ffffffffffffffff8211156161cd576161cc615b83565b5b602082029050602081019050919050565b60006161f16161ec846161b2565b615be3565b9050808382526020820190506020840283018581111561621457616213615b12565b5b835b8181101561623d57806162298882615aba565b845260208401935050602081019050616216565b5050509392505050565b600082601f83011261625c5761625b615b08565b5b813561626c8482602086016161de565b91505092915050565b600067ffffffffffffffff8211156162905761628f615b83565b5b602082029050602081019050919050565b60006162b46162af84616275565b615be3565b905080838252602082019050602084028301858111156162d7576162d6615b12565b5b835b8181101561631e57803567ffffffffffffffff8111156162fc576162fb615b08565b5b8086016163098982615c80565b855260208501945050506020810190506162d9565b5050509392505050565b600082601f83011261633d5761633c615b08565b5b813561634d8482602086016162a1565b91505092915050565b600080600080608085870312156163705761636f6159aa565b5b600085013567ffffffffffffffff81111561638e5761638d6159af565b5b61639a87828801616184565b945050602085013567ffffffffffffffff8111156163bb576163ba6159af565b5b6163c787828801616247565b935050604085013567ffffffffffffffff8111156163e8576163e76159af565b5b6163f487828801616328565b925050606061640587828801615ccf565b91505092959194509250565b61641a81615cae565b82525050565b60006020820190506164356000830184616411565b92915050565b600080600080600060a08688031215616457576164566159aa565b5b600061646588828901615aba565b955050602061647688828901615af3565b945050604061648788828901615af3565b935050606061649888828901615ccf565b92505060806164a988828901615ccf565b9150509295509295909350565b600080600080608085870312156164d0576164cf6159aa565b5b600085013567ffffffffffffffff8111156164ee576164ed6159af565b5b6164fa87828801615f03565b945050602061650b87828801615aba565b935050604061651c87828801615aba565b925050606061652d87828801615fc3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061657957616578616539565b5b50565b600081905061658a82616568565b919050565b600061659a8261657c565b9050919050565b6165aa8161658f565b82525050565b60006020820190506165c560008301846165a1565b92915050565b600481106165dc576165db616539565b5b50565b60008190506165ed826165cb565b919050565b60006165fd826165df565b9050919050565b61660d816165f2565b82525050565b60006020820190506166286000830184616604565b92915050565b60008083601f84011261664457616643615b08565b5b8235905067ffffffffffffffff81111561666157616660615b0d565b5b60208301915083600182028301111561667d5761667c615b12565b5b9250929050565b6000806020838503121561669b5761669a6159aa565b5b600083013567ffffffffffffffff8111156166b9576166b86159af565b5b6166c58582860161662e565b92509250509250929050565b60006060820190506166e66000830186615a79565b6166f36020830185615a79565b6167006040830184615a79565b949350505050565b6000806040838503121561671f5761671e6159aa565b5b600061672d85828601615aba565b925050602061673e85828601615af3565b9150509250929050565b600080600080600060808688031215616764576167636159aa565b5b600061677288828901615aba565b955050602061678388828901615af3565b945050604086013567ffffffffffffffff8111156167a4576167a36159af565b5b6167b088828901615b17565b9350935050606086013567ffffffffffffffff8111156167d3576167d26159af565b5b6167df88828901615c80565b9150509295509295909350565b600060208284031215616802576168016159aa565b5b600082013567ffffffffffffffff8111156168205761681f6159af565b5b61682c84828501615c80565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061685c82616835565b6168668185616840565b9350616876818560208601615e0b565b61687f81615b72565b840191505092915050565b600060408201905061689f6000830185615a45565b81810360208301526168b18184616851565b90509392505050565b6000602082840312156168d0576168cf6159aa565b5b60006168de84828501615fc3565b91505092915050565b60008060008060608587031215616901576169006159aa565b5b600061690f87828801615aba565b945050602061692087828801615af3565b935050604085013567ffffffffffffffff811115616941576169406159af565b5b61694d87828801615b17565b925092505092959194509250565b60008060008060808587031215616975576169746159aa565b5b600085013567ffffffffffffffff811115616993576169926159af565b5b61699f87828801616184565b945050602085013567ffffffffffffffff8111156169c0576169bf6159af565b5b6169cc87828801616247565b935050604085013567ffffffffffffffff8111156169ed576169ec6159af565b5b6169f987828801616328565b925050606085013567ffffffffffffffff811115616a1a57616a196159af565b5b616a2687828801615f03565b91505092959194509250565b600080600060608486031215616a4b57616a4a6159aa565b5b6000616a5986828701615fc3565b9350506020616a6a86828701615aba565b925050604084013567ffffffffffffffff811115616a8b57616a8a6159af565b5b616a9786828701615c80565b9150509250925092565b6000616aac82615f7a565b9050919050565b6000616abe82616aa1565b9050919050565b616ace81616ab3565b8114616ad957600080fd5b50565b600081359050616aeb81616ac5565b92915050565b600060208284031215616b0757616b066159aa565b5b6000616b1584828501616adc565b91505092915050565b600080600080600060a08688031215616b3a57616b396159aa565b5b6000616b4888828901615fc3565b9550506020616b5988828901615fc3565b945050604086013567ffffffffffffffff811115616b7a57616b796159af565b5b616b8688828901616247565b935050606086013567ffffffffffffffff811115616ba757616ba66159af565b5b616bb388828901616247565b925050608086013567ffffffffffffffff811115616bd457616bd36159af565b5b616be088828901615c80565b9150509295509295909350565b60008060008060608587031215616c0757616c066159aa565b5b6000616c1587828801615fc3565b9450506020616c2687828801615aba565b935050604085013567ffffffffffffffff811115616c4757616c466159af565b5b616c538782880161662e565b925092505092959194509250565b60008060408385031215616c7857616c776159aa565b5b6000616c8685828601615aba565b9250506020616c9785828601615aba565b9150509250929050565b60008060408385031215616cb857616cb76159aa565b5b6000616cc685828601615fc3565b9250506020616cd785828601615aba565b9150509250929050565b600080600080600060a08688031215616cfd57616cfc6159aa565b5b6000616d0b88828901615fc3565b9550506020616d1c88828901615fc3565b9450506040616d2d88828901615aba565b9350506060616d3e88828901615aba565b925050608086013567ffffffffffffffff811115616d5f57616d5e6159af565b5b616d6b88828901615c80565b9150509295509295909350565b6000819050919050565b6000616d9d616d98616d9384615f7a565b616d78565b615f7a565b9050919050565b6000616daf82616d82565b9050919050565b6000616dc182616da4565b9050919050565b616dd181616db6565b82525050565b6000602082019050616dec6000830184616dc8565b92915050565b600081905092915050565b6000616e098385616df2565b9350616e16838584615c2f565b82840190509392505050565b6000616e2f828486616dfd565b91508190509392505050565b616e4481615acf565b82525050565b600060a082019050616e5f6000830188616411565b616e6c6020830187615a79565b616e796040830186616e3b565b616e866060830185616411565b616e936080830184616411565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616ed3601883615dfa565b9150616ede82616e9d565b602082019050919050565b60006020820190508181036000830152616f0281616ec6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616f5057607f821691505b602082108103616f6357616f62616f09565b5b50919050565b50565b6000616f79600083616df2565b9150616f8482616f69565b600082019050919050565b6000616f9a82616f6c565b9150819050919050565b600081905092915050565b6000616fba82615def565b616fc48185616fa4565b9350616fd4818560208601615e0b565b80840191505092915050565b6000616fec8284616faf565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000617053602183615dfa565b915061705e82616ff7565b604082019050919050565b6000602082019050818103600083015261708281617046565b9050919050565b60008151905061709881615aa3565b92915050565b6000602082840312156170b4576170b36159aa565b5b60006170c284828501617089565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61710081615f9a565b82525050565b600061711283836170f7565b60208301905092915050565b6000602082019050919050565b6000617136826170cb565b61714081856170d6565b935061714b836170e7565b8060005b8381101561717c5781516171638882617106565b975061716e8361711e565b92505060018101905061714f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6171be81615a6f565b82525050565b60006171d083836171b5565b60208301905092915050565b6000602082019050919050565b60006171f482617189565b6171fe8185617194565b9350617209836171a5565b8060005b8381101561723a57815161722188826171c4565b975061722c836171dc565b92505060018101905061720d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061728f82616835565b6172998185617273565b93506172a9818560208601615e0b565b6172b281615b72565b840191505092915050565b60006172c98383617284565b905092915050565b6000602082019050919050565b60006172e982617247565b6172f38185617252565b93508360208202850161730585617263565b8060005b85811015617341578484038952815161732285826172bd565b945061732d836172d1565b925060208a01995050600181019050617309565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061738561738061737b84617353565b61735d565b615cae565b9050919050565b6173958161736a565b82525050565b600060a08201905081810360008301526173b5818861712b565b905081810360208301526173c981876171e9565b905081810360408301526173dd81866172de565b90506173ec606083018561738c565b6173f96080830184616411565b9695505050505050565b60008151905061741281615cb8565b92915050565b60006020828403121561742e5761742d6159aa565b5b600061743c84828501617403565b91505092915050565b600060c082019050818103600083015261745f818961712b565b9050818103602083015261747381886171e9565b9050818103604083015261748781876172de565b9050617496606083018661738c565b6174a36080830185616411565b6174b060a0830184615a79565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006174f582615a6f565b915061750083615a6f565b9250828201905080821115617518576175176174bb565b5b92915050565b60006040820190506175336000830185615a79565b6175406020830184615a79565b9392505050565b600060608201905061755c6000830186616411565b6175696020830185615a79565b6175766040830184616e3b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026175e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826175a3565b6175ea86836175a3565b95508019841693508086168417925050509392505050565b600061761d61761861761384615a6f565b616d78565b615a6f565b9050919050565b6000819050919050565b61763783617602565b61764b61764382617624565b8484546175b0565b825550505050565b600090565b617660617653565b61766b81848461762e565b505050565b5b8181101561768f57617684600082617658565b600181019050617671565b5050565b601f8211156176d4576176a58161757e565b6176ae84617593565b810160208510156176bd578190505b6176d16176c985617593565b830182617670565b50505b505050565b600082821c905092915050565b60006176f7600019846008026176d9565b1980831691505092915050565b600061771083836176e6565b9150826002028217905092915050565b61772982615def565b67ffffffffffffffff81111561774257617741615b83565b5b61774c8254616f38565b617757828285617693565b600060209050601f83116001811461778a5760008415617778578287015190505b6177828582617704565b8655506177ea565b601f1984166177988661757e565b60005b828110156177c05784890151825560018201915060208501945060208101905061779b565b868310156177dd57848901516177d9601f8916826176e6565b8355505b6001600288020188555050505b505050505050565b60006177fd82615a6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361782f5761782e6174bb565b5b600182019050919050565b600061784582615a6f565b915061785083615a6f565b925082820261785e81615a6f565b91508282048414831517617875576178746174bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006178b682615a6f565b91506178c183615a6f565b9250826178d1576178d061787c565b5b828204905092915050565b60006178e782615a6f565b91506178f283615a6f565b925082820390508181111561790a576179096174bb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152617959818761712b565b9050818103602083015261796d81866171e9565b9050818103604083015261798181856172de565b90506179906060830184616411565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006179f5602683615dfa565b9150617a0082617999565b604082019050919050565b60006020820190508181036000830152617a24816179e8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617a87602783615dfa565b9150617a9282617a2b565b604082019050919050565b60006020820190508181036000830152617ab681617a7a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000617b19602683615dfa565b9150617b2482617abd565b604082019050919050565b60006020820190508181036000830152617b4881617b0c565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000617bab602383615dfa565b9150617bb682617b4f565b604082019050919050565b60006020820190508181036000830152617bda81617b9e565b9050919050565b6000608082019050617bf66000830187615a79565b617c036020830186616e3b565b617c106040830185615a79565b8181036060830152617c228184615e35565b905095945050505050565b600060a082019050617c426000830188615a79565b617c4f6020830187616e3b565b617c5c6040830186615a79565b8181036060830152617c6e8185615e35565b90508181036080830152617c828184616851565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617d10604383615dfa565b9150617d1b82617c8e565b606082019050919050565b60006020820190508181036000830152617d3f81617d03565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617d7c602083615dfa565b9150617d8782617d46565b602082019050919050565b60006020820190508181036000830152617dab81617d6f565b9050919050565b617dbb81615a39565b8114617dc657600080fd5b50565b600081519050617dd881617db2565b92915050565b600060208284031215617df457617df36159aa565b5b6000617e0284828501617dc9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617e41602083615dfa565b9150617e4c82617e0b565b602082019050919050565b60006020820190508181036000830152617e7081617e34565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617ed3603183615dfa565b9150617ede82617e77565b604082019050919050565b60006020820190508181036000830152617f0281617ec6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617f65602183615dfa565b9150617f7082617f09565b604082019050919050565b60006020820190508181036000830152617f9481617f58565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617fd1601883615dfa565b9150617fdc82617f9b565b602082019050919050565b6000602082019050818103600083015261800081617fc4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000618063602183615dfa565b915061806e82618007565b604082019050919050565b6000602082019050818103600083015261809281618056565b9050919050565b600067ffffffffffffffff82169050919050565b60006180b882618099565b91506180c383618099565b9250828201905067ffffffffffffffff8111156180e3576180e26174bb565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061813182615def565b61813b8185618115565b935061814b818560208601615e0b565b61815481615b72565b840191505092915050565b600061816b8383618126565b905092915050565b6000602082019050919050565b600061818b826180e9565b61819581856180f4565b9350836020820285016181a785618105565b8060005b858110156181e357848403895281516181c4858261815f565b94506181cf83618173565b925060208a019950506001810190506181ab565b50829750879550505050505092915050565b600061821061820b61820684618099565b616d78565b615a6f565b9050919050565b618220816181f5565b82525050565b60006101208201905061823c600083018c615a79565b618249602083018b6160c5565b818103604083015261825b818a61712b565b9050818103606083015261826f81896171e9565b905081810360808301526182838188618180565b905081810360a083015261829781876172de565b90506182a660c0830186618217565b6182b360e0830185618217565b8181036101008301526182c68184615e35565b90509a9950505050505050505050565b60006040820190506182eb60008301856160c5565b6182f86020830184615a79565b9392505050565b600060408201905061831460008301856160c5565b61832160208301846160c5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618384602783615dfa565b915061838f82618328565b604082019050919050565b600060208201905081810360008301526183b381618377565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006183f0600283616fa4565b91506183fb826183ba565b600282019050919050565b6000819050919050565b61842161841c82615cae565b618406565b82525050565b6000618432826183e3565b915061843e8285618410565b60208201915061844e8284618410565b6020820191508190509392505050565b60006080820190506184736000830187616411565b6184806020830186616e3b565b61848d6040830185616411565b61849a6060830184616411565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006184d9601883615dfa565b91506184e4826184a3565b602082019050919050565b60006020820190508181036000830152618508816184cc565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618545601f83615dfa565b91506185508261850f565b602082019050919050565b6000602082019050818103600083015261857481618538565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006185d7602283615dfa565b91506185e28261857b565b604082019050919050565b60006020820190508181036000830152618606816185ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618669602283615dfa565b91506186748261860d565b604082019050919050565b600060208201905081810360008301526186988161865c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006186fb602783615dfa565b91506187068261869f565b604082019050919050565b6000602082019050818103600083015261872a816186ee565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061878d603583615dfa565b915061879882618731565b604082019050919050565b600060208201905081810360008301526187bc81618780565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006187f9601d83615dfa565b9150618804826187c3565b602082019050919050565b60006020820190508181036000830152618828816187ec565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061888b602683615dfa565b91506188968261882f565b604082019050919050565b600060208201905081810360008301526188ba8161887e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061891d602683615dfa565b9150618928826188c1565b604082019050919050565b6000602082019050818103600083015261894c81618910565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618989601d83615dfa565b915061899482618953565b602082019050919050565b600060208201905081810360008301526189b88161897c565b9050919050565b60006189ca82616835565b6189d48185616df2565b93506189e4818560208601615e0b565b80840191505092915050565b60006189fc82846189bf565b915081905092915050565b600060a082019050618a1c6000830188616411565b618a296020830187616411565b618a366040830186616411565b618a436060830185615a79565b618a5060808301846160c5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220dd4edfac69a6afd6aeac0d468ddba6cc40c7263f1a78654ed0f9586c5980bfef64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061044b5760003560e01c80637b3c71d311610234578063c01f9e371161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e6114611336578063f2fde38b14611373578063f8ce560a1461139c578063fc0c546a146113d9578063fea856a11461140457610491565b8063deaaa7cc1461123f578063e0c410cc1461126a578063ea0217cf146112a7578063eb9019d4146112d0578063ece40cc11461130d57610491565b8063ca1d209d116100fd578063ca1d209d14611153578063cf6862591461116f578063d33219b4146111ac578063dc73204b146111d7578063dd4e2ba51461121457610491565b8063c01f9e3714611073578063c0d55329146110b0578063c28bc2fa146110ed578063c59057e41461111657610491565b806397c3d334116101bc578063abe1aae611610180578063abe1aae614610f54578063b58131b014610f91578063b59d18a014610fbc578063bba9c21914610ff9578063bc197c811461103657610491565b806397c3d33414610e5b5780639a802a6d14610e86578063a7713a7014610ec3578063a890c91014610eee578063ab58fb8e14610f1757610491565b806387030f4d1161020357806387030f4d14610d625780638da5cb5b14610d8b5780638fb5548f14610db6578063902bfa2414610df357806396aa167e14610e3057610491565b80637b3c71d314610c805780637d5e81e214610cbd578063809b268e14610cfa578063868661cb14610d3757610491565b80633fafa127116103455780635b6b4652116102cd5780636ee8e8ef116102915780636ee8e8ef14610b8957806370084d7a14610bc657806370b0f66014610c03578063715018a614610c2c578063794d556014610c4357610491565b80635b6b465214610a575780635ced7d4014610a945780635f398a1414610ad157806360c4247f14610b0e5780636e04ff0d14610b4b57610491565b80634fac2bb7116103145780634fac2bb714610948578063535bf50f14610985578063544ffc9c146109b057806354fd4d50146109ef5780635678138814610a1a57610491565b80633fafa1271461087a57806343859632146108a5578063446a156f146108e25780634585e33b1461091f57610491565b8063156277be116103d35780633932abb1116103975780633932abb1146107815780633bccf4fd146107ac5780633be2f2a3146107e95780633e4f49e6146108125780633f3b3b271461084f57610491565b8063156277be1461066f578063160cbed7146106ac5780632656227d146106e95780632d63f693146107195780632fe3e2611461075657610491565b806306fdde031161041a57806306fdde03146105645780630cee17251461058f578063141a6c22146105b8578063148038b0146105f5578063150b7a021461063257610491565b806301ffc9a71461049657806302a251a3146104d357806303420181146104fe57806306f3f9e61461053b57610491565b36610491573073ffffffffffffffffffffffffffffffffffffffff1661046f61140e565b73ffffffffffffffffffffffffffffffffffffffff161461048f57600080fd5b005b600080fd5b3480156104a257600080fd5b506104bd60048036038101906104b89190615a0c565b61141d565b6040516104ca9190615a54565b60405180910390f35b3480156104df57600080fd5b506104e861142f565b6040516104f59190615a88565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190615ce4565b61143e565b6040516105329190615a88565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190615dc2565b611523565b005b34801561057057600080fd5b5061057961161a565b6040516105869190615e6e565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190615dc2565b6116ac565b005b3480156105c457600080fd5b506105df60048036038101906105da9190615f31565b61182c565b6040516105ec9190615a88565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190615fd8565b611854565b6040516106299190615a88565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190616018565b611879565b60405161066691906160aa565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190615dc2565b61188d565b6040516106a391906160d4565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190616356565b6118c0565b6040516106e09190615a88565b60405180910390f35b61070360048036038101906106fe9190616356565b611b7a565b6040516107109190615a88565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190615dc2565b611cc7565b60405161074d9190615a88565b60405180910390f35b34801561076257600080fd5b5061076b611d35565b6040516107789190616420565b60405180910390f35b34801561078d57600080fd5b50610796611d59565b6040516107a39190615a88565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061643b565b611d68565b6040516107e09190615a88565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906164b6565b611df2565b005b34801561081e57600080fd5b5061083960048036038101906108349190615dc2565b61205f565b60405161084691906165b0565b60405180910390f35b34801561085b57600080fd5b50610864612071565b6040516108719190615a88565b60405180910390f35b34801561088657600080fd5b5061088f612077565b60405161089c9190615a88565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190615fd8565b61207d565b6040516108d99190615a54565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190615dc2565b6120e8565b6040516109169190616613565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190616684565b612112565b005b34801561095457600080fd5b5061096f600480360381019061096a9190615dc2565b612406565b60405161097c9190615a54565b60405180910390f35b34801561099157600080fd5b5061099a612426565b6040516109a79190615a88565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d29190615dc2565b612430565b6040516109e6939291906166d1565b60405180910390f35b3480156109fb57600080fd5b50610a04612468565b604051610a119190615e6e565b60405180910390f35b348015610a2657600080fd5b50610a416004803603810190610a3c9190616708565b6124a5565b604051610a4e9190615a88565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190615dc2565b6124d6565b604051610a8b9190615a88565b60405180910390f35b348015610aa057600080fd5b50610abb6004803603810190610ab69190615dc2565b6124ee565b604051610ac89190615a88565b60405180910390f35b348015610add57600080fd5b50610af86004803603810190610af39190616748565b612506565b604051610b059190615a88565b60405180910390f35b348015610b1a57600080fd5b50610b356004803603810190610b309190615dc2565b612570565b604051610b429190615a88565b60405180910390f35b348015610b5757600080fd5b50610b726004803603810190610b6d91906167ec565b6126bc565b604051610b8092919061688a565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab91906168ba565b612776565b604051610bbd9190615a54565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be89190615dc2565b612796565b604051610bfa9190616613565b60405180910390f35b348015610c0f57600080fd5b50610c2a6004803603810190610c259190615dc2565b6127b6565b005b348015610c3857600080fd5b50610c416128ad565b005b348015610c4f57600080fd5b50610c6a6004803603810190610c659190615dc2565b6128c1565b604051610c779190615a88565b60405180910390f35b348015610c8c57600080fd5b50610ca76004803603810190610ca291906168e7565b6128d9565b604051610cb49190615a88565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf919061695b565b612941565b604051610cf19190615a88565b60405180910390f35b348015610d0657600080fd5b50610d216004803603810190610d1c9190615dc2565b6129dc565b604051610d2e9190615a54565b60405180910390f35b348015610d4357600080fd5b50610d4c612a06565b604051610d599190615a88565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d849190615dc2565b612a0c565b005b348015610d9757600080fd5b50610da0612aaf565b604051610dad91906160d4565b60405180910390f35b348015610dc257600080fd5b50610ddd6004803603810190610dd89190615dc2565b612ad9565b604051610dea9190615e6e565b60405180910390f35b348015610dff57600080fd5b50610e1a6004803603810190610e159190615dc2565b612b79565b604051610e279190615a54565b60405180910390f35b348015610e3c57600080fd5b50610e45612b99565b604051610e529190615a88565b60405180910390f35b348015610e6757600080fd5b50610e70612b9f565b604051610e7d9190615a88565b60405180910390f35b348015610e9257600080fd5b50610ead6004803603810190610ea89190616a32565b612ba8565b604051610eba9190615a88565b60405180910390f35b348015610ecf57600080fd5b50610ed8612bbe565b604051610ee59190615a88565b60405180910390f35b348015610efa57600080fd5b50610f156004803603810190610f109190616af1565b612be7565b005b348015610f2357600080fd5b50610f3e6004803603810190610f399190615dc2565b612cde565b604051610f4b9190615a88565b60405180910390f35b348015610f6057600080fd5b50610f7b6004803603810190610f769190615dc2565b612dab565b604051610f889190615e6e565b60405180910390f35b348015610f9d57600080fd5b50610fa6612e50565b604051610fb39190615a88565b60405180910390f35b348015610fc857600080fd5b50610fe36004803603810190610fde9190615dc2565b612e5f565b604051610ff09190615a88565b60405180910390f35b34801561100557600080fd5b50611020600480360381019061101b9190615dc2565b612e7c565b60405161102d9190615a88565b60405180910390f35b34801561104257600080fd5b5061105d60048036038101906110589190616b1e565b612e99565b60405161106a91906160aa565b60405180910390f35b34801561107f57600080fd5b5061109a60048036038101906110959190615dc2565b612eae565b6040516110a79190615a88565b60405180910390f35b3480156110bc57600080fd5b506110d760048036038101906110d291906168ba565b612f1c565b6040516110e49190615a54565b60405180910390f35b3480156110f957600080fd5b50611114600480360381019061110f9190616bed565b612f72565b005b34801561112257600080fd5b5061113d60048036038101906111389190616356565b6130b3565b60405161114a9190615a88565b60405180910390f35b61116d60048036038101906111689190615dc2565b6130ef565b005b34801561117b57600080fd5b5061119660048036038101906111919190615f31565b6131dc565b6040516111a39190615a88565b60405180910390f35b3480156111b857600080fd5b506111c161320a565b6040516111ce91906160d4565b60405180910390f35b3480156111e357600080fd5b506111fe60048036038101906111f99190616c61565b613234565b60405161120b9190615a88565b60405180910390f35b34801561122057600080fd5b50611229613259565b6040516112369190615e6e565b60405180910390f35b34801561124b57600080fd5b50611254613296565b6040516112619190616420565b60405180910390f35b34801561127657600080fd5b50611291600480360381019061128c9190615dc2565b6132ba565b60405161129e9190615a54565b60405180910390f35b3480156112b357600080fd5b506112ce60048036038101906112c99190615dc2565b6132e4565b005b3480156112dc57600080fd5b506112f760048036038101906112f29190616ca1565b6133db565b6040516113049190615a88565b60405180910390f35b34801561131957600080fd5b50611334600480360381019061132f9190615dc2565b6133f7565b005b34801561134257600080fd5b5061135d60048036038101906113589190616ce1565b6134ee565b60405161136a91906160aa565b60405180910390f35b34801561137f57600080fd5b5061139a600480360381019061139591906168ba565b613503565b005b3480156113a857600080fd5b506113c360048036038101906113be9190615dc2565b613586565b6040516113d09190615a88565b60405180910390f35b3480156113e557600080fd5b506113ee613598565b6040516113fb9190616dd7565b60405180910390f35b61140c6135bc565b005b60006114186139f0565b905090565b600061142882613a1a565b9050919050565b6000611439613a94565b905090565b6000806114c16114b97fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c60405161147a929190616e22565b60405180910390208b8051906020012060405160200161149e959493929190616e4a565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b90506115148a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613ae3565b91505098975050505050505050565b61152b61140e565b73ffffffffffffffffffffffffffffffffffffffff16611549613c9f565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115be61140e565b73ffffffffffffffffffffffffffffffffffffffff161461160e5760006115e3613ca7565b6040516115f1929190616e22565b604051809103902090505b806116076002613cb4565b036115fc57505b61161781613d90565b50565b60606000805461162990616f38565b80601f016020809104026020016040519081016040528092919081815260200182805461165590616f38565b80156116a25780601f10611677576101008083540402835291602001916116a2565b820191906000526020600020905b81548152906001019060200180831161168557829003601f168201915b5050505050905090565b600260038111156116c0576116bf616539565b5b601b600083815260200190815260200160002060009054906101000a900460ff1660038111156116f3576116f2616539565b5b036117f75760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161177390616f8f565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50509050806117f0576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611829565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600060148260405161183e9190616fe0565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806118cf868686866130b3565b9050600460078111156118e5576118e4616539565b5b6118ee8261205f565b6007811115611900576118ff616539565b5b14611940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193790617069565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d3919061709e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611a3995949392919061739b565b602060405180830381865afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a9190617418565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611af796959493929190617445565b600060405180830381600087803b158015611b1157600080fd5b505af1158015611b25573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b5791906174ea565b604051611b6592919061751e565b60405180910390a18192505050949350505050565b600080611b89868686866130b3565b90506000611b968261205f565b905060046007811115611bac57611bab616539565b5b816007811115611bbf57611bbe616539565b5b1480611bef575060056007811115611bda57611bd9616539565b5b816007811115611bed57611bec616539565b5b145b611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590617069565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c8b9190615a88565b60405180910390a1611ca08288888888613f44565b611cad8288888888614027565b611cba828888888861403b565b8192505050949350505050565b6000611d24600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d636140a4565b905090565b600080611dc9611dc17f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611da693929190617547565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b9050611de6878288604051806020016040528060008152506140ae565b91505095945050505050565b611dfa6140ce565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e7d576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611ee157611ee0616539565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d54601485604051611f2d9190616fe0565b9081526020016040518091039020819055508360156000600d5481526020019081526020016000209081611f619190617720565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d6000815480929190612054906177f2565b919050555050505050565b600061206a8261414c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061212c604051806020016040528060008152506126bc565b50905080612166576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600060196000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060186000600d5481526020019081526020016000205460176000600d548152602001908152602001600020541115612393576001601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561222d5761222c616539565b5b021790555060006064600f5460176000600d54815260200190815260200160002054612259919061783a565b61226391906178ab565b90506000601a6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516122c090616f8f565b60006040518083038185875af1925050503d80600081146122fd576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b606091505b505090508061235d5760176000600d548152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016123549190615a88565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612401565b6002601b6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156123cc576123cb616539565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806124b0613c9f565b90506124cd848285604051806020016040528060008152506140ae565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b600080612511613c9f565b905061256487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613ae3565b91505095945050505050565b600080600960000180549050905060008103612591576008549150506126b7565b600060096000016001836125a591906178dc565b815481106125b6576125b5617910565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161269e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506126b7565b6126b284600961431f90919063ffffffff16565b925050505b919050565b6000606060116000600d54815260200190815260200160002060009054906101000a900460ff16801561276f575060126000600d548152602001908152602001600020600060136000600d5481526020019081526020016000205481526020019081526020016000205460126000600d548152602001908152602001600020600060136000600d548152602001908152602001600020548152602001908152602001600020544261276d91906178dc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b6127be61140e565b73ffffffffffffffffffffffffffffffffffffffff166127dc613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661285161140e565b73ffffffffffffffffffffffffffffffffffffffff16146128a1576000612876613ca7565b604051612884929190616e22565b604051809103902090505b8061289a6002613cb4565b0361288f57505b6128aa81614477565b50565b6128b56140ce565b6128bf60006144bc565b565b60176020528060005260406000206000915090505481565b6000806128e4613c9f565b905061293686828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506140ae565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129c6576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129d285858585614582565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612a146140ce565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612aa757612aa6616539565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612af890616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2490616f38565b8015612b715780601f10612b4657610100808354040283529160200191612b71565b820191906000526020600020905b815481529060010190602001808311612b5457829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612bb5848484614889565b90509392505050565b60008060096000018054905014612bde57612bd96009613902565b612be2565b6008545b905090565b612bef61140e565b73ffffffffffffffffffffffffffffffffffffffff16612c0d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612c8261140e565b73ffffffffffffffffffffffffffffffffffffffff1614612cd2576000612ca7613ca7565b604051612cb5929190616e22565b604051809103902090505b80612ccb6002613cb4565b03612cc057505b612cdb81614930565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612d4f9190616420565b602060405180830381865afa158015612d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d90919061709e565b905060018114612da05780612da3565b60005b915050919050565b6060601560008381526020019081526020016000208054612dcb90616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612df790616f38565b8015612e445780601f10612e1957610100808354040283529160200191612e44565b820191906000526020600020905b815481529060010190602001808311612e2757829003601f168201915b50505050509050919050565b6000612e5a6149cf565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612f0b600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612f7a61140e565b73ffffffffffffffffffffffffffffffffffffffff16612f98613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661300d61140e565b73ffffffffffffffffffffffffffffffffffffffff161461305d576000613032613ca7565b604051613040929190616e22565b604051809103902090505b806130566002613cb4565b0361304b57505b6130ac8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856149d9565b5050505050565b6000848484846040516020016130cc949392919061793f565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff16613147576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a791906174ea565b92505081905550346017600084815260200190815260200160002060008282546131d191906174ea565b925050819055505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6132ec61140e565b73ffffffffffffffffffffffffffffffffffffffff1661330a613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335790616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661337f61140e565b73ffffffffffffffffffffffffffffffffffffffff16146133cf5760006133a4613ca7565b6040516133b2929190616e22565b604051809103902090505b806133c86002613cb4565b036133bd57505b6133d881614a08565b50565b60006133ef83836133ea614a90565b614889565b905092915050565b6133ff61140e565b73ffffffffffffffffffffffffffffffffffffffff1661341d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661349261140e565b73ffffffffffffffffffffffffffffffffffffffff16146134e25760006134b7613ca7565b6040516134c5929190616e22565b604051809103902090505b806134db6002613cb4565b036134d057505b6134eb81614aa7565b50565b600063f23a6e6160e01b905095945050505050565b61350b6140ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361357a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357190617a0b565b60405180910390fd5b613583816144bc565b50565b600061359182614aec565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543410156135f8576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156136f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ef90617a9d565b60405180910390fd5b819050919050565b600080600084600001805490509050600061371a86613902565b90506000821180156137705750438660000160018461373991906178dc565b8154811061374a57613749617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156138005761377e85613695565b8660000160018461378f91906178dc565b815481106137a05761379f617910565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506138f3565b8560000160405180604001604052806138184361399d565b63ffffffff16815260200161382c88613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613974578260000160018261392891906178dc565b8154811061393957613938617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613977565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156139e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139df90617b2f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a8d5750613a8c82614bb4565b5b9050919050565b6000600554905090565b6000613ab1613aab614d19565b83614e33565b9050919050565b6000806000613ac987878787614e66565b91509150613ad681614f72565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613b0f57613b0e616539565b5b613b188861205f565b6007811115613b2a57613b29616539565b5b14613b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6190617bc1565b60405180910390fd5b6000613bc987613bb9846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff1686614889565b9050613bd8888888848861513e565b6000845103613c3a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613c2d9493929190617be1565b60405180910390a2613c91565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613c88959493929190617c2d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613cbf82615342565b15613cf6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613d98612b9f565b811115613dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd190617d26565b60405180910390fd5b6000613de4612bbe565b905060008114158015613dff57506000600960000180549050145b15613ef15760096000016040518060400160405280600063ffffffff168152602001613e2a84613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613f0582600961370090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613f3892919061751e565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613f6361140e565b73ffffffffffffffffffffffffffffffffffffffff16146140205760005b845181101561401e573073ffffffffffffffffffffffffffffffffffffffff16858281518110613fb457613fb3617910565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361400d5761400c838281518110613fed57613fec617910565b5b602002602001015180519060200120600261537790919063ffffffff16565b5b80614017906177f2565b9050613f81565b505b5050505050565b61403485858585856153f3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661405a61140e565b73ffffffffffffffffffffffffffffffffffffffff161461408f5761407f6002615342565b61408e5761408d6002615491565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006140c4858585856140bf614a90565b613ae3565b9050949350505050565b6140d6613c9f565b73ffffffffffffffffffffffffffffffffffffffff166140f4612aaf565b73ffffffffffffffffffffffffffffffffffffffff161461414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161414190617d92565b60405180910390fd5b565b60008061415883615512565b90506004600781111561416e5761416d616539565b5b81600781111561418157614180616539565b5b1461418f578091505061431a565b6000600b60008581526020019081526020016000205490506000801b81036141bb57819250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016142169190616420565b602060405180830381865afa158015614233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142579190617dde565b156142675760079250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016142c29190616420565b602060405180830381865afa1580156142df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143039190617dde565b156143135760059250505061431a565b6002925050505b919050565b6000438210614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90617e57565b60405180910390fd5b60008360000180549050905060005b818110156143e75760006143868284615626565b90508486600001828154811061439f5761439e617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156143d1578092506143e1565b6001816143de91906174ea565b91505b50614372565b6000821461444c578460000160018361440091906178dc565b8154811061441157614410617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661444f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516144aa92919061751e565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061458c612e50565b6145a9614597613c9f565b6001436145a491906178dc565b6133db565b10156145ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145e190617ee9565b60405180910390fd5b60006145ff86868686805190602001206130b3565b90508451865114614645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161463c90617f7b565b60405180910390fd5b8351865114614689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468090617f7b565b60405180910390fd5b60008651116146cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146c490617fe7565b60405180910390fd5b600060016000838152602001908152602001600020905061472d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061564c565b61476c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161476390618079565b60405180910390fd5b600061477e614779611d59565b615666565b61478743615666565b61479191906180ad565b905060006147a56147a061142f565b615666565b826147b091906180ad565b90506147c882846000016156bd90919063ffffffff16565b6147de81846001016156bd90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614808613c9f565b8b8b8d5167ffffffffffffffff81111561482557614824615b83565b5b60405190808252806020026020018201604052801561485857816020015b60608152602001906001900390816148435790505b508c88888e60405161487299989796959493929190618226565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016148e69291906182d6565b602060405180830381865afa158015614903573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614927919061709e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516149839291906182ff565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606149ff848484604051806060016040528060298152602001618a5b602991396156ec565b90509392505050565b60008111614a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a429061839a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614a7e92919061751e565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614ada92919061751e565b60405180910390a18060068190555050565b6000614af6612b9f565b614aff83612570565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614b589190615a88565b602060405180830381865afa158015614b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b99919061709e565b614ba3919061783a565b614bad91906178ab565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614c9a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d0257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d125750614d1182615800565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614d9557507f000000000000000000000000000000000000000000000000000000000000000046145b15614dc2577f00000000000000000000000000000000000000000000000000000000000000009050614e30565b614e2d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061586a565b90505b90565b60008282604051602001614e48929190618427565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614ea1576000600391509150614f69565b601b8560ff1614158015614eb95750601c8560ff1614155b15614ecb576000600491509150614f69565b600060018787878760405160008152602001604052604051614ef0949392919061845e565b6020604051602081039080840390855afa158015614f12573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614f6057600060019250925050614f69565b80600092509250505b94509492505050565b60006004811115614f8657614f85616539565b5b816004811115614f9957614f98616539565b5b031561513b5760016004811115614fb357614fb2616539565b5b816004811115614fc657614fc5616539565b5b03615006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ffd906184ef565b60405180910390fd5b6002600481111561501a57615019616539565b5b81600481111561502d5761502c616539565b5b0361506d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150649061855b565b60405180910390fd5b6003600481111561508157615080616539565b5b81600481111561509457615093616539565b5b036150d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150cb906185ed565b60405180910390fd5b6004808111156150e7576150e6616539565b5b8160048111156150fa576150f9616539565b5b0361513a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151319061867f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156151e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151db90618711565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561525257615251616539565b5b60ff168460ff160361527e578281600001600082825461527291906174ea565b9250508190555061533a565b6001600281111561529257615291616539565b5b60ff168460ff16036152be57828160010160008282546152b291906174ea565b92505081905550615339565b6002808111156152d1576152d0616539565b5b60ff168460ff16036152fd57828160020160008282546152f191906174ea565b92505081905550615338565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161532f906187a3565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161545895949392919061739b565b6000604051808303818588803b15801561547157600080fd5b505af1158015615485573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561554b576007915050615621565b8060020160019054906101000a900460ff161561556c576002915050615621565b600061557784611cc7565b9050600081036155bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155b39061880f565b60405180910390fd5b4381106155ce57600092505050615621565b60006155d985612eae565b90504381106155ee5760019350505050615621565b6155f7856158a4565b80156156085750615607856158eb565b5b156156195760049350505050615621565b600393505050505b919050565b6000600282841861563791906178ab565b82841661564491906174ea565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff80168211156156b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016156ac906188a1565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161572890618933565b60405180910390fd5b61573a85615916565b615779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709061899f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516157a291906189f0565b60006040518083038185875af1925050503d80600081146157df576040519150601f19603f3d011682016040523d82523d6000602084013e6157e4565b606091505b50915091506157f4828286615939565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615885959493929190618a07565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546158d091906174ea565b6158e16158dc85611cc7565b613586565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561594957829050615999565b60008351111561595c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159909190615e6e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6159e9816159b4565b81146159f457600080fd5b50565b600081359050615a06816159e0565b92915050565b600060208284031215615a2257615a216159aa565b5b6000615a30848285016159f7565b91505092915050565b60008115159050919050565b615a4e81615a39565b82525050565b6000602082019050615a696000830184615a45565b92915050565b6000819050919050565b615a8281615a6f565b82525050565b6000602082019050615a9d6000830184615a79565b92915050565b615aac81615a6f565b8114615ab757600080fd5b50565b600081359050615ac981615aa3565b92915050565b600060ff82169050919050565b615ae581615acf565b8114615af057600080fd5b50565b600081359050615b0281615adc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615b2d57615b2c615b08565b5b8235905067ffffffffffffffff811115615b4a57615b49615b0d565b5b602083019150836001820283011115615b6657615b65615b12565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615bbb82615b72565b810181811067ffffffffffffffff82111715615bda57615bd9615b83565b5b80604052505050565b6000615bed6159a0565b9050615bf98282615bb2565b919050565b600067ffffffffffffffff821115615c1957615c18615b83565b5b615c2282615b72565b9050602081019050919050565b82818337600083830152505050565b6000615c51615c4c84615bfe565b615be3565b905082815260208101848484011115615c6d57615c6c615b6d565b5b615c78848285615c2f565b509392505050565b600082601f830112615c9557615c94615b08565b5b8135615ca5848260208601615c3e565b91505092915050565b6000819050919050565b615cc181615cae565b8114615ccc57600080fd5b50565b600081359050615cde81615cb8565b92915050565b60008060008060008060008060e0898b031215615d0457615d036159aa565b5b6000615d128b828c01615aba565b9850506020615d238b828c01615af3565b975050604089013567ffffffffffffffff811115615d4457615d436159af565b5b615d508b828c01615b17565b9650965050606089013567ffffffffffffffff811115615d7357615d726159af565b5b615d7f8b828c01615c80565b9450506080615d908b828c01615af3565b93505060a0615da18b828c01615ccf565b92505060c0615db28b828c01615ccf565b9150509295985092959890939650565b600060208284031215615dd857615dd76159aa565b5b6000615de684828501615aba565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615e29578082015181840152602081019050615e0e565b60008484015250505050565b6000615e4082615def565b615e4a8185615dfa565b9350615e5a818560208601615e0b565b615e6381615b72565b840191505092915050565b60006020820190508181036000830152615e888184615e35565b905092915050565b600067ffffffffffffffff821115615eab57615eaa615b83565b5b615eb482615b72565b9050602081019050919050565b6000615ed4615ecf84615e90565b615be3565b905082815260208101848484011115615ef057615eef615b6d565b5b615efb848285615c2f565b509392505050565b600082601f830112615f1857615f17615b08565b5b8135615f28848260208601615ec1565b91505092915050565b600060208284031215615f4757615f466159aa565b5b600082013567ffffffffffffffff811115615f6557615f646159af565b5b615f7184828501615f03565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615fa582615f7a565b9050919050565b615fb581615f9a565b8114615fc057600080fd5b50565b600081359050615fd281615fac565b92915050565b60008060408385031215615fef57615fee6159aa565b5b6000615ffd85828601615aba565b925050602061600e85828601615fc3565b9150509250929050565b60008060008060808587031215616032576160316159aa565b5b600061604087828801615fc3565b945050602061605187828801615fc3565b935050604061606287828801615aba565b925050606085013567ffffffffffffffff811115616083576160826159af565b5b61608f87828801615c80565b91505092959194509250565b6160a4816159b4565b82525050565b60006020820190506160bf600083018461609b565b92915050565b6160ce81615f9a565b82525050565b60006020820190506160e960008301846160c5565b92915050565b600067ffffffffffffffff82111561610a57616109615b83565b5b602082029050602081019050919050565b600061612e616129846160ef565b615be3565b9050808382526020820190506020840283018581111561615157616150615b12565b5b835b8181101561617a57806161668882615fc3565b845260208401935050602081019050616153565b5050509392505050565b600082601f83011261619957616198615b08565b5b81356161a984826020860161611b565b91505092915050565b600067ffffffffffffffff8211156161cd576161cc615b83565b5b602082029050602081019050919050565b60006161f16161ec846161b2565b615be3565b9050808382526020820190506020840283018581111561621457616213615b12565b5b835b8181101561623d57806162298882615aba565b845260208401935050602081019050616216565b5050509392505050565b600082601f83011261625c5761625b615b08565b5b813561626c8482602086016161de565b91505092915050565b600067ffffffffffffffff8211156162905761628f615b83565b5b602082029050602081019050919050565b60006162b46162af84616275565b615be3565b905080838252602082019050602084028301858111156162d7576162d6615b12565b5b835b8181101561631e57803567ffffffffffffffff8111156162fc576162fb615b08565b5b8086016163098982615c80565b855260208501945050506020810190506162d9565b5050509392505050565b600082601f83011261633d5761633c615b08565b5b813561634d8482602086016162a1565b91505092915050565b600080600080608085870312156163705761636f6159aa565b5b600085013567ffffffffffffffff81111561638e5761638d6159af565b5b61639a87828801616184565b945050602085013567ffffffffffffffff8111156163bb576163ba6159af565b5b6163c787828801616247565b935050604085013567ffffffffffffffff8111156163e8576163e76159af565b5b6163f487828801616328565b925050606061640587828801615ccf565b91505092959194509250565b61641a81615cae565b82525050565b60006020820190506164356000830184616411565b92915050565b600080600080600060a08688031215616457576164566159aa565b5b600061646588828901615aba565b955050602061647688828901615af3565b945050604061648788828901615af3565b935050606061649888828901615ccf565b92505060806164a988828901615ccf565b9150509295509295909350565b600080600080608085870312156164d0576164cf6159aa565b5b600085013567ffffffffffffffff8111156164ee576164ed6159af565b5b6164fa87828801615f03565b945050602061650b87828801615aba565b935050604061651c87828801615aba565b925050606061652d87828801615fc3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061657957616578616539565b5b50565b600081905061658a82616568565b919050565b600061659a8261657c565b9050919050565b6165aa8161658f565b82525050565b60006020820190506165c560008301846165a1565b92915050565b600481106165dc576165db616539565b5b50565b60008190506165ed826165cb565b919050565b60006165fd826165df565b9050919050565b61660d816165f2565b82525050565b60006020820190506166286000830184616604565b92915050565b60008083601f84011261664457616643615b08565b5b8235905067ffffffffffffffff81111561666157616660615b0d565b5b60208301915083600182028301111561667d5761667c615b12565b5b9250929050565b6000806020838503121561669b5761669a6159aa565b5b600083013567ffffffffffffffff8111156166b9576166b86159af565b5b6166c58582860161662e565b92509250509250929050565b60006060820190506166e66000830186615a79565b6166f36020830185615a79565b6167006040830184615a79565b949350505050565b6000806040838503121561671f5761671e6159aa565b5b600061672d85828601615aba565b925050602061673e85828601615af3565b9150509250929050565b600080600080600060808688031215616764576167636159aa565b5b600061677288828901615aba565b955050602061678388828901615af3565b945050604086013567ffffffffffffffff8111156167a4576167a36159af565b5b6167b088828901615b17565b9350935050606086013567ffffffffffffffff8111156167d3576167d26159af565b5b6167df88828901615c80565b9150509295509295909350565b600060208284031215616802576168016159aa565b5b600082013567ffffffffffffffff8111156168205761681f6159af565b5b61682c84828501615c80565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061685c82616835565b6168668185616840565b9350616876818560208601615e0b565b61687f81615b72565b840191505092915050565b600060408201905061689f6000830185615a45565b81810360208301526168b18184616851565b90509392505050565b6000602082840312156168d0576168cf6159aa565b5b60006168de84828501615fc3565b91505092915050565b60008060008060608587031215616901576169006159aa565b5b600061690f87828801615aba565b945050602061692087828801615af3565b935050604085013567ffffffffffffffff811115616941576169406159af565b5b61694d87828801615b17565b925092505092959194509250565b60008060008060808587031215616975576169746159aa565b5b600085013567ffffffffffffffff811115616993576169926159af565b5b61699f87828801616184565b945050602085013567ffffffffffffffff8111156169c0576169bf6159af565b5b6169cc87828801616247565b935050604085013567ffffffffffffffff8111156169ed576169ec6159af565b5b6169f987828801616328565b925050606085013567ffffffffffffffff811115616a1a57616a196159af565b5b616a2687828801615f03565b91505092959194509250565b600080600060608486031215616a4b57616a4a6159aa565b5b6000616a5986828701615fc3565b9350506020616a6a86828701615aba565b925050604084013567ffffffffffffffff811115616a8b57616a8a6159af565b5b616a9786828701615c80565b9150509250925092565b6000616aac82615f7a565b9050919050565b6000616abe82616aa1565b9050919050565b616ace81616ab3565b8114616ad957600080fd5b50565b600081359050616aeb81616ac5565b92915050565b600060208284031215616b0757616b066159aa565b5b6000616b1584828501616adc565b91505092915050565b600080600080600060a08688031215616b3a57616b396159aa565b5b6000616b4888828901615fc3565b9550506020616b5988828901615fc3565b945050604086013567ffffffffffffffff811115616b7a57616b796159af565b5b616b8688828901616247565b935050606086013567ffffffffffffffff811115616ba757616ba66159af565b5b616bb388828901616247565b925050608086013567ffffffffffffffff811115616bd457616bd36159af565b5b616be088828901615c80565b9150509295509295909350565b60008060008060608587031215616c0757616c066159aa565b5b6000616c1587828801615fc3565b9450506020616c2687828801615aba565b935050604085013567ffffffffffffffff811115616c4757616c466159af565b5b616c538782880161662e565b925092505092959194509250565b60008060408385031215616c7857616c776159aa565b5b6000616c8685828601615aba565b9250506020616c9785828601615aba565b9150509250929050565b60008060408385031215616cb857616cb76159aa565b5b6000616cc685828601615fc3565b9250506020616cd785828601615aba565b9150509250929050565b600080600080600060a08688031215616cfd57616cfc6159aa565b5b6000616d0b88828901615fc3565b9550506020616d1c88828901615fc3565b9450506040616d2d88828901615aba565b9350506060616d3e88828901615aba565b925050608086013567ffffffffffffffff811115616d5f57616d5e6159af565b5b616d6b88828901615c80565b9150509295509295909350565b6000819050919050565b6000616d9d616d98616d9384615f7a565b616d78565b615f7a565b9050919050565b6000616daf82616d82565b9050919050565b6000616dc182616da4565b9050919050565b616dd181616db6565b82525050565b6000602082019050616dec6000830184616dc8565b92915050565b600081905092915050565b6000616e098385616df2565b9350616e16838584615c2f565b82840190509392505050565b6000616e2f828486616dfd565b91508190509392505050565b616e4481615acf565b82525050565b600060a082019050616e5f6000830188616411565b616e6c6020830187615a79565b616e796040830186616e3b565b616e866060830185616411565b616e936080830184616411565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616ed3601883615dfa565b9150616ede82616e9d565b602082019050919050565b60006020820190508181036000830152616f0281616ec6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616f5057607f821691505b602082108103616f6357616f62616f09565b5b50919050565b50565b6000616f79600083616df2565b9150616f8482616f69565b600082019050919050565b6000616f9a82616f6c565b9150819050919050565b600081905092915050565b6000616fba82615def565b616fc48185616fa4565b9350616fd4818560208601615e0b565b80840191505092915050565b6000616fec8284616faf565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000617053602183615dfa565b915061705e82616ff7565b604082019050919050565b6000602082019050818103600083015261708281617046565b9050919050565b60008151905061709881615aa3565b92915050565b6000602082840312156170b4576170b36159aa565b5b60006170c284828501617089565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61710081615f9a565b82525050565b600061711283836170f7565b60208301905092915050565b6000602082019050919050565b6000617136826170cb565b61714081856170d6565b935061714b836170e7565b8060005b8381101561717c5781516171638882617106565b975061716e8361711e565b92505060018101905061714f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6171be81615a6f565b82525050565b60006171d083836171b5565b60208301905092915050565b6000602082019050919050565b60006171f482617189565b6171fe8185617194565b9350617209836171a5565b8060005b8381101561723a57815161722188826171c4565b975061722c836171dc565b92505060018101905061720d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061728f82616835565b6172998185617273565b93506172a9818560208601615e0b565b6172b281615b72565b840191505092915050565b60006172c98383617284565b905092915050565b6000602082019050919050565b60006172e982617247565b6172f38185617252565b93508360208202850161730585617263565b8060005b85811015617341578484038952815161732285826172bd565b945061732d836172d1565b925060208a01995050600181019050617309565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061738561738061737b84617353565b61735d565b615cae565b9050919050565b6173958161736a565b82525050565b600060a08201905081810360008301526173b5818861712b565b905081810360208301526173c981876171e9565b905081810360408301526173dd81866172de565b90506173ec606083018561738c565b6173f96080830184616411565b9695505050505050565b60008151905061741281615cb8565b92915050565b60006020828403121561742e5761742d6159aa565b5b600061743c84828501617403565b91505092915050565b600060c082019050818103600083015261745f818961712b565b9050818103602083015261747381886171e9565b9050818103604083015261748781876172de565b9050617496606083018661738c565b6174a36080830185616411565b6174b060a0830184615a79565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006174f582615a6f565b915061750083615a6f565b9250828201905080821115617518576175176174bb565b5b92915050565b60006040820190506175336000830185615a79565b6175406020830184615a79565b9392505050565b600060608201905061755c6000830186616411565b6175696020830185615a79565b6175766040830184616e3b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026175e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826175a3565b6175ea86836175a3565b95508019841693508086168417925050509392505050565b600061761d61761861761384615a6f565b616d78565b615a6f565b9050919050565b6000819050919050565b61763783617602565b61764b61764382617624565b8484546175b0565b825550505050565b600090565b617660617653565b61766b81848461762e565b505050565b5b8181101561768f57617684600082617658565b600181019050617671565b5050565b601f8211156176d4576176a58161757e565b6176ae84617593565b810160208510156176bd578190505b6176d16176c985617593565b830182617670565b50505b505050565b600082821c905092915050565b60006176f7600019846008026176d9565b1980831691505092915050565b600061771083836176e6565b9150826002028217905092915050565b61772982615def565b67ffffffffffffffff81111561774257617741615b83565b5b61774c8254616f38565b617757828285617693565b600060209050601f83116001811461778a5760008415617778578287015190505b6177828582617704565b8655506177ea565b601f1984166177988661757e565b60005b828110156177c05784890151825560018201915060208501945060208101905061779b565b868310156177dd57848901516177d9601f8916826176e6565b8355505b6001600288020188555050505b505050505050565b60006177fd82615a6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361782f5761782e6174bb565b5b600182019050919050565b600061784582615a6f565b915061785083615a6f565b925082820261785e81615a6f565b91508282048414831517617875576178746174bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006178b682615a6f565b91506178c183615a6f565b9250826178d1576178d061787c565b5b828204905092915050565b60006178e782615a6f565b91506178f283615a6f565b925082820390508181111561790a576179096174bb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152617959818761712b565b9050818103602083015261796d81866171e9565b9050818103604083015261798181856172de565b90506179906060830184616411565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006179f5602683615dfa565b9150617a0082617999565b604082019050919050565b60006020820190508181036000830152617a24816179e8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617a87602783615dfa565b9150617a9282617a2b565b604082019050919050565b60006020820190508181036000830152617ab681617a7a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000617b19602683615dfa565b9150617b2482617abd565b604082019050919050565b60006020820190508181036000830152617b4881617b0c565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000617bab602383615dfa565b9150617bb682617b4f565b604082019050919050565b60006020820190508181036000830152617bda81617b9e565b9050919050565b6000608082019050617bf66000830187615a79565b617c036020830186616e3b565b617c106040830185615a79565b8181036060830152617c228184615e35565b905095945050505050565b600060a082019050617c426000830188615a79565b617c4f6020830187616e3b565b617c5c6040830186615a79565b8181036060830152617c6e8185615e35565b90508181036080830152617c828184616851565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617d10604383615dfa565b9150617d1b82617c8e565b606082019050919050565b60006020820190508181036000830152617d3f81617d03565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617d7c602083615dfa565b9150617d8782617d46565b602082019050919050565b60006020820190508181036000830152617dab81617d6f565b9050919050565b617dbb81615a39565b8114617dc657600080fd5b50565b600081519050617dd881617db2565b92915050565b600060208284031215617df457617df36159aa565b5b6000617e0284828501617dc9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617e41602083615dfa565b9150617e4c82617e0b565b602082019050919050565b60006020820190508181036000830152617e7081617e34565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617ed3603183615dfa565b9150617ede82617e77565b604082019050919050565b60006020820190508181036000830152617f0281617ec6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617f65602183615dfa565b9150617f7082617f09565b604082019050919050565b60006020820190508181036000830152617f9481617f58565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617fd1601883615dfa565b9150617fdc82617f9b565b602082019050919050565b6000602082019050818103600083015261800081617fc4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000618063602183615dfa565b915061806e82618007565b604082019050919050565b6000602082019050818103600083015261809281618056565b9050919050565b600067ffffffffffffffff82169050919050565b60006180b882618099565b91506180c383618099565b9250828201905067ffffffffffffffff8111156180e3576180e26174bb565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061813182615def565b61813b8185618115565b935061814b818560208601615e0b565b61815481615b72565b840191505092915050565b600061816b8383618126565b905092915050565b6000602082019050919050565b600061818b826180e9565b61819581856180f4565b9350836020820285016181a785618105565b8060005b858110156181e357848403895281516181c4858261815f565b94506181cf83618173565b925060208a019950506001810190506181ab565b50829750879550505050505092915050565b600061821061820b61820684618099565b616d78565b615a6f565b9050919050565b618220816181f5565b82525050565b60006101208201905061823c600083018c615a79565b618249602083018b6160c5565b818103604083015261825b818a61712b565b9050818103606083015261826f81896171e9565b905081810360808301526182838188618180565b905081810360a083015261829781876172de565b90506182a660c0830186618217565b6182b360e0830185618217565b8181036101008301526182c68184615e35565b90509a9950505050505050505050565b60006040820190506182eb60008301856160c5565b6182f86020830184615a79565b9392505050565b600060408201905061831460008301856160c5565b61832160208301846160c5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618384602783615dfa565b915061838f82618328565b604082019050919050565b600060208201905081810360008301526183b381618377565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006183f0600283616fa4565b91506183fb826183ba565b600282019050919050565b6000819050919050565b61842161841c82615cae565b618406565b82525050565b6000618432826183e3565b915061843e8285618410565b60208201915061844e8284618410565b6020820191508190509392505050565b60006080820190506184736000830187616411565b6184806020830186616e3b565b61848d6040830185616411565b61849a6060830184616411565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006184d9601883615dfa565b91506184e4826184a3565b602082019050919050565b60006020820190508181036000830152618508816184cc565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618545601f83615dfa565b91506185508261850f565b602082019050919050565b6000602082019050818103600083015261857481618538565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006185d7602283615dfa565b91506185e28261857b565b604082019050919050565b60006020820190508181036000830152618606816185ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618669602283615dfa565b91506186748261860d565b604082019050919050565b600060208201905081810360008301526186988161865c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006186fb602783615dfa565b91506187068261869f565b604082019050919050565b6000602082019050818103600083015261872a816186ee565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061878d603583615dfa565b915061879882618731565b604082019050919050565b600060208201905081810360008301526187bc81618780565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006187f9601d83615dfa565b9150618804826187c3565b602082019050919050565b60006020820190508181036000830152618828816187ec565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061888b602683615dfa565b91506188968261882f565b604082019050919050565b600060208201905081810360008301526188ba8161887e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061891d602683615dfa565b9150618928826188c1565b604082019050919050565b6000602082019050818103600083015261894c81618910565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618989601d83615dfa565b915061899482618953565b602082019050919050565b600060208201905081810360008301526189b88161897c565b9050919050565b60006189ca82616835565b6189d48185616df2565b93506189e4818560208601615e0b565b80840191505092915050565b60006189fc82846189bf565b915081905092915050565b600060a082019050618a1c6000830188616411565b618a296020830187616411565b618a366040830186616411565b618a436060830185615a79565b618a5060808301846160c5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220dd4edfac69a6afd6aeac0d468ddba6cc40c7263f1a78654ed0f9586c5980bfef64736f6c63430008110033", "devdoc": { "errors": { "Empty()": [ @@ -2229,7 +2279,7 @@ "type": "t_address" }, { - "astId": 8561, + "astId": 8563, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectId", "offset": 0, @@ -2237,7 +2287,7 @@ "type": "t_uint256" }, { - "astId": 8563, + "astId": 8565, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "lastTimeStamp", "offset": 0, @@ -2245,7 +2295,7 @@ "type": "t_uint256" }, { - "astId": 8565, + "astId": 8567, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "daoPercentage", "offset": 0, @@ -2253,27 +2303,19 @@ "type": "t_uint256" }, { - "astId": 8567, + "astId": 8569, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "enteranceFee", "offset": 0, "slot": "16", "type": "t_uint256" }, - { - "astId": 8569, - "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "projectOwners", - "offset": 0, - "slot": "17", - "type": "t_address_payable" - }, { "astId": 8573, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_isFunding", "offset": 0, - "slot": "18", + "slot": "17", "type": "t_mapping(t_uint256,t_bool)" }, { @@ -2281,7 +2323,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectToTime", "offset": 0, - "slot": "19", + "slot": "18", "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))" }, { @@ -2289,7 +2331,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "time", "offset": 0, - "slot": "20", + "slot": "19", "type": "t_mapping(t_uint256,t_uint256)" }, { @@ -2297,7 +2339,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "hashToProjectId", "offset": 0, - "slot": "21", + "slot": "20", "type": "t_mapping(t_string_memory_ptr,t_uint256)" }, { @@ -2305,7 +2347,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "idToHash", "offset": 0, - "slot": "22", + "slot": "21", "type": "t_mapping(t_uint256,t_string_storage)" }, { @@ -2313,7 +2355,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "funders", "offset": 0, - "slot": "23", + "slot": "22", "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" }, { @@ -2321,7 +2363,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectFunds", "offset": 0, - "slot": "24", + "slot": "23", "type": "t_mapping(t_uint256,t_uint256)" }, { @@ -2329,7 +2371,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectFundingGoalAmount", "offset": 0, - "slot": "25", + "slot": "24", "type": "t_mapping(t_uint256,t_uint256)" }, { @@ -2337,7 +2379,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_isApporovedByDao", "offset": 0, - "slot": "26", + "slot": "25", "type": "t_mapping(t_uint256,t_bool)" }, { @@ -2345,7 +2387,7 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectOwnerAddress", "offset": 0, - "slot": "27", + "slot": "26", "type": "t_mapping(t_uint256,t_address)" }, { @@ -2353,15 +2395,15 @@ "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_ProjectFundingStatus", "offset": 0, - "slot": "28", - "type": "t_mapping(t_uint256,t_enum(ProjectFundingStatus)8558)" + "slot": "27", + "type": "t_mapping(t_uint256,t_enum(ProjectFundingStatus)8560)" }, { - "astId": 9117, + "astId": 8622, "contract": "contracts/GovernerContract.sol:GovernerContract", - "label": "inWhiteList", + "label": "_isEnteranceFeePaid", "offset": 0, - "slot": "29", + "slot": "28", "type": "t_mapping(t_address,t_bool)" } ], @@ -2371,11 +2413,6 @@ "label": "address", "numberOfBytes": "20" }, - "t_address_payable": { - "encoding": "inplace", - "label": "address payable", - "numberOfBytes": "20" - }, "t_array(t_struct(Checkpoint)4571_storage)dyn_storage": { "base": "t_struct(Checkpoint)4571_storage", "encoding": "dynamic_array", @@ -2397,7 +2434,7 @@ "label": "contract TimelockController", "numberOfBytes": "20" }, - "t_enum(ProjectFundingStatus)8558": { + "t_enum(ProjectFundingStatus)8560": { "encoding": "inplace", "label": "enum FundProject.ProjectFundingStatus", "numberOfBytes": "1" @@ -2456,12 +2493,12 @@ "numberOfBytes": "32", "value": "t_bytes32" }, - "t_mapping(t_uint256,t_enum(ProjectFundingStatus)8558)": { + "t_mapping(t_uint256,t_enum(ProjectFundingStatus)8560)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => enum FundProject.ProjectFundingStatus)", "numberOfBytes": "32", - "value": "t_enum(ProjectFundingStatus)8558" + "value": "t_enum(ProjectFundingStatus)8560" }, "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { "encoding": "mapping", diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json index 318fbc0..89ec30a 100644 --- a/deployments/localhost/TimeLock.json +++ b/deployments/localhost/TimeLock.json @@ -875,7 +875,7 @@ "transactionIndex": 0, "gasUsed": "3021451", "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000000000001000000000000000000000200000010200000000000000000000000000010000000000000000000000000000000000001000000000040020000400000000100800800000004000000000000020000000000000000000000000000000000000000000000000000000000080000000200000000000000000020000000000000000000000000000000000000001000000000000000000040000000204000000000000000000200002008000100000100200020000000000000001000000000000000000000000000000000000000000000000000", - "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72", + "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf", "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", "logs": [ { @@ -891,7 +891,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" + "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" }, { "transactionIndex": 0, @@ -906,7 +906,7 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" + "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" }, { "transactionIndex": 0, @@ -921,7 +921,7 @@ ], "data": "0x", "logIndex": 2, - "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" + "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" }, { "transactionIndex": 0, @@ -936,7 +936,7 @@ ], "data": "0x", "logIndex": 3, - "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" + "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" }, { "transactionIndex": 0, @@ -951,7 +951,7 @@ ], "data": "0x", "logIndex": 4, - "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" + "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" }, { "transactionIndex": 0, @@ -966,7 +966,7 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" + "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" }, { "transactionIndex": 0, @@ -978,7 +978,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 6, - "blockHash": "0xf1c49b90c11610f8f2c4a242eed609dd4a2279a0039e83ab83bdf4039de1bc72" + "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" } ], "blockNumber": 1, diff --git a/deployments/localhost/solcInputs/f3989c9674956bada0a1ffc4cf72c075.json b/deployments/localhost/solcInputs/3cf270c0d0efd91caec1ecd679be00ea.json similarity index 94% rename from deployments/localhost/solcInputs/f3989c9674956bada0a1ffc4cf72c075.json rename to deployments/localhost/solcInputs/3cf270c0d0efd91caec1ecd679be00ea.json index 7dfae5b..ee6eb20 100644 --- a/deployments/localhost/solcInputs/f3989c9674956bada0a1ffc4cf72c075.json +++ b/deployments/localhost/solcInputs/3cf270c0d0efd91caec1ecd679be00ea.json @@ -2,7 +2,7 @@ "language": "Solidity", "sources": { "contracts/FundProject.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n error FundProject__NotApporovedByDao();\n error FundProject__UpkeepNeeded();\n error FundProject__TransferFailed(uint256 _projectId);\n error FundProject__NotEnoughPayment();\n error FundProject__withdrawFund();\n error FundProject__WithdrawTransferFailed();\n\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n address payable projectOwners;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n projectId++;\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (\n bool upkeepNeeded,\n bytes memory /* performData */\n )\n {\n upkeepNeeded = (_isFunding[projectId] &&\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\n projectToTime[projectId][time[projectId]]);\n }\n\n function performUpkeep(\n bytes calldata /* performData */\n ) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n _isFunding[projectId] = false;\n _isApporovedByDao[projectId] = false;\n\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\n 100;\n (bool success, ) = (projectOwnerAddress[projectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[projectId]);\n }\n\n emit projectSuccessfullyFunded(projectId);\n } else {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(projectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value > enteranceFee) {\n projectOwners = payable(msg.sender);\n } else {\n revert FundProject__NotEnoughPayment();\n }\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\n\nerror FundProject__NotApporovedByDao();\nerror FundProject__UpkeepNeeded();\nerror FundProject__TransferFailed(uint256 _projectId);\nerror FundProject__NotEnoughPayment();\nerror FundProject__withdrawFund();\nerror FundProject__WithdrawTransferFailed();\nerror FundProject__EnteranceFeeNeeded();\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n mapping(address => bool) public _isEnteranceFeePaid;\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n event enteranceFeePaid(address indexed _projectOwner);\n event projectGoesToFunding(uint256 indexed _projectId);\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call it\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\n revert FundProject__EnteranceFeeNeeded();\n } else {\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n emit projectGoesToFunding(projectId);\n projectId++;\n }\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call it\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (\n bool upkeepNeeded,\n bytes memory /* performData */\n )\n {\n upkeepNeeded = (_isFunding[projectId] &&\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\n projectToTime[projectId][time[projectId]]);\n }\n\n function performUpkeep(\n bytes calldata /* performData */\n ) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n _isFunding[projectId] = false;\n _isApporovedByDao[projectId] = false;\n\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\n 100;\n (bool success, ) = (projectOwnerAddress[projectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[projectId]);\n }\n\n emit projectSuccessfullyFunded(projectId);\n } else {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(projectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value < enteranceFee) {\n revert FundProject__NotEnoughPayment();\n } else {\n _isEnteranceFeePaid[msg.sender] = true;\n emit enteranceFeePaid(msg.sender);\n }\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n\n function isEnteranceFeePaid(address account) public view returns (bool) {\n return _isEnteranceFeePaid[account];\n }\n}\n" }, "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" @@ -20,16 +20,13 @@ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AutomationCompatibleInterface {\n /**\n * @notice method that is simulated by the keepers to see if any work actually\n * needs to be performed. This method does does not actually need to be\n * executable, and since it is only ever simulated it can consume lots of gas.\n * @dev To ensure that it is never called, you may want to add the\n * cannotExecute modifier from KeeperBase to your implementation of this\n * method.\n * @param checkData specified in the upkeep registration so it is always the\n * same for a registered upkeep. This can easily be broken down into specific\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\n * same contract and easily differentiated by the contract.\n * @return upkeepNeeded boolean to indicate whether the keeper should call\n * performUpkeep or not.\n * @return performData bytes that the keeper should call performUpkeep with, if\n * upkeep is needed. If you would like to encode data to decode later, try\n * `abi.encode`.\n */\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\n\n /**\n * @notice method that is actually executed by the keepers, via the registry.\n * The data returned by the checkUpkeep simulation will be passed into\n * this method to actually be executed.\n * @dev The input to this method should not be trusted, and the caller of the\n * method should not even be restricted to any single registry. Anyone should\n * be able call it, and the input should be validated, there is no guarantee\n * that the data passed in is the performData returned from checkUpkeep. This\n * could happen due to malicious keepers, racing keepers, or simply a state\n * change while the performUpkeep transaction is waiting for confirmation.\n * Always validate the data passed in.\n * @param performData is the data which was passed back from the checkData\n * simulation. If it is encoded, it can easily be decoded into other types by\n * calling `abi.decode`. This data should not be trusted, and should be\n * validated against the contract's current state.\n */\n function performUpkeep(bytes calldata performData) external;\n}\n" }, "contracts/GovernerContract.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\nimport \"./FundProject.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl,\n FundProject\n{\n error GovernerContract__NotApporovedByDaoFoundation();\n\n mapping(address => bool) public inWhiteList;\n\n modifier isSubmitFeePaid() {\n paySubmitFee();\n _;\n }\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage,\n uint256 _enteranceFee,\n uint256 _daoPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n FundProject(_enteranceFee, _daoPercentage)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) isSubmitFeePaid returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\nimport \"./FundProject.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl,\n FundProject\n{\n error GovernerContract__NeedEnteranceFee();\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage,\n uint256 _enteranceFee,\n uint256 _daoPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n FundProject(_enteranceFee, _daoPercentage)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n if (!_isEnteranceFeePaid[msg.sender]) {\n revert GovernerContract__NeedEnteranceFee();\n }\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" }, "@openzeppelin/contracts/governance/Governor.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" }, "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" @@ -37,54 +34,48 @@ "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" }, "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" }, - "@openzeppelin/contracts/utils/Timers.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" - }, "@openzeppelin/contracts/governance/IGovernor.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" }, - "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" + "@openzeppelin/contracts/utils/Timers.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" }, "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, - "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" + "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" }, - "@openzeppelin/contracts/utils/math/SafeCast.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, "@openzeppelin/contracts/utils/introspection/ERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + }, "@openzeppelin/contracts/utils/introspection/IERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" }, "@openzeppelin/contracts/utils/Strings.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 Strings {\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" }, - "@openzeppelin/contracts/utils/Checkpoints.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" - }, "@openzeppelin/contracts/governance/TimelockController.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, @@ -96,6 +87,15 @@ }, "@openzeppelin/contracts/access/IAccessControl.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + }, + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" + }, + "@openzeppelin/contracts/utils/Checkpoints.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" } }, "settings": { diff --git a/proposals.json b/proposals.json index 3b80a80..a21139c 100644 --- a/proposals.json +++ b/proposals.json @@ -1 +1 @@ -{"31337":["99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927"]} \ No newline at end of file +{"31337":["99966883216571458440169013809788587697246968345487969070787258353943787317927"]} \ No newline at end of file diff --git a/scripts/queue-and-execute-afterSubmit.js b/scripts/queue-and-execute-afterSubmit.js index 5e3ff1d..d8ff972 100644 --- a/scripts/queue-and-execute-afterSubmit.js +++ b/scripts/queue-and-execute-afterSubmit.js @@ -1,12 +1,10 @@ const { ethers, network } = require("hardhat"); const { FUNC_FUND, - NEW_VALUE, - PROPOSAL_DESCRIPTION, developmentChains, - VOTING_DELAY, - proposalsFile, MIN_DELAY, + s_fundRaisingGoalAmount, + s_fundingTime, } = require("../helper-config"); const { moveBlocks } = require("../utils/move-blocks"); const { moveTime } = require("../utils/move-time"); @@ -15,13 +13,13 @@ const fs = require("fs"); async function queue_and_execute_afterSubmit() { const proposalDescription = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; - const fundProjectContract = await ethers.getContract("FundProject"); - let projectId = await fundProjectContract._getProjectId(args); - console.log(projectId.toString()); - console.log(await fundProjectContract._isapporoveFundingByDao(projectId)); + const nodeAccount2 = "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"; // account2 from node + + const fundProjectContract = await ethers.getContract("GovernerContract"); + const encodedFunctionCall = fundProjectContract.interface.encodeFunctionData( FUNC_FUND, - [args] + [args, s_fundRaisingGoalAmount, s_fundingTime, nodeAccount2] ); const descriptionHash = ethers.utils.keccak256( ethers.utils.toUtf8Bytes(proposalDescription) @@ -50,10 +48,11 @@ async function queue_and_execute_afterSubmit() { descriptionHash ); await executeTx.wait(1); + console.log("Executed!"); - projectId = await fundProjectContract._getProjectId(args); - console.log(projectId.toString()); - console.log(await fundProjectContract._isapporoveFundingByDao(projectId)); + let projectId = await governor._getProjectId(args); + console.log(`ProjectID = ${projectId.toString()}`); + console.log(await governor._isApporoveFundingByDao(projectId)); } queue_and_execute_afterSubmit() diff --git a/scripts/submit_and_propose.js b/scripts/submit_and_propose.js index 669c33e..55415f7 100644 --- a/scripts/submit_and_propose.js +++ b/scripts/submit_and_propose.js @@ -2,7 +2,6 @@ const { ethers, network } = require("hardhat"); const { storeImages, storeProjectData } = require("./uploadToPinata"); const fs = require("fs"); const { - s_projectID, s_projectName, s_website, s_description, @@ -10,9 +9,6 @@ const { s_fundRaisingGoalAmount, s_roadMap, s_otherSources, - FUNC, - NEW_VALUE, - PROPOSAL_DESCRIPTION, developmentChains, VOTING_DELAY, proposalsFile, @@ -81,7 +77,7 @@ async function submitAndPropose( const proposalDescription = ProjectMetadataUploadResponse.IpfsHash; const nodeAccount2 = "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"; // account2 from node - const governor = await ethers.getContract("GovernerContract"); + const governor = await ethers.getContract("GovernerContract", nodeAccount2); const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; @@ -98,7 +94,9 @@ async function submitAndPropose( ethers.utils.formatEther(await ethers.provider.getBalance(nodeAccount2)) ); */ - const options = { value: ethers.utils.parseEther("1.0") }; + + const payFee = await governor.paySubmitFee({ value: enteranceFee }); + await payFee.wait(1); const proposalTx = await governor.propose( [governor.address], diff --git a/test/unit/dao.test.js b/test/unit/dao.test.js index 917eb7e..d3dd1d0 100644 --- a/test/unit/dao.test.js +++ b/test/unit/dao.test.js @@ -1,17 +1,14 @@ const { ethers, deployments, getNamedAccounts, network } = require("hardhat"); - const { assert, expect } = require("chai"); - const { - FUNC, - NEW_VALUE, - PROPOSAL_DESCRIPTION, + FUNC_FUND, developmentChains, VOTING_DELAY, - proposalsFile, VOTING_PERIOD, MIN_DELAY, INITIAL_SUPPLY, + s_fundingTime, + s_fundRaisingGoalAmount, } = require("../../helper-config"); const { moveBlocks } = require("../../utils/move-blocks"); const { moveTime } = require("../../utils/move-time"); @@ -24,14 +21,16 @@ const fs = require("fs"); account1, account2, account3, + projectOwner, governor, timeLock, - box, + fund, blockNumber; beforeEach(async function () { account1 = (await ethers.getSigners())[1]; account2 = (await ethers.getSigners())[2]; account3 = (await ethers.getSigners())[3]; + projectOwner = (await ethers.getSigners())[4]; deployer = (await getNamedAccounts()).deployer; await deployments.fixture("all"); @@ -44,39 +43,14 @@ const fs = require("fs"); it("was deployed", async () => { assert(gtToken.address); + assert(governor.address); assert(timeLock.address); }); - it("Only Owner can mint token", async () => { - // console.log((await gtToken.balanceOf(deployer)).toString()); - - const tx = await gtToken.mintToken( - deployer, - ethers.BigNumber.from("1000000000000000000000000") - ); - await tx.wait(1); + it("Only Dao can mint token", async () => {}); - // console.log((await gtToken.balanceOf(deployer)).toString()); - - expect((await gtToken.balanceOf(deployer)).toString()).to.equal( - "2000000000000000000000000" - ); - gtToken = await ethers.getContract("GovernanceToken", account1.address); - - await expect( - gtToken.mintToken( - account1.address, - ethers.BigNumber.from("1000000000000000000000000") - ) - ).to.be.revertedWith("Ownable: caller is not the owner"); - }); - - it("can only be changed through governance", async () => { - await expect(box.store(55)).to.be.revertedWith( - "Ownable: caller is not the owner" - ); - }); + it("can only be changed through governance", async () => {}); //-------------------------------------------------------------------------------- @@ -153,16 +127,35 @@ const fs = require("fs"); blockNumber - 1 )}` ); + const letsTry = await ethers.getContract( + "GovernanceToken", + projectOwner + ); + const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; + const encodedFunctionCall = governor.interface.encodeFunctionData( + FUNC_FUND, + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner.address] + ); - const encodedFunctionCall = box.interface.encodeFunctionData(FUNC, [ - NEW_VALUE, - ]); + const enteranceFee = await governor.getEnteranceFee(); + + /* await expect( + governor.propose( + [governor.address], + [0], + [encodedFunctionCall], + args + ) + ).to.be.revertedWith(`GovernerContract__NeedEnteranceFee`); */ + + const payFee = await governor.paySubmitFee({ value: enteranceFee }); + await payFee.wait(1); const proposalTx = await governor.propose( - [box.address], + [governor.address], [0], [encodedFunctionCall], - PROPOSAL_DESCRIPTION + args ); const proposeReceipt = await proposalTx.wait(1); @@ -175,7 +168,6 @@ const fs = require("fs"); const deadline = await governor.proposalDeadline(proposalId); console.log(`Proposal deadline on block ${deadline.toString()}`); - console.log(`Current Proposal State: ${proposalState}`); /* enum ProposalState { Pending, Active, @@ -270,7 +262,7 @@ const fs = require("fs"); await moveBlocks(VOTING_PERIOD + 1); proposalState = await governor.state(proposalId); - console.log(`Current Proposal State: ${proposalState}`); + // console.log(`Current Proposal State: ${proposalState}`); // getting to results const { againstVotes, forVotes, abstainVotes } = @@ -288,12 +280,12 @@ const fs = require("fs"); // its time to queue & execute const descriptionHash = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(PROPOSAL_DESCRIPTION) + ethers.utils.toUtf8Bytes(args) ); governor = await ethers.getContract("GovernerContract"); console.log("Queueing..."); const queueTx = await governor.queue( - [box.address], + [governor.address], [0], [encodedFunctionCall], descriptionHash @@ -303,15 +295,12 @@ const fs = require("fs"); await moveBlocks(1); console.log("Executing..."); const executeTx = await governor.execute( - [box.address], + [governor.address], [0], [encodedFunctionCall], descriptionHash ); await executeTx.wait(1); - const boxNewValue = await box.retrieve(); - console.log(`New Box Value: ${boxNewValue.toString()}`); - assert.equal(boxNewValue.toString(), "77"); }); it("Result of voting against", async () => { @@ -352,15 +341,26 @@ const fs = require("fs"); blockNumber = await ethers.provider.getBlockNumber(); - const encodedFunctionCall = box.interface.encodeFunctionData(FUNC, [ - NEW_VALUE, - ]); + const letsTry = await ethers.getContract( + "GovernanceToken", + projectOwner + ); + const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; + const encodedFunctionCall = governor.interface.encodeFunctionData( + FUNC_FUND, + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner.address] + ); + + const enteranceFee = await governor.getEnteranceFee(); + + const payFee = await governor.paySubmitFee({ value: enteranceFee }); + await payFee.wait(1); const proposalTx = await governor.propose( - [box.address], + [governor.address], [0], [encodedFunctionCall], - PROPOSAL_DESCRIPTION + args ); const proposeReceipt = await proposalTx.wait(1); @@ -427,14 +427,14 @@ const fs = require("fs"); // its time to queue & execute const descriptionHash = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(PROPOSAL_DESCRIPTION) + ethers.utils.toUtf8Bytes(args) ); governor = await ethers.getContract("GovernerContract"); console.log("Queueing..."); await expect( governor.queue( - [box.address], + [governor.address], [0], [encodedFunctionCall], descriptionHash @@ -446,15 +446,12 @@ const fs = require("fs"); await expect( governor.execute( - [box.address], + [governor.address], [0], [encodedFunctionCall], descriptionHash ) ).to.be.revertedWith("Governor: proposal not successful"); - - const boxNewValue = await box.retrieve(); - assert.equal(boxNewValue.toString(), "0"); }); }); //******************************************************************************** */ diff --git a/test/unit/fundProjectContract.test.js b/test/unit/fundProjectContract.test.js deleted file mode 100644 index d2f14b4..0000000 --- a/test/unit/fundProjectContract.test.js +++ /dev/null @@ -1,450 +0,0 @@ -const { ethers, deployments, getNamedAccounts, network } = require("hardhat"); -const { assert, expect } = require("chai"); - -const { - FUNC_FUND, - NEW_VALUE, - PROPOSAL_DESCRIPTION, - developmentChains, - VOTING_DELAY, - proposalsFile, - VOTING_PERIOD, - MIN_DELAY, - FUNC_CANCEL_APPOROVEL, -} = require("../../helper-config"); -const { moveBlocks } = require("../../utils/move-blocks"); -const { moveTime } = require("../../utils/move-time"); -const fs = require("fs"); - -!developmentChains.includes(network.name) - ? describe.skip - : describe("Unit tests of fundingContract", () => { - let gtToken, - account1, - account2, - account3, - investor, - governor, - timeLock, - fundProjectContract, - blockNumber; - - beforeEach(async function () { - account1 = (await ethers.getSigners())[1]; - account2 = (await ethers.getSigners())[2]; - account3 = (await ethers.getSigners())[3]; - investor = (await ethers.getSigners())[4]; - deployer = (await getNamedAccounts()).deployer; - - await deployments.fixture("all"); - gtToken = await ethers.getContract("GovernanceToken"); - governor = await ethers.getContract("GovernerContract"); - timeLock = await ethers.getContract("TimeLock"); - fundProjectContract = await ethers.getContract("FundProject"); - - gtToken = await ethers.getContract("GovernanceToken", deployer); - }); - - it("was deployed", async () => { - assert(fundProjectContract.address); - }); - - describe("proposes after submit ", async () => { - it("Create a purposal make a vote", async () => { - let tx1 = await gtToken.transfer( - account1.address, - ethers.utils.parseEther("500000") - ); - tx1 = await gtToken.transfer( - account2.address, - ethers.utils.parseEther("300000") - ); - tx1 = await gtToken.transfer( - account3.address, - ethers.utils.parseEther("100000") - ); - - await tx1.wait(1); - - console.log( - `Account1 balance= ${ethers.utils - .formatEther(await gtToken.balanceOf(account1.address)) - .toString()}` - ); - console.log( - `Account2 balance= ${ethers.utils - .formatEther(await gtToken.balanceOf(account2.address)) - .toString()}` - ); - - console.log( - `Account3 balance= ${ethers.utils - .formatEther(await gtToken.balanceOf(account3.address)) - .toString()}` - ); - - gtToken = await ethers.getContract( - "GovernanceToken", - account1.address - ); - tx1 = await gtToken.delegate(account1.address); - await tx1.wait(1); - gtToken = await ethers.getContract( - "GovernanceToken", - account2.address - ); - tx1 = await gtToken.delegate(account2.address); - gtToken = await ethers.getContract( - "GovernanceToken", - account3.address - ); - tx1 = await gtToken.delegate(account3.address); - await tx1.wait(1); - - moveBlocks(1); - - blockNumber = await ethers.provider.getBlockNumber(); - console.log( - `account1 voting power : ${await governor.getVotes( - account1.address, - blockNumber - 1 - )}` - ); - console.log( - `account2 voting power : ${await governor.getVotes( - account2.address, - blockNumber - 1 - )}` - ); - console.log( - `account3 voting power : ${await governor.getVotes( - account3.address, - blockNumber - 1 - )}` - ); - const fundRaisingAmount = "1000"; - const proposalDescription = - "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; - const encodedFunctionCall = - fundProjectContract.interface.encodeFunctionData(FUNC_FUND, [ - proposalDescription, - fundRaisingAmount, - ]); - - const proposalTx = await governor.propose( - [fundProjectContract.address], - [0], - [encodedFunctionCall], - proposalDescription - ); - const proposeReceipt = await proposalTx.wait(1); - - console.log( - `Purposal start Block number= ${await ethers.provider.getBlockNumber()}` - ); - const proposalId = proposeReceipt.events[0].args.proposalId; - let proposalState = await governor.state(proposalId); - - const deadline = await governor.proposalDeadline(proposalId); - console.log(`Proposal deadline on block ${deadline.toString()}`); - - console.log(`Current Proposal State: ${proposalState}`); - /* enum ProposalState { - Pending, - Active, - Canceled, - Defeated, - Succeeded, - Queued, - Expired, - Executed - } */ - expect(proposalState == 1); - - await moveBlocks(VOTING_DELAY + 1); - blockNumber = await ethers.provider.getBlockNumber(); - - console.log( - `account1 voting power : ${await governor.getVotes( - account1.address, - blockNumber - 1 - )}` - ); - console.log( - `account2 voting power : ${await governor.getVotes( - account2.address, - blockNumber - 1 - )}` - ); - console.log( - `account3 voting power : ${await governor.getVotes( - account3.address, - blockNumber - 1 - )}` - ); - - console.log( - `after voting delay Block number= ${await ethers.provider.getBlockNumber()}` - ); - - // connect with account1 - governor = await ethers.getContract( - "GovernerContract", - account1.address - ); - // voting... - // 0 = Against, 1 = For, 2 = Abstain - let voteTxResponse = await governor.castVote(proposalId, 1); - await voteTxResponse.wait(1); - console.log( - `after voting account1 Block number= ${await ethers.provider.getBlockNumber()}` - ); - /* const hasVoted = await governor.hasVoted( - proposalId, - account1.address - ); - console.log(`account1 hasVoted: ${hasVoted}`); */ - - console.log( - `after voting period Block number= ${await ethers.provider.getBlockNumber()}` - ); - - // voting with account 2 ************************************************ - - // connect with account2 - const governor1 = await ethers.getContract( - "GovernerContract", - account2.address - ); - - const voteTxResponse1 = await governor1.castVote(proposalId, 0); - await voteTxResponse1.wait(1); - console.log( - `after voting account2 Block number= ${await ethers.provider.getBlockNumber()}` - ); - - /* const hasVoted2 = await governor.hasVoted( - proposalId, - account2.address - ); - console.log(`account2 hasVoted: ${hasVoted2}`); */ - - // account3 is voting ********************************************************** */ - // connect with account3 - governor = await ethers.getContract( - "GovernerContract", - account3.address - ); - // voting... - // 0 = Against, 1 = For, 2 = Abstain - voteTxResponse = await governor.castVote(proposalId, 1); - - // finish the voting - await moveBlocks(VOTING_PERIOD + 1); - - proposalState = await governor.state(proposalId); - console.log(`Current Proposal State: ${proposalState}`); - - // getting to results - let { againstVotes, forVotes, abstainVotes } = - await governor.proposalVotes(proposalId); - console.log(`ProposalId = ${proposalId}`); - console.log( - `Vote on against: ${ethers.utils.formatEther(againstVotes)}` - ); - console.log(`Vote on for: ${ethers.utils.formatEther(forVotes)}`); - console.log( - `Vote on abstain: ${ethers.utils.formatEther(abstainVotes)}` - ); - - assert.equal(proposalState.toString(), "4"); - - // its time to queue & execute - - const descriptionHash = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(proposalDescription) - ); - governor = await ethers.getContract("GovernerContract"); - console.log("Queueing..."); - - const queueTx = await governor.queue( - [fundProjectContract.address], - [0], - [encodedFunctionCall], - descriptionHash - ); - await queueTx.wait(1); - await moveTime(MIN_DELAY + 1); - await moveBlocks(1); - console.log("Executing..."); - const executeTx = await governor.execute( - [fundProjectContract.address], - [0], - [encodedFunctionCall], - descriptionHash - ); - await executeTx.wait(1); - const projectId = await fundProjectContract._getProjectId( - proposalDescription - ); - console.log("Executed!"); - const fundable = await fundProjectContract._isApporoveFundingByDao( - projectId - ); - - assert(fundable); - - // try to invest - console.log("Trying to invest..."); - const fundProject = await ethers.getContract("FundProject", investor); - const sendValue = ethers.utils.parseEther("0.1"); - - const tx = await fundProject.fund(projectId, { value: sendValue }); - await tx.wait(1); - - const balance = await fundProjectContract._getBalanceOfProject( - projectId - ); - const fundingGoal = await fundProjectContract._getFundingGoalAmount( - projectId - ); - console.log(`Funding goal amount: ${fundingGoal}`); - const balanceInEth = ethers.utils.formatEther(balance); - //console.log(balanceInEth); - assert.equal(balanceInEth, "0.1"); - console.log("Invested!"); - - // try to cancel the apporevel - - const encodedFunctionCallForCancelApprovevel = - fundProjectContract.interface.encodeFunctionData( - FUNC_CANCEL_APPOROVEL, - [projectId] - ); - - const proposalTxCancelApprovevel = await governor.propose( - [fundProjectContract.address], - [0], - [encodedFunctionCallForCancelApprovevel], - proposalDescription - ); - const proposeReceiptCancelApprovel = - await proposalTxCancelApprovevel.wait(1); - - console.log( - `Purposal start Block number= ${await ethers.provider.getBlockNumber()}` - ); - const proposalIdCancel = - proposeReceiptCancelApprovel.events[0].args.proposalId; - proposalState = await governor.state(proposalIdCancel); - console.log(`CancelProposalId = ${proposalIdCancel}`); - const deadlineCancel = await governor.proposalDeadline( - proposalIdCancel - ); - console.log( - `Proposal deadline on block ${deadlineCancel.toString()}` - ); - - console.log(`Current Proposal State: ${proposalState}`); - expect(proposalState == 1); - - await moveBlocks(VOTING_DELAY + 1); - proposalState = await governor.state(proposalIdCancel); - console.log(`Current Proposal State: ${proposalState}`); - // connect with account1 - governor = await ethers.getContract( - "GovernerContract", - account1.address - ); - // voting... - // 0 = Against, 1 = For, 2 = Abstain - voteTxResponse = await governor.castVote(proposalIdCancel, 1); - await voteTxResponse.wait(1); - - // voting with account 2 ************************************************ - - // connect with account2 - governor = await ethers.getContract( - "GovernerContract", - account2.address - ); - - voteTxResponse = await governor1.castVote(proposalIdCancel, 0); - await voteTxResponse.wait(1); - - // account3 is voting ********************************************************** */ - // connect with account3 - governor = await ethers.getContract( - "GovernerContract", - account3.address - ); - // voting... - // 0 = Against, 1 = For, 2 = Abstain - voteTxResponse = await governor.castVote(proposalIdCancel, 1); - - // finish the voting - await moveBlocks(VOTING_PERIOD + 1); - - proposalState = await governor.state(proposalIdCancel); - console.log(`Current Proposal State: ${proposalState}`); - - // getting to results - [againstVotes, forVotes, abstainVotes] = await governor.proposalVotes( - proposalIdCancel - ); - - console.log( - `Vote on against: ${ethers.utils.formatEther(againstVotes)}` - ); - console.log(`Vote on for: ${ethers.utils.formatEther(forVotes)}`); - console.log( - `Vote on abstain: ${ethers.utils.formatEther(abstainVotes)}` - ); - - assert.equal(proposalState.toString(), "4"); - - // its time to queue & execute - - const descriptionHashCancel = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes(proposalDescription) - ); - governor = await ethers.getContract("GovernerContract"); - console.log("Queueing..."); - - const queueTxCancel = await governor.queue( - [fundProjectContract.address], - [0], - [encodedFunctionCallForCancelApprovevel], - descriptionHashCancel - ); - await queueTxCancel.wait(1); - await moveTime(MIN_DELAY + 1); - await moveBlocks(1); - console.log("Executing..."); - const executeTxCancel = await governor.execute( - [fundProjectContract.address], - [0], - [encodedFunctionCallForCancelApprovevel], - descriptionHashCancel - ); - await executeTxCancel.wait(1); - const projectIdCancel = await fundProjectContract._getProjectId( - proposalDescription - ); - console.log("Executed!"); - const fundableCancel = - await fundProjectContract._isApporoveFundingByDao(projectId); - - assert(!fundableCancel); - - assert(await fundProjectContract._getHashOfProjectData(projectId)); - assert(await fundProjectContract._getProjectId(proposalDescription)); - assert(await fundProjectContract._getBalanceOfProject(projectId)); - assert(await fundProjectContract._getFundingGoalAmount(projectId)); - - await expect( - fundProjectContract.fund(projectId + 1, { value: sendValue }) - ).to.be.revertedWith("FundProject__NotApporovedByDao"); - }); - }); - }); From 5ee5a4018c81eee313a4bbe7b7c4b9b35bd9b83d Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Thu, 10 Nov 2022 12:57:17 +0300 Subject: [PATCH 19/28] Add chainlink automation Fix big bug. Add tests V1 --- .gitignore | 5 +- contracts/FundProject.sol | 82 ++- coverage.json | 2 +- coverage/contracts/FundProject.sol.html | 547 ++++++++++++++++-- coverage/contracts/GovernanceToken.sol.html | 52 +- coverage/contracts/GovernerContract.sol.html | 50 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 87 ++- coverage/coverage-final.json | 7 +- coverage/index.html | 40 +- .../contracts/FundProject.sol.html | 547 ++++++++++++++++-- .../contracts/GovernanceToken.sol.html | 52 +- .../contracts/GovernerContract.sol.html | 50 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 87 ++- coverage/lcov-report/index.html | 40 +- coverage/lcov.info | 270 +++++---- deployments/localhost/GovernanceToken.json | 12 +- deployments/localhost/GovernerContract.json | 16 +- deployments/localhost/TimeLock.json | 18 +- ... => e037150c05e743a0afcdb8bf195f828d.json} | 70 +-- ... => edf7a7fc578491be0baac88ac737a638.json} | 54 +- scripts/queue-and-execute-afterSubmit.js | 8 +- test/unit/dao.test.js | 25 +- test/unit/fundContract.test.js | 227 ++++++++ 25 files changed, 1793 insertions(+), 559 deletions(-) rename deployments/localhost/solcInputs/{865f8451b79a875f15c7120a0497c47b.json => e037150c05e743a0afcdb8bf195f828d.json} (95%) rename deployments/localhost/solcInputs/{3cf270c0d0efd91caec1ecd679be00ea.json => edf7a7fc578491be0baac88ac737a638.json} (100%) create mode 100644 test/unit/fundContract.test.js diff --git a/.gitignore b/.gitignore index 26a1e45..5f3851c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,7 @@ artifacts cache node_modules -fetchIpfs.js \ No newline at end of file +propose.js +queue-and-execute.js +submit.js +05-deploy-fundProject.js \ No newline at end of file diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index 4b18d2c..473301f 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@chainlink/contracts/src/v0.8/AutomationCompatible.sol"; +import "hardhat/console.sol"; error FundProject__NotApporovedByDao(); error FundProject__UpkeepNeeded(); @@ -21,6 +22,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { } uint256 public projectId = 1; + uint256 public k_projectId = 1; uint public lastTimeStamp; uint256 public daoPercentage; @@ -32,13 +34,14 @@ contract FundProject is Ownable, AutomationCompatibleInterface { mapping(string => uint256) public hashToProjectId; mapping(uint256 => string) public idToHash; - mapping(uint256 => mapping(address => uint256)) public funders; + mapping(uint256 => mapping(address => uint256)) public funders; // projectId => funderAddress => funderBalance mapping(uint256 => uint256) public projectFunds; mapping(uint256 => uint256) public projectFundingGoalAmount; mapping(uint256 => bool) public _isApporovedByDao; mapping(uint256 => address) public projectOwnerAddress; mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus; mapping(address => bool) public _isEnteranceFeePaid; + mapping(address => uint256[]) public investedProjects; // investor address => investedProjects event projectSuccessfullyFunded(uint256 indexed _projectId); event projectFundingFailed(uint256 indexed _projectId); @@ -64,6 +67,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { { funders[_projecID][msg.sender] += msg.value; projectFunds[_projecID] += msg.value; + investedProjects[msg.sender] = [_projecID]; // need testing } function apporoveFundingByDao( @@ -103,41 +107,48 @@ contract FundProject is Ownable, AutomationCompatibleInterface { public view override - returns ( - bool upkeepNeeded, - bytes memory /* performData */ - ) + returns (bool upkeepNeeded, bytes memory performData) { - upkeepNeeded = (_isFunding[projectId] && - (block.timestamp - projectToTime[projectId][time[projectId]]) > - projectToTime[projectId][time[projectId]]); + for (uint i = 1; i <= projectId; i++) { + bool isFunded = _isFunding[i]; + + console.log("_isFunding= ", _isFunding[i], i); + + bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) > + time[i]; + upkeepNeeded = (isFunded && timePassed); + if (upkeepNeeded) { + performData = abi.encodePacked(i); + console.log(uint256(bytes32(performData))); + break; + } + } } - function performUpkeep( - bytes calldata /* performData */ - ) external override { + function performUpkeep(bytes calldata performData) external override { (bool upkeepNeeded, ) = checkUpkeep(""); if (!upkeepNeeded) { revert FundProject__UpkeepNeeded(); } - _isFunding[projectId] = false; - _isApporovedByDao[projectId] = false; + uint256 ProjectId = uint256(bytes32(performData)); + _isFunding[ProjectId] = false; + _isApporovedByDao[ProjectId] = false; - if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) { - _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS; - uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) / + if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) { + _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS; + uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) / 100; - (bool success, ) = (projectOwnerAddress[projectId]).call{ + (bool success, ) = (projectOwnerAddress[ProjectId]).call{ value: fundsToSent }(""); if (!success) { - revert FundProject__TransferFailed(projectFunds[projectId]); + revert FundProject__TransferFailed(projectFunds[ProjectId]); } - emit projectSuccessfullyFunded(projectId); + emit projectSuccessfullyFunded(ProjectId); } else { - _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED; - emit projectFundingFailed(projectId); + _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.FAILED; + emit projectFundingFailed(ProjectId); } } @@ -223,4 +234,33 @@ contract FundProject is Ownable, AutomationCompatibleInterface { function isEnteranceFeePaid(address account) public view returns (bool) { return _isEnteranceFeePaid[account]; } + + function getFunderBalance(uint256 _projectID) + public + view + returns (uint256) + { + return funders[_projectID][msg.sender]; + } + + function getInvestedProjects(address investor) + public + view + returns (uint256[] memory) + { + return investedProjects[investor]; // need testing + } + + function getDaoPercentage() public view returns (uint256) { + return daoPercentage; + } + + function getTimeleft(uint256 _projectID) + public + view + returns (uint256 a, uint256 b) + { + a = block.timestamp - projectToTime[_projectID][time[_projectID]]; + b = time[_projectID]; + } } diff --git a/coverage.json b/coverage.json index 7b18863..6f162f8 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}},"contracts/FundProject.sol":{"l":{"19":2,"20":1,"21":1,"29":1,"30":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"55":2,"63":1,"71":3,"79":2,"87":2},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":2,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":1,"11":3,"12":2,"13":2},"b":{"1":[1,1]},"f":{"1":2,"2":1,"3":1,"4":1,"5":2,"6":1,"7":3,"8":2,"9":2},"fnMap":{"1":{"name":"isApporovedByDao","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"fund","line":27,"loc":{"start":{"line":24,"column":4},"end":{"line":31,"column":4}}},"3":{"name":"apporoveFundingByDao","line":36,"loc":{"start":{"line":33,"column":4},"end":{"line":43,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"5":{"name":"_isApporoveFundingByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":56,"column":4}}},"6":{"name":"_getHashOfProjectData","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":4}}},"7":{"name":"_getProjectId","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":72,"column":4}}},"8":{"name":"_getBalanceOfProject","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":4}}},"9":{"name":"_getFundingGoalAmount","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":88,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":681}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":50}},"3":{"start":{"line":30,"column":8},"end":{"line":30,"column":43}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":63}},"5":{"start":{"line":39,"column":8},"end":{"line":39,"column":45}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":38}},"7":{"start":{"line":41,"column":8},"end":{"line":41,"column":42}},"8":{"start":{"line":47,"column":8},"end":{"line":47,"column":43}},"9":{"start":{"line":55,"column":8},"end":{"line":55,"column":43}},"10":{"start":{"line":63,"column":8},"end":{"line":63,"column":34}},"11":{"start":{"line":71,"column":8},"end":{"line":71,"column":41}},"12":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"13":{"start":{"line":87,"column":8},"end":{"line":87,"column":50}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}},"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}},"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":4,"64":4,"73":12,"82":29,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":4,"3":4,"4":12,"5":29,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":4,"4":4,"5":12,"6":29,"7":4,"8":4,"9":3,"10":0,"11":6,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/FundProject.sol":{"l":{"50":1,"51":0,"52":1,"56":3,"57":3,"58":3,"66":1,"67":1,"68":1,"78":3,"79":0,"81":3,"82":3,"83":3,"84":3,"85":3,"86":3,"87":3,"88":3,"89":3,"90":3,"91":3,"97":0,"98":0,"99":0,"113":0,"121":0,"122":0,"123":0,"125":0,"126":0,"128":0,"129":0,"130":0,"132":0,"135":0,"136":0,"139":0,"141":0,"142":0,"147":4,"148":0,"150":4,"151":4,"156":1,"157":0,"158":0,"161":0,"162":0,"165":1,"174":2,"182":1,"190":3,"198":0,"206":0,"210":1,"218":1,"222":5,"226":0,"234":1,"242":0,"246":1},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":1,"2":3,"3":3,"4":3,"5":1,"6":1,"7":1,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3,"18":3,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":4,"36":4,"37":4,"38":1,"39":0,"40":0,"41":0,"42":2,"43":1,"44":3,"45":0,"46":0,"47":1,"48":1,"49":5,"50":0,"51":1,"52":0,"53":1},"b":{"1":[0,1],"2":[0,3],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,4],"7":[0,1],"8":[0,0]},"f":{"1":1,"2":3,"3":1,"4":3,"5":0,"6":0,"7":0,"8":4,"9":1,"10":2,"11":1,"12":3,"13":0,"14":0,"15":1,"16":1,"17":5,"18":0,"19":1,"20":0,"21":1},"fnMap":{"1":{"name":"isApporovedByDao","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":53,"column":4}}},"2":{"name":"constructor","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"3":{"name":"fund","line":64,"loc":{"start":{"line":61,"column":4},"end":{"line":69,"column":4}}},"4":{"name":"apporoveFundingByDao","line":76,"loc":{"start":{"line":71,"column":4},"end":{"line":93,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":95,"loc":{"start":{"line":95,"column":4},"end":{"line":100,"column":4}}},"6":{"name":"checkUpkeep","line":102,"loc":{"start":{"line":102,"column":4},"end":{"line":116,"column":4}}},"7":{"name":"performUpkeep","line":118,"loc":{"start":{"line":118,"column":4},"end":{"line":144,"column":4}}},"8":{"name":"paySubmitFee","line":146,"loc":{"start":{"line":146,"column":4},"end":{"line":153,"column":4}}},"9":{"name":"withdrawFund","line":155,"loc":{"start":{"line":155,"column":4},"end":{"line":167,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":169,"loc":{"start":{"line":169,"column":4},"end":{"line":175,"column":4}}},"11":{"name":"_getHashOfProjectData","line":177,"loc":{"start":{"line":177,"column":4},"end":{"line":183,"column":4}}},"12":{"name":"_getProjectId","line":185,"loc":{"start":{"line":185,"column":4},"end":{"line":191,"column":4}}},"13":{"name":"_getBalanceOfProject","line":193,"loc":{"start":{"line":193,"column":4},"end":{"line":199,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":201,"loc":{"start":{"line":201,"column":4},"end":{"line":207,"column":4}}},"15":{"name":"is_funding","line":209,"loc":{"start":{"line":209,"column":4},"end":{"line":211,"column":4}}},"16":{"name":"_getProjectStatus","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"17":{"name":"getEnteranceFee","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":227,"column":4}}},"19":{"name":"getFunderBalance","line":229,"loc":{"start":{"line":229,"column":4},"end":{"line":235,"column":4}}},"20":{"name":"getInvestedProjects","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":243,"column":4}}},"21":{"name":"getDaoPercentage","line":245,"loc":{"start":{"line":245,"column":4},"end":{"line":247,"column":4}}}},"statementMap":{"1":{"start":{"line":50,"column":8},"end":{"line":50,"column":2037}},"2":{"start":{"line":56,"column":8},"end":{"line":56,"column":38}},"3":{"start":{"line":57,"column":8},"end":{"line":57,"column":37}},"4":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}},"5":{"start":{"line":66,"column":8},"end":{"line":66,"column":50}},"6":{"start":{"line":67,"column":8},"end":{"line":67,"column":43}},"7":{"start":{"line":68,"column":8},"end":{"line":68,"column":49}},"8":{"start":{"line":78,"column":8},"end":{"line":78,"column":2806}},"9":{"start":{"line":81,"column":12},"end":{"line":81,"column":60}},"10":{"start":{"line":82,"column":12},"end":{"line":82,"column":77}},"11":{"start":{"line":83,"column":12},"end":{"line":83,"column":34}},"12":{"start":{"line":84,"column":12},"end":{"line":84,"column":67}},"13":{"start":{"line":85,"column":12},"end":{"line":85,"column":49}},"14":{"start":{"line":86,"column":12},"end":{"line":86,"column":42}},"15":{"start":{"line":87,"column":12},"end":{"line":87,"column":64}},"16":{"start":{"line":88,"column":12},"end":{"line":88,"column":46}},"17":{"start":{"line":89,"column":12},"end":{"line":89,"column":39}},"18":{"start":{"line":90,"column":12},"end":{"line":90,"column":48}},"19":{"start":{"line":97,"column":8},"end":{"line":97,"column":43}},"20":{"start":{"line":98,"column":8},"end":{"line":98,"column":36}},"21":{"start":{"line":99,"column":8},"end":{"line":99,"column":71}},"22":{"start":{"line":113,"column":8},"end":{"line":113,"column":4078}},"23":{"start":{"line":121,"column":8},"end":{"line":121,"column":47}},"24":{"start":{"line":122,"column":8},"end":{"line":122,"column":4365}},"25":{"start":{"line":125,"column":8},"end":{"line":125,"column":36}},"26":{"start":{"line":126,"column":8},"end":{"line":126,"column":43}},"27":{"start":{"line":128,"column":8},"end":{"line":128,"column":4538}},"28":{"start":{"line":129,"column":12},"end":{"line":129,"column":74}},"29":{"start":{"line":130,"column":12},"end":{"line":130,"column":4707}},"30":{"start":{"line":132,"column":12},"end":{"line":132,"column":4804}},"31":{"start":{"line":135,"column":12},"end":{"line":135,"column":4923}},"32":{"start":{"line":139,"column":12},"end":{"line":139,"column":53}},"33":{"start":{"line":141,"column":12},"end":{"line":141,"column":73}},"34":{"start":{"line":142,"column":12},"end":{"line":142,"column":48}},"35":{"start":{"line":147,"column":8},"end":{"line":147,"column":5295}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":49}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":45}},"38":{"start":{"line":156,"column":8},"end":{"line":156,"column":5575}},"39":{"start":{"line":157,"column":12},"end":{"line":157,"column":64}},"40":{"start":{"line":158,"column":12},"end":{"line":158,"column":5730}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":5841}},"42":{"start":{"line":174,"column":8},"end":{"line":174,"column":43}},"43":{"start":{"line":182,"column":8},"end":{"line":182,"column":34}},"44":{"start":{"line":190,"column":8},"end":{"line":190,"column":41}},"45":{"start":{"line":198,"column":8},"end":{"line":198,"column":38}},"46":{"start":{"line":206,"column":8},"end":{"line":206,"column":50}},"47":{"start":{"line":210,"column":8},"end":{"line":210,"column":37}},"48":{"start":{"line":218,"column":8},"end":{"line":218,"column":48}},"49":{"start":{"line":222,"column":8},"end":{"line":222,"column":27}},"50":{"start":{"line":226,"column":8},"end":{"line":226,"column":43}},"51":{"start":{"line":234,"column":8},"end":{"line":234,"column":46}},"52":{"start":{"line":242,"column":8},"end":{"line":242,"column":41}},"53":{"start":{"line":246,"column":8},"end":{"line":246,"column":28}}},"branchMap":{"1":{"line":50,"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":50,"column":8}},{"start":{"line":50,"column":8},"end":{"line":50,"column":8}}]},"2":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":8}},{"start":{"line":78,"column":8},"end":{"line":78,"column":8}}]},"3":{"line":122,"type":"if","locations":[{"start":{"line":122,"column":8},"end":{"line":122,"column":8}},{"start":{"line":122,"column":8},"end":{"line":122,"column":8}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":8},"end":{"line":128,"column":8}},{"start":{"line":128,"column":8},"end":{"line":128,"column":8}}]},"5":{"line":135,"type":"if","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":12}},{"start":{"line":135,"column":12},"end":{"line":135,"column":12}}]},"6":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":8},"end":{"line":147,"column":8}},{"start":{"line":147,"column":8},"end":{"line":147,"column":8}}]},"7":{"line":156,"type":"if","locations":[{"start":{"line":156,"column":8},"end":{"line":156,"column":8}},{"start":{"line":156,"column":8},"end":{"line":156,"column":8}}]},"8":{"line":161,"type":"if","locations":[{"start":{"line":161,"column":12},"end":{"line":161,"column":12}},{"start":{"line":161,"column":12},"end":{"line":161,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":19,"29":19,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":19,"3":19,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":19,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":4,"61":4,"70":12,"79":26,"88":8,"89":4,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":4,"2":4,"3":12,"4":26,"5":8,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[4,4]},"f":{"1":3,"2":4,"3":4,"4":12,"5":26,"6":8,"7":4,"8":3,"9":0,"10":6,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html index 13ce459..5dbf873 100644 --- a/coverage/contracts/FundProject.sol.html +++ b/coverage/contracts/FundProject.sol.html @@ -20,28 +20,28 @@

- 100% + 56.6% Statements - 13/13 + 30/53
- 100% + 25% Branches - 2/2 + 4/16
- 100% + 66.67% Functions - 9/9 + 14/21
- 100% + 53.23% Lines - 16/16 + 33/62
-
+

contracts/
62.5%20/3233.33%2/665.52%19/2955.26%21/38contracts/
88.89%32/3650%3/687.1%27/3183.33%35/42
// SPDX-License-Identifier: MIT
@@ -239,7 +239,7 @@ 

mapping(uint256 => bool) public _isApporovedByDao;   modifier isApporovedByDao(uint256 _projecID) { - Iif (!_isApporovedByDao[_projecID]) + if (!_isApporovedByDao[_projecID]) revert FundProject__NotApporovedByDao(); _; } @@ -278,12 +278,12 @@

return _isApporovedByDao[_projecID]; }   - function _getHashOfProjectData(uint256 _projecID) + function _getHashOfProjectData(uint256 _projecID) public view returns (string memory) { - return idToHash[_projecID]; + return idToHash[_projecID]; }   function _getProjectId(string memory _ipfsHash) @@ -316,7 +316,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index abccd38..66fd4a6 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -229,7 +229,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 4ed3a88..119d7d3 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -466,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index e59c2b3..fff3560 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index a23d781..6d75dfe 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,24 +20,24 @@

- 88.89% + 91.67% Statements - 32/36 + 33/36
- 50% + 66.67% Branches - 3/6 + 4/6
- 87.1% + 90.32% Functions - 27/31 + 28/31
- 83.33% + 88.1% Lines - 35/42 + 37/42
@@ -73,15 +73,15 @@

FundProject.sol
92.31%12/1350%1/288.89%8/987.5%14/16
100%13/13100%2/2100%9/9100%16/16
contracts/
88.89%32/3650%3/687.1%27/3183.33%35/42
91.67%33/3666.67%4/690.32%28/3188.1%37/42
// SPDX-License-Identifier: MIT
@@ -239,7 +239,7 @@ 

mapping(uint256 => bool) public _isApporovedByDao;   modifier isApporovedByDao(uint256 _projecID) { - Iif (!_isApporovedByDao[_projecID]) + if (!_isApporovedByDao[_projecID]) revert FundProject__NotApporovedByDao(); _; } @@ -278,12 +278,12 @@

return _isApporovedByDao[_projecID]; }   - function _getHashOfProjectData(uint256 _projecID) + function _getHashOfProjectData(uint256 _projecID) public view returns (string memory) { - return idToHash[_projecID]; + return idToHash[_projecID]; }   function _getProjectId(string memory _ipfsHash) @@ -316,7 +316,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index abccd38..66fd4a6 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -229,7 +229,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 4ed3a88..119d7d3 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -466,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index e59c2b3..fff3560 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index a23d781..6d75dfe 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,24 +20,24 @@

- 88.89% + 91.67% Statements - 32/36 + 33/36
- 50% + 66.67% Branches - 3/6 + 4/6
- 87.1% + 90.32% Functions - 27/31 + 28/31
- 83.33% + 88.1% Lines - 35/42 + 37/42
@@ -73,15 +73,15 @@

FundProject.sol
92.31%12/1350%1/288.89%8/987.5%14/16
100%13/13100%2/2100%9/9100%16/16
contracts/
88.89%32/3650%3/687.1%27/3183.33%35/42
91.67%33/3666.67%4/690.32%28/3188.1%37/42
@@ -316,7 +793,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index 66fd4a6..458d3d2 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -20,24 +20,24 @@

- 100% + 85.71% Statements - 9/9 + 6/7
100% Branches - 2/2 + 0/0
- 100% + 83.33% Functions - 7/7 + 5/6
- 100% + 85.71% Lines - 10/10 + 6/7
@@ -97,15 +97,7 @@

52 53 54 -55 -56 -57 -58 -59 -60 -61

1 2 @@ -132,7 +132,190 @@

87 88 89 -90

  +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +        @@ -150,9 +333,6 @@

      - - -       @@ -161,10 +341,17 @@

    +        + + + +  +  +        @@ -172,10 +359,100 @@

+  +  +  +  +  +  +  +  +  + +  +  + + + + + + + + + + + +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + +  +  + + +  +  +  +  - +  +      +  +      @@ -186,6 +463,7 @@

      +      @@ -210,7 +488,7 @@

      - +        @@ -218,31 +496,108 @@

      - +  +  +  +  + +  +  +  +  +  +  +  + +  +  +  + +  +  +  +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  +  +  +  +      

// SPDX-License-Identifier: MIT
 pragma solidity ^0.8.0;
  
 import "@openzeppelin/contracts/access/Ownable.sol";
+import "@chainlink/contracts/src/v0.8/AutomationCompatible.sol";
  
-contract FundProject is Ownable {
-    error FundProject__NotApporovedByDao();
+error FundProject__NotApporovedByDao();
+error FundProject__UpkeepNeeded();
+error FundProject__TransferFailed(uint256 _projectId);
+error FundProject__NotEnoughPayment();
+error FundProject__withdrawFund();
+error FundProject__WithdrawTransferFailed();
+error FundProject__EnteranceFeeNeeded();
+ 
+contract FundProject is Ownable, AutomationCompatibleInterface {
+    enum ProjectFundingStatus {
+        ONPROGRESS,
+        SUCCESS,
+        FAILED,
+        CANCELED
+    }
  
     uint256 public projectId = 1;
+ 
+    uint public lastTimeStamp;
+    uint256 public daoPercentage;
+    uint256 public enteranceFee;
+ 
+    mapping(uint256 => bool) public _isFunding;
+    mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add
+    mapping(uint256 => uint256) public time;
  
     mapping(string => uint256) public hashToProjectId;
     mapping(uint256 => string) public idToHash;
-    mapping(uint256 => mapping(address => uint256)) public funders;
+    mapping(uint256 => mapping(address => uint256)) public funders; // projectId => funderAddress => funderBalance
     mapping(uint256 => uint256) public projectFunds;
     mapping(uint256 => uint256) public projectFundingGoalAmount;
     mapping(uint256 => bool) public _isApporovedByDao;
+    mapping(uint256 => address) public projectOwnerAddress;
+    mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;
+    mapping(address => bool) public _isEnteranceFeePaid;
+    mapping(address => uint256[]) public investedProjects; // investor address => investedProjects
+ 
+    event projectSuccessfullyFunded(uint256 indexed _projectId);
+    event projectFundingFailed(uint256 indexed _projectId);
+    event enteranceFeePaid(address indexed _projectOwner);
+    event projectGoesToFunding(uint256 indexed _projectId);
  
     modifier isApporovedByDao(uint256 _projecID) {
-        if (!_isApporovedByDao[_projecID])
+        Iif (!_isApporovedByDao[_projecID])
             revert FundProject__NotApporovedByDao();
         _;
     }
+ 
+    constructor(uint256 _enteranceFee, uint256 _daoPercentage) {
+        lastTimeStamp = block.timestamp;
+        daoPercentage = _daoPercentage;
+        enteranceFee = _enteranceFee;
+    }
  
     function fund(uint256 _projecID)
         public
@@ -251,23 +606,105 @@ 

{ funders[_projecID][msg.sender] += msg.value; projectFunds[_projecID] += msg.value; + investedProjects[msg.sender] = [_projecID]; // need testing }   function apporoveFundingByDao( string memory _ipfsHash, - uint256 _fundingGoalAmount + uint256 _fundingGoalAmount, + uint256 _time, + address _projectOwnerAddress ) external onlyOwner { - // only dao can call this function (after deployement we will transfer ownership to dao) - projectFundingGoalAmount[projectId] = _fundingGoalAmount; - hashToProjectId[_ipfsHash] = projectId; - idToHash[projectId] = _ipfsHash; - _isApporovedByDao[projectId] = true; - projectId++; + // only dao can call it + Iif (!_isEnteranceFeePaid[_projectOwnerAddress]) { + revert FundProject__EnteranceFeeNeeded(); + } else { + projectToTime[projectId][_time] = block.timestamp; + _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS; + time[projectId] = _time; + projectFundingGoalAmount[projectId] = _fundingGoalAmount; + hashToProjectId[_ipfsHash] = projectId; + idToHash[projectId] = _ipfsHash; + projectOwnerAddress[projectId] = _projectOwnerAddress; + _isApporovedByDao[projectId] = true; + _isFunding[projectId] = true; + emit projectGoesToFunding(projectId); + projectId++; + } + } +  + function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { + // only dao can call it + _isApporovedByDao[_projecID] = false; + _isFunding[projectId] = false; + _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; }   - function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { - // only dao can call this function (after deployement we will transfer ownership to dao) - _isApporovedByDao[_projecID] = false; + function checkUpkeep( + bytes memory /* checkData */ + ) + public + view + override + returns ( + bool upkeepNeeded, + bytes memory /* performData */ + ) + { + upkeepNeeded = (_isFunding[projectId] && + (block.timestamp - projectToTime[projectId][time[projectId]]) > + projectToTime[projectId][time[projectId]]); + } +  + function performUpkeep( + bytes calldata /* performData */ + ) external override { + (bool upkeepNeeded, ) = checkUpkeep(""); + if (!upkeepNeeded) { + revert FundProject__UpkeepNeeded(); + } + _isFunding[projectId] = false; + _isApporovedByDao[projectId] = false; +  + if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) { + _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS; + uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) / + 100; + (bool success, ) = (projectOwnerAddress[projectId]).call{ + value: fundsToSent + }(""); + if (!success) { + revert FundProject__TransferFailed(projectFunds[projectId]); + } +  + emit projectSuccessfullyFunded(projectId); + } else { + _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED; + emit projectFundingFailed(projectId); + } + } +  + function paySubmitFee() public payable { + Iif (msg.value < enteranceFee) { + revert FundProject__NotEnoughPayment(); + } else { + _isEnteranceFeePaid[msg.sender] = true; + emit enteranceFeePaid(msg.sender); + } + } +  + function withdrawFund(uint256 _projectID) public { + Iif (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) { + uint256 fundToSent = funders[_projectID][msg.sender]; + (bool success, ) = (payable(msg.sender)).call{value: fundToSent}( + "" + ); + if (!success) { + revert FundProject__WithdrawTransferFailed(); + } + } else { + revert FundProject__withdrawFund(); + } }   function _isApporoveFundingByDao(uint256 _projecID) @@ -294,20 +731,60 @@

return hashToProjectId[_ipfsHash]; }   - function _getBalanceOfProject(uint256 _projecID) + function _getBalanceOfProject(uint256 _projecID) + public + view + returns (uint256) + { + return projectFunds[_projecID]; + } +  + function _getFundingGoalAmount(uint256 _projecID) public view returns (uint256) { - return projectFunds[_projecID]; + return projectFundingGoalAmount[_projecID]; + } +  + function is_funding(uint256 _projectID) public view returns (bool) { + return _isFunding[_projectID]; }   - function _getFundingGoalAmount(uint256 _projecID) + function _getProjectStatus(uint256 _projectID) + public + view + returns (ProjectFundingStatus) + { + return _ProjectFundingStatus[_projectID]; + } +  + function getEnteranceFee() public view returns (uint256) { + return enteranceFee; + } +  + function isEnteranceFeePaid(address account) public view returns (bool) { + return _isEnteranceFeePaid[account]; + } +  + function getFunderBalance(uint256 _projectID) public view returns (uint256) { - return projectFundingGoalAmount[_projecID]; + return funders[_projectID][msg.sender]; + } +  + function getInvestedProjects(address investor) + public + view + returns (uint256[] memory) + { + return investedProjects[investor]; // need testing + } +  + function getDaoPercentage() public view returns (uint256) { + return daoPercentage; } }  

  -  -  +55        @@ -119,15 +111,11 @@

      - -           -  -     @@ -136,8 +124,8 @@

      -17× -17× +19× +19×       @@ -145,11 +133,11 @@

      - +       - +        @@ -167,27 +155,21 @@

pragma solidity ^0.8.7;   import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; +import "@openzeppelin/contracts/access/Ownable.sol";   -contract GovernanceToken is ERC20Votes { +contract GovernanceToken is ERC20Votes, Ownable { uint256 public s_initialSupply = 1000000e18; - address private immutable i_owner;   event TokenTransfer( address indexed _from, address indexed _to, uint256 _amount ); -  - modifier onlyOwner() { - require(i_owner == msg.sender, "Ownable: caller is not the owner"); - _; - }   constructor() ERC20("GovernanceToken", "GT") ERC20Permit("GovernanceToken") { - i_owner = msg.sender; _mint(msg.sender, s_initialSupply); }   @@ -208,8 +190,8 @@

super._mint(to, amount); }   - function mintToken(address to, uint256 amount) external { - _mint(to, amount); + function mintToken(address to, uint256 amount) external { + _mint(to, amount); }   function burnToken(address account, uint256 amount) external { @@ -229,7 +211,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 119d7d3..89cc827 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -20,28 +20,28 @@

- 72.73% + 81.82% Statements - 8/11 + 9/11
- 0% + 100% Branches - 0/2 + 2/2
- 75% + 81.82% Functions - 9/12 + 9/11
- 61.54% + 83.33% Lines - 8/13 + 10/12
-
+
1 2 @@ -205,9 +205,6 @@

      -  -  -        @@ -263,7 +260,7 @@

      -29× +26×       @@ -272,6 +269,9 @@

      + + +      @@ -330,6 +330,7 @@

import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; +import "./FundProject.sol";   contract GovernerContract is Governor, @@ -337,24 +338,19 @@

GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, - GovernorTimelockControl + GovernorTimelockControl, + FundProject { - error GovernerContract__NotApporovedByDaoFoundation(); -  - mapping(address => bool) public inWhiteList; -  - modifier isApporovedByDaoFoundation() { - if (!inWhiteList[msg.sender]) - revert GovernerContract__NotApporovedByDaoFoundation(); - _; - } + error GovernerContract__NeedEnteranceFee();   constructor( IVotes _token, TimelockController _timelock, uint256 _votingDelay, uint256 _votingPeriod, - uint256 _quorumPercentage + uint256 _quorumPercentage, + uint256 _enteranceFee, + uint256 _daoPercentage ) Governor("GovernerContract") GovernorSettings( @@ -365,6 +361,7 @@

GovernorVotes(_token) GovernorVotesQuorumFraction(_quorumPercentage) GovernorTimelockControl(_timelock) + FundProject(_enteranceFee, _daoPercentage) {}   // The following functions are overrides required by Solidity. @@ -411,6 +408,9 @@

bytes[] memory calldatas, string memory description ) public override(Governor, IGovernor) returns (uint256) { + if (!_isEnteranceFeePaid[msg.sender]) { + revert GovernerContract__NeedEnteranceFee(); + } return super.propose(targets, values, calldatas, description); }   @@ -466,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index fff3560..da321e1 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index 6d75dfe..ea2e6f8 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,28 +20,28 @@

- 91.67% + 63.38% Statements - 33/36 + 45/71
- 66.67% + 33.33% Branches - 4/6 + 6/18
- 90.32% + 74.36% Functions - 28/31 + 29/39
- 88.1% + 60.49% Lines - 37/42 + 49/81
-
+
@@ -59,55 +59,42 @@

- - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - + + + + @@ -129,7 +116,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index ce2269d..1b9d731 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,6 +1,5 @@ { -"contracts/Box.sol":{"l":{"15":1,"16":1,"21":2},"path":"/home/furkansezal/dao/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":17,"column":4}}},"2":{"name":"retrieve","line":20,"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":4}}}},"statementMap":{"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"2":{"start":{"line":16,"column":8},"end":{"line":16,"column":35}},"3":{"start":{"line":21,"column":8},"end":{"line":21,"column":20}}},"branchMap":{}}, -"contracts/FundProject.sol":{"l":{"19":2,"20":1,"21":1,"29":1,"30":1,"38":1,"39":1,"40":1,"41":1,"42":1,"47":1,"55":2,"63":1,"71":3,"79":2,"87":2},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":2,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"10":1,"11":3,"12":2,"13":2},"b":{"1":[1,1]},"f":{"1":2,"2":1,"3":1,"4":1,"5":2,"6":1,"7":3,"8":2,"9":2},"fnMap":{"1":{"name":"isApporovedByDao","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":22,"column":4}}},"2":{"name":"fund","line":27,"loc":{"start":{"line":24,"column":4},"end":{"line":31,"column":4}}},"3":{"name":"apporoveFundingByDao","line":36,"loc":{"start":{"line":33,"column":4},"end":{"line":43,"column":4}}},"4":{"name":"cancelApporovelFundingByDao","line":45,"loc":{"start":{"line":45,"column":4},"end":{"line":48,"column":4}}},"5":{"name":"_isApporoveFundingByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":56,"column":4}}},"6":{"name":"_getHashOfProjectData","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":4}}},"7":{"name":"_getProjectId","line":66,"loc":{"start":{"line":66,"column":4},"end":{"line":72,"column":4}}},"8":{"name":"_getBalanceOfProject","line":74,"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":4}}},"9":{"name":"_getFundingGoalAmount","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":88,"column":4}}}},"statementMap":{"1":{"start":{"line":19,"column":8},"end":{"line":19,"column":681}},"2":{"start":{"line":29,"column":8},"end":{"line":29,"column":50}},"3":{"start":{"line":30,"column":8},"end":{"line":30,"column":43}},"4":{"start":{"line":38,"column":8},"end":{"line":38,"column":63}},"5":{"start":{"line":39,"column":8},"end":{"line":39,"column":45}},"6":{"start":{"line":40,"column":8},"end":{"line":40,"column":38}},"7":{"start":{"line":41,"column":8},"end":{"line":41,"column":42}},"8":{"start":{"line":47,"column":8},"end":{"line":47,"column":43}},"9":{"start":{"line":55,"column":8},"end":{"line":55,"column":43}},"10":{"start":{"line":63,"column":8},"end":{"line":63,"column":34}},"11":{"start":{"line":71,"column":8},"end":{"line":71,"column":41}},"12":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"13":{"start":{"line":87,"column":8},"end":{"line":87,"column":50}}},"branchMap":{"1":{"line":19,"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":19,"column":8}},{"start":{"line":19,"column":8},"end":{"line":19,"column":8}}]}}}, -"contracts/GovernanceToken.sol":{"l":{"17":5,"18":4,"25":3,"26":3,"34":17,"35":17,"43":4,"47":2,"51":1,"58":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":5,"2":3,"3":3,"4":17,"5":17,"6":4,"7":2,"8":1,"9":1},"b":{"1":[4,1]},"f":{"1":5,"2":3,"3":17,"4":4,"5":2,"6":1,"7":1},"fnMap":{"1":{"name":"onlyOwner","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":4}}},"2":{"name":"constructor","line":23,"loc":{"start":{"line":21,"column":4},"end":{"line":27,"column":4}}},"3":{"name":"_afterTokenTransfer","line":29,"loc":{"start":{"line":29,"column":4},"end":{"line":36,"column":4}}},"4":{"name":"_mint","line":41,"loc":{"start":{"line":38,"column":4},"end":{"line":44,"column":4}}},"5":{"name":"mintToken","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":4}}},"6":{"name":"burnToken","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":52,"column":4}}},"7":{"name":"_burn","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":59,"column":4}}}},"statementMap":{"1":{"start":{"line":17,"column":8},"end":{"line":17,"column":73}},"2":{"start":{"line":25,"column":8},"end":{"line":25,"column":27}},"3":{"start":{"line":26,"column":8},"end":{"line":26,"column":41}},"4":{"start":{"line":34,"column":8},"end":{"line":34,"column":50}},"5":{"start":{"line":35,"column":8},"end":{"line":35,"column":44}},"6":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"7":{"start":{"line":47,"column":8},"end":{"line":47,"column":24}},"8":{"start":{"line":51,"column":8},"end":{"line":51,"column":29}},"9":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}}},"branchMap":{"1":{"line":17,"type":"if","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":8}},{"start":{"line":17,"column":8},"end":{"line":17,"column":8}}]}}}, -"contracts/GovernerContract.sol":{"l":{"24":0,"25":0,"26":0,"55":4,"64":4,"73":12,"82":29,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":0,"2":4,"3":4,"4":12,"5":29,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[0,0]},"f":{"1":0,"2":3,"3":4,"4":4,"5":12,"6":29,"7":4,"8":4,"9":3,"10":0,"11":6,"12":0},"fnMap":{"1":{"name":"isApporovedByDaoFoundation","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":4}}},"2":{"name":"constructor","line":44,"loc":{"start":{"line":29,"column":4},"end":{"line":45,"column":5}}},"3":{"name":"votingDelay","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":56,"column":4}}},"4":{"name":"votingPeriod","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":65,"column":4}}},"5":{"name":"quorum","line":67,"loc":{"start":{"line":67,"column":4},"end":{"line":74,"column":4}}},"6":{"name":"state","line":76,"loc":{"start":{"line":76,"column":4},"end":{"line":83,"column":4}}},"7":{"name":"propose","line":85,"loc":{"start":{"line":85,"column":4},"end":{"line":92,"column":4}}},"8":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"9":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"10":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"11":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"12":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":24,"column":8},"end":{"line":24,"column":926}},"2":{"start":{"line":55,"column":8},"end":{"line":55,"column":34}},"3":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"4":{"start":{"line":73,"column":8},"end":{"line":73,"column":40}},"5":{"start":{"line":82,"column":8},"end":{"line":82,"column":38}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":24,"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":8}},{"start":{"line":24,"column":8},"end":{"line":24,"column":8}}]}}}, +"contracts/FundProject.sol":{"l":{"50":1,"51":0,"52":1,"56":3,"57":3,"58":3,"66":1,"67":1,"68":1,"78":3,"79":0,"81":3,"82":3,"83":3,"84":3,"85":3,"86":3,"87":3,"88":3,"89":3,"90":3,"91":3,"97":0,"98":0,"99":0,"113":0,"121":0,"122":0,"123":0,"125":0,"126":0,"128":0,"129":0,"130":0,"132":0,"135":0,"136":0,"139":0,"141":0,"142":0,"147":4,"148":0,"150":4,"151":4,"156":1,"157":0,"158":0,"161":0,"162":0,"165":1,"174":2,"182":1,"190":3,"198":0,"206":0,"210":1,"218":1,"222":5,"226":0,"234":1,"242":0,"246":1},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":1,"2":3,"3":3,"4":3,"5":1,"6":1,"7":1,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3,"18":3,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":4,"36":4,"37":4,"38":1,"39":0,"40":0,"41":0,"42":2,"43":1,"44":3,"45":0,"46":0,"47":1,"48":1,"49":5,"50":0,"51":1,"52":0,"53":1},"b":{"1":[0,1],"2":[0,3],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,4],"7":[0,1],"8":[0,0]},"f":{"1":1,"2":3,"3":1,"4":3,"5":0,"6":0,"7":0,"8":4,"9":1,"10":2,"11":1,"12":3,"13":0,"14":0,"15":1,"16":1,"17":5,"18":0,"19":1,"20":0,"21":1},"fnMap":{"1":{"name":"isApporovedByDao","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":53,"column":4}}},"2":{"name":"constructor","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"3":{"name":"fund","line":64,"loc":{"start":{"line":61,"column":4},"end":{"line":69,"column":4}}},"4":{"name":"apporoveFundingByDao","line":76,"loc":{"start":{"line":71,"column":4},"end":{"line":93,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":95,"loc":{"start":{"line":95,"column":4},"end":{"line":100,"column":4}}},"6":{"name":"checkUpkeep","line":102,"loc":{"start":{"line":102,"column":4},"end":{"line":116,"column":4}}},"7":{"name":"performUpkeep","line":118,"loc":{"start":{"line":118,"column":4},"end":{"line":144,"column":4}}},"8":{"name":"paySubmitFee","line":146,"loc":{"start":{"line":146,"column":4},"end":{"line":153,"column":4}}},"9":{"name":"withdrawFund","line":155,"loc":{"start":{"line":155,"column":4},"end":{"line":167,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":169,"loc":{"start":{"line":169,"column":4},"end":{"line":175,"column":4}}},"11":{"name":"_getHashOfProjectData","line":177,"loc":{"start":{"line":177,"column":4},"end":{"line":183,"column":4}}},"12":{"name":"_getProjectId","line":185,"loc":{"start":{"line":185,"column":4},"end":{"line":191,"column":4}}},"13":{"name":"_getBalanceOfProject","line":193,"loc":{"start":{"line":193,"column":4},"end":{"line":199,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":201,"loc":{"start":{"line":201,"column":4},"end":{"line":207,"column":4}}},"15":{"name":"is_funding","line":209,"loc":{"start":{"line":209,"column":4},"end":{"line":211,"column":4}}},"16":{"name":"_getProjectStatus","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"17":{"name":"getEnteranceFee","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":227,"column":4}}},"19":{"name":"getFunderBalance","line":229,"loc":{"start":{"line":229,"column":4},"end":{"line":235,"column":4}}},"20":{"name":"getInvestedProjects","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":243,"column":4}}},"21":{"name":"getDaoPercentage","line":245,"loc":{"start":{"line":245,"column":4},"end":{"line":247,"column":4}}}},"statementMap":{"1":{"start":{"line":50,"column":8},"end":{"line":50,"column":2037}},"2":{"start":{"line":56,"column":8},"end":{"line":56,"column":38}},"3":{"start":{"line":57,"column":8},"end":{"line":57,"column":37}},"4":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}},"5":{"start":{"line":66,"column":8},"end":{"line":66,"column":50}},"6":{"start":{"line":67,"column":8},"end":{"line":67,"column":43}},"7":{"start":{"line":68,"column":8},"end":{"line":68,"column":49}},"8":{"start":{"line":78,"column":8},"end":{"line":78,"column":2806}},"9":{"start":{"line":81,"column":12},"end":{"line":81,"column":60}},"10":{"start":{"line":82,"column":12},"end":{"line":82,"column":77}},"11":{"start":{"line":83,"column":12},"end":{"line":83,"column":34}},"12":{"start":{"line":84,"column":12},"end":{"line":84,"column":67}},"13":{"start":{"line":85,"column":12},"end":{"line":85,"column":49}},"14":{"start":{"line":86,"column":12},"end":{"line":86,"column":42}},"15":{"start":{"line":87,"column":12},"end":{"line":87,"column":64}},"16":{"start":{"line":88,"column":12},"end":{"line":88,"column":46}},"17":{"start":{"line":89,"column":12},"end":{"line":89,"column":39}},"18":{"start":{"line":90,"column":12},"end":{"line":90,"column":48}},"19":{"start":{"line":97,"column":8},"end":{"line":97,"column":43}},"20":{"start":{"line":98,"column":8},"end":{"line":98,"column":36}},"21":{"start":{"line":99,"column":8},"end":{"line":99,"column":71}},"22":{"start":{"line":113,"column":8},"end":{"line":113,"column":4078}},"23":{"start":{"line":121,"column":8},"end":{"line":121,"column":47}},"24":{"start":{"line":122,"column":8},"end":{"line":122,"column":4365}},"25":{"start":{"line":125,"column":8},"end":{"line":125,"column":36}},"26":{"start":{"line":126,"column":8},"end":{"line":126,"column":43}},"27":{"start":{"line":128,"column":8},"end":{"line":128,"column":4538}},"28":{"start":{"line":129,"column":12},"end":{"line":129,"column":74}},"29":{"start":{"line":130,"column":12},"end":{"line":130,"column":4707}},"30":{"start":{"line":132,"column":12},"end":{"line":132,"column":4804}},"31":{"start":{"line":135,"column":12},"end":{"line":135,"column":4923}},"32":{"start":{"line":139,"column":12},"end":{"line":139,"column":53}},"33":{"start":{"line":141,"column":12},"end":{"line":141,"column":73}},"34":{"start":{"line":142,"column":12},"end":{"line":142,"column":48}},"35":{"start":{"line":147,"column":8},"end":{"line":147,"column":5295}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":49}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":45}},"38":{"start":{"line":156,"column":8},"end":{"line":156,"column":5575}},"39":{"start":{"line":157,"column":12},"end":{"line":157,"column":64}},"40":{"start":{"line":158,"column":12},"end":{"line":158,"column":5730}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":5841}},"42":{"start":{"line":174,"column":8},"end":{"line":174,"column":43}},"43":{"start":{"line":182,"column":8},"end":{"line":182,"column":34}},"44":{"start":{"line":190,"column":8},"end":{"line":190,"column":41}},"45":{"start":{"line":198,"column":8},"end":{"line":198,"column":38}},"46":{"start":{"line":206,"column":8},"end":{"line":206,"column":50}},"47":{"start":{"line":210,"column":8},"end":{"line":210,"column":37}},"48":{"start":{"line":218,"column":8},"end":{"line":218,"column":48}},"49":{"start":{"line":222,"column":8},"end":{"line":222,"column":27}},"50":{"start":{"line":226,"column":8},"end":{"line":226,"column":43}},"51":{"start":{"line":234,"column":8},"end":{"line":234,"column":46}},"52":{"start":{"line":242,"column":8},"end":{"line":242,"column":41}},"53":{"start":{"line":246,"column":8},"end":{"line":246,"column":28}}},"branchMap":{"1":{"line":50,"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":50,"column":8}},{"start":{"line":50,"column":8},"end":{"line":50,"column":8}}]},"2":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":8}},{"start":{"line":78,"column":8},"end":{"line":78,"column":8}}]},"3":{"line":122,"type":"if","locations":[{"start":{"line":122,"column":8},"end":{"line":122,"column":8}},{"start":{"line":122,"column":8},"end":{"line":122,"column":8}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":8},"end":{"line":128,"column":8}},{"start":{"line":128,"column":8},"end":{"line":128,"column":8}}]},"5":{"line":135,"type":"if","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":12}},{"start":{"line":135,"column":12},"end":{"line":135,"column":12}}]},"6":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":8},"end":{"line":147,"column":8}},{"start":{"line":147,"column":8},"end":{"line":147,"column":8}}]},"7":{"line":156,"type":"if","locations":[{"start":{"line":156,"column":8},"end":{"line":156,"column":8}},{"start":{"line":156,"column":8},"end":{"line":156,"column":8}}]},"8":{"line":161,"type":"if","locations":[{"start":{"line":161,"column":12},"end":{"line":161,"column":12}},{"start":{"line":161,"column":12},"end":{"line":161,"column":12}}]}}}, +"contracts/GovernanceToken.sol":{"l":{"20":3,"28":19,"29":19,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":19,"3":19,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":19,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}}, +"contracts/GovernerContract.sol":{"l":{"52":4,"61":4,"70":12,"79":26,"88":8,"89":4,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":4,"2":4,"3":12,"4":26,"5":8,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[4,4]},"f":{"1":3,"2":4,"3":4,"4":12,"5":26,"6":8,"7":4,"8":3,"9":0,"10":6,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index 7f68b37..8e9a379 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,28 +20,28 @@

- 91.67% + 63.38% Statements - 33/36 + 45/71
- 66.67% + 33.33% Branches - 4/6 + 6/18
- 90.32% + 74.36% Functions - 28/31 + 29/39
- 88.1% + 60.49% Lines - 37/42 + 49/81
-
+
Box.sol
100%3/3100%0/0100%2/2100%3/3FundProject.sol
56.6%30/5325%4/1666.67%14/2153.23%33/62
FundProject.sol
100%13/13100%2/2100%9/9GovernanceToken.sol
85.71%6/7 100%16/160/083.33%5/685.71%6/7
GovernanceToken.sol
100%9/9GovernerContract.sol
81.82%9/11 100% 2/2100%7/7100%10/10
GovernerContract.sol
72.73%8/110%0/275%9/1261.54%8/1381.82%9/1183.33%10/12
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html index 13ce459..5dbf873 100644 --- a/coverage/lcov-report/contracts/FundProject.sol.html +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -20,28 +20,28 @@

- 100% + 56.6% Statements - 13/13 + 30/53
- 100% + 25% Branches - 2/2 + 4/16
- 100% + 66.67% Functions - 9/9 + 14/21
- 100% + 53.23% Lines - 16/16 + 33/62
-
+
contracts/
91.67%33/3666.67%4/690.32%28/3188.1%37/42contracts/
63.38%45/7133.33%6/1874.36%29/3960.49%49/81
@@ -316,7 +793,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index 66fd4a6..458d3d2 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -20,24 +20,24 @@

- 100% + 85.71% Statements - 9/9 + 6/7
100% Branches - 2/2 + 0/0
- 100% + 83.33% Functions - 7/7 + 5/6
- 100% + 85.71% Lines - 10/10 + 6/7
@@ -97,15 +97,7 @@

52 53 54 -55 -56 -57 -58 -59 -60 -61

- - - - - - - - - + + + + + + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index 12c7067..87e73ba 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,24 +20,24 @@

- 87.8% + 86.9% Statements - 72/82 + 73/84
- 75% + 77.27% Branches - 15/20 + 17/22
- 82.5% + 80.49% Functions - 33/40 + 33/41
- 83.87% + 83.16% Lines - 78/93 + 79/95
@@ -60,15 +60,15 @@

- - - - - - - - - + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 339ffdc..27e402c 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -1,28 +1,29 @@ TN: SF:/home/furkansezal/dao/contracts/FundProject.sol -FN:54,isApporovedByDao -FN:60,constructor -FN:69,fund -FN:81,apporoveFundingByDao -FN:100,cancelApporovelFundingByDao -FN:107,checkUpkeep -FN:127,performUpkeep -FN:156,paySubmitFee -FN:165,withdrawFund -FN:181,_isApporoveFundingByDao -FN:189,_getHashOfProjectData -FN:197,_getProjectId -FN:205,_getBalanceOfProject -FN:213,_getFundingGoalAmount -FN:221,is_funding -FN:225,_getProjectStatus -FN:233,getEnteranceFee -FN:237,isEnteranceFeePaid -FN:241,getFunderBalance -FN:249,getInvestedProjects -FN:257,getDaoPercentage -FN:261,getTimeleft -FNF:22 +FN:55,isApporovedByDao +FN:61,constructor +FN:70,fund +FN:82,apporoveFundingByDao +FN:107,cancelApporovelFundingByDao +FN:114,checkUpkeep +FN:136,performUpkeep +FN:165,paySubmitFee +FN:175,withdrawFund +FN:191,_isApporoveFundingByDao +FN:199,_getHashOfProjectData +FN:207,_getProjectId +FN:215,_getBalanceOfProject +FN:223,_getFundingGoalAmount +FN:231,is_funding +FN:235,_getProjectStatus +FN:243,getEnteranceFee +FN:247,isEnteranceFeePaid +FN:251,getFunderBalance +FN:259,getInvestedProjects +FN:267,getDaoPercentage +FN:271,getTimeleft +FN:280,getCurrentProjectId +FNF:23 FNH:18 FNDA:3,isApporovedByDao FNDA:3,constructor @@ -41,107 +42,112 @@ FNDA:0,_getFundingGoalAmount FNDA:3,is_funding FNDA:3,_getProjectStatus FNDA:9,getEnteranceFee -FNDA:6,isEnteranceFeePaid +FNDA:0,isEnteranceFeePaid FNDA:2,getFunderBalance FNDA:0,getInvestedProjects FNDA:1,getDaoPercentage FNDA:0,getTimeleft -DA:55,3 -DA:56,0 -DA:57,3 -DA:61,3 +FNDA:9,getCurrentProjectId +DA:56,3 +DA:57,0 +DA:58,3 DA:62,3 DA:63,3 -DA:71,3 +DA:64,3 DA:72,3 DA:73,3 -DA:83,7 -DA:84,0 -DA:86,7 -DA:87,7 -DA:88,7 -DA:89,7 -DA:90,7 +DA:74,3 +DA:84,7 +DA:89,0 DA:91,7 DA:92,7 DA:93,7 DA:94,7 DA:95,7 DA:96,7 -DA:102,0 -DA:103,0 -DA:104,0 -DA:115,12 -DA:116,14 -DA:117,14 -DA:119,14 -DA:120,14 -DA:121,4 -DA:122,4 -DA:128,4 +DA:97,7 +DA:100,7 +DA:101,7 +DA:102,7 +DA:103,7 +DA:109,0 +DA:110,0 +DA:111,0 +DA:122,12 +DA:123,14 +DA:124,6 +DA:127,6 +DA:128,6 DA:129,4 -DA:130,1 -DA:133,3 -DA:134,3 -DA:135,3 -DA:137,3 -DA:138,1 +DA:130,4 +DA:137,4 +DA:138,4 DA:139,1 -DA:141,1 -DA:142,1 -DA:145,1 -DA:146,0 -DA:149,1 -DA:151,2 -DA:152,2 -DA:157,8 -DA:158,0 -DA:160,8 -DA:161,8 -DA:166,2 -DA:167,1 -DA:168,1 -DA:169,1 -DA:172,1 -DA:173,0 -DA:175,1 +DA:142,3 +DA:143,3 +DA:144,3 +DA:146,3 +DA:147,1 +DA:148,1 +DA:150,1 +DA:151,1 +DA:154,1 +DA:155,0 +DA:158,1 +DA:160,2 +DA:161,2 +DA:166,8 +DA:167,0 +DA:169,8 +DA:170,8 +DA:171,8 +DA:176,2 DA:177,1 -DA:186,4 -DA:194,1 -DA:202,7 -DA:210,1 -DA:218,0 -DA:222,3 -DA:230,3 -DA:234,9 -DA:238,6 -DA:246,2 -DA:254,0 -DA:258,1 -DA:266,0 -DA:267,0 -LF:74 -LH:62 -BRDA:55,1,0,0 -BRDA:55,1,1,3 -BRDA:83,2,0,0 -BRDA:83,2,1,7 -BRDA:120,3,0,4 -BRDA:120,3,1,10 -BRDA:129,4,0,1 -BRDA:129,4,1,3 -BRDA:137,5,0,1 -BRDA:137,5,1,2 -BRDA:145,6,0,0 -BRDA:145,6,1,1 -BRDA:157,7,0,0 -BRDA:157,7,1,8 -BRDA:166,8,0,1 -BRDA:166,8,1,1 -BRDA:172,9,0,0 -BRDA:172,9,1,1 -BRF:18 -BRH:13 +DA:178,1 +DA:179,1 +DA:182,1 +DA:183,0 +DA:185,1 +DA:187,1 +DA:196,4 +DA:204,1 +DA:212,7 +DA:220,1 +DA:228,0 +DA:232,3 +DA:240,3 +DA:244,9 +DA:248,0 +DA:256,2 +DA:264,0 +DA:268,1 +DA:276,0 +DA:277,0 +DA:281,9 +LF:76 +LH:63 +BRDA:56,1,0,0 +BRDA:56,1,1,3 +BRDA:84,2,0,0 +BRDA:84,2,1,7 +BRDA:123,3,0,6 +BRDA:123,3,1,8 +BRDA:128,4,0,4 +BRDA:128,4,1,2 +BRDA:138,5,0,1 +BRDA:138,5,1,3 +BRDA:146,6,0,1 +BRDA:146,6,1,2 +BRDA:154,7,0,0 +BRDA:154,7,1,1 +BRDA:166,8,0,0 +BRDA:166,8,1,8 +BRDA:176,9,0,1 +BRDA:176,9,1,1 +BRDA:182,10,0,0 +BRDA:182,10,1,1 +BRF:20 +BRH:15 end_of_record TN: SF:/home/furkansezal/dao/contracts/GovernanceToken.sol @@ -191,7 +197,7 @@ FNDA:8,votingDelay FNDA:8,votingPeriod FNDA:24,quorum FNDA:50,state -FNDA:16,propose +FNDA:10,propose FNDA:8,proposalThreshold FNDA:7,_execute FNDA:0,_cancel @@ -201,8 +207,8 @@ DA:52,8 DA:61,8 DA:70,24 DA:79,50 -DA:88,16 -DA:89,8 +DA:88,10 +DA:89,2 DA:91,8 DA:100,8 DA:110,7 @@ -211,7 +217,7 @@ DA:128,14 DA:137,0 LF:12 LH:10 -BRDA:88,1,0,8 +BRDA:88,1,0,2 BRDA:88,1,1,8 BRF:2 BRH:2 diff --git a/hardhat.config.js b/hardhat.config.js index be0016d..99012b6 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -7,6 +7,9 @@ require("dotenv").config(); const GOERLI_RPC_URL = process.env.GOERLI_RPC_URL; const PRIVATE_KEY = process.env.PRIVATE_KEY; +const PRIVATE_KEY_PROJECT_OWNER = process.env.PRIVATE_KEY_PROJECT_OWNER; +const PRIVATE_KEY_PROJECT_ACCOUNT2 = process.env.PRIVATE_KEY_PROJECT_ACCOUNT2; +const PRIVATE_KEY_PROJECT_ACCOUNT3 = process.env.PRIVATE_KEY_PROJECT_ACCOUNT3; const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY; const COINMARKETCAP_API_KEY = process.env.COINMARKETCAP_API_KEY; @@ -24,16 +27,32 @@ module.exports = { }, goerli: { url: GOERLI_RPC_URL, - accounts: [PRIVATE_KEY], + accounts: [ + PRIVATE_KEY, + PRIVATE_KEY_PROJECT_OWNER, + PRIVATE_KEY_PROJECT_ACCOUNT2, + PRIVATE_KEY_PROJECT_ACCOUNT3, + ], chainId: 5, blockConfirmations: 6, }, }, - solidity: "0.8.17", + solidity: { + version: "0.8.9", + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + }, + }, namedAccounts: { deployer: { default: 0, }, + projectOwner: 1, + voter2: 2, + voter3: 3, }, etherscan: { apiKey: process.env.ETHERSCAN_API_KEY, diff --git a/helper-config.js b/helper-config.js index 160b057..fb35e31 100644 --- a/helper-config.js +++ b/helper-config.js @@ -17,7 +17,7 @@ const developmentChains = ["hardhat", "localhost"]; const INITIAL_SUPPLY = "1000000000000000000000000"; const MIN_DELAY = 0; const VOTING_DELAY = 0; -const VOTING_PERIOD = 200; +const VOTING_PERIOD = 50; const QUORUM_PERCENTAGE = 0; const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; const NEW_VALUE = 77; @@ -35,7 +35,7 @@ const s_video = const s_fundRaisingGoalAmount = 10000; // in wei const s_roadMap = "Just click the video"; const s_otherSources = "You dont need anything else"; -const s_fundingTime = 60; // 10 sec. +const s_fundingTime = 120; // 10 sec. module.exports = { developmentChains, diff --git a/proposals.json b/proposals.json index 3e6c757..6dc3efd 100644 --- a/proposals.json +++ b/proposals.json @@ -1 +1 @@ -{"31337":["99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927"]} \ No newline at end of file +{"31337":[""]} \ No newline at end of file diff --git a/readme.md b/readme.md deleted file mode 100644 index 663bd03..0000000 --- a/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -yarn hardhat run scripts/submit_and_propose.js --network localhost -yarn hardhat run scripts/vote.js --network localhost -yarn hardhat run scripts/queue-and-execute-afterSubmit.js --network localhost -yarn hardhat run scripts/fund.js --network localhost -yarn hardhat run scripts/del.js --network localhost diff --git a/test/staging/dao.staging.test.js b/test/staging/dao.staging.test.js new file mode 100644 index 0000000..ddc3cc7 --- /dev/null +++ b/test/staging/dao.staging.test.js @@ -0,0 +1,177 @@ +const { ethers, deployments, getNamedAccounts, network } = require("hardhat"); +const { assert, expect } = require("chai"); +const { + FUNC_FUND, + developmentChains, + networkConfig, + s_fundingTime, + s_fundRaisingGoalAmount, + proposalsFile, +} = require("../../helper-config"); +const fs = require("fs"); + +developmentChains.includes(network.name) + ? describe.skip + : describe("Dao staging tests", async () => { + const chainId = network.config.chainId; + let deployer, + governor, + gtToken, + projectOwnerIndex, + projectOwner, + voter2, + voter3; + + beforeEach(async () => { + deployer = (await getNamedAccounts()).deployer; + projectOwner = await ethers.getSigner( + ( + await getNamedAccounts() + ).projectOwner + ); + voter2 = await ethers.getSigner((await getNamedAccounts()).voter2); + voter3 = await ethers.getSigner((await getNamedAccounts()).voter3); + + gtToken = await ethers.getContract("GovernanceToken", deployer); + governor = await ethers.getContract("GovernerContract", deployer); + }); + describe("make a propose to fund a project", () => { + it("works with live chainlink keepers get to proposal to fund the project", async () => { + await new Promise(async (resolve, reject) => { + // listen for WinnerPicked event + governor.once("projectGoesToFunding", async () => { + console.log("projectGoesToFunding event fired!"); + try { + // put assert here + + resolve(); + } catch (error) { + console.log(error); + reject(error); + } + }); + }); + }); + }); + describe("submit a project", () => { + it("submitting", async () => { + const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMQQ"; + const projectOwnerConnectContract = await governor.connect( + projectOwner + ); + + const enteranceFee = + await projectOwnerConnectContract.getEnteranceFee(); + const payFee = await projectOwnerConnectContract.paySubmitFee({ + value: enteranceFee, + }); + await payFee.wait(1); + projectOwnerIndex = + await projectOwnerConnectContract.getCurrentProjectId(); + + const encodedFunctionCall = + projectOwnerConnectContract.interface.encodeFunctionData( + FUNC_FUND, + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwnerIndex] + ); + + const proposalTx = await projectOwnerConnectContract.propose( + [governor.address], + [0], + [encodedFunctionCall], + args + ); + const proposeReceipt = await proposalTx.wait(1); + const proposalId = proposeReceipt.events[0].args.proposalId; + console.log(proposalId.toString()); + }); + + it("Make the vote!", async () => { + const voter2ConnectTokenContract = governor.connect(voter2); + let txCastVote = await voter2ConnectTokenContract.castVote( + "33305536448279361826260693304629530695162329813830343837048230642993916376403", + 1 + ); + await txCastVote.wait(1); + + const voter3ConnectTokenContract = governor.connect(voter3); + txCastVote = await voter3ConnectTokenContract.castVote( + "33305536448279361826260693304629530695162329813830343837048230642993916376403", + 0 + ); + await txCastVote.wait(1); + + const deployerConnectTokenContract = governor.connect(deployer); + txCastVote = await deployerConnectTokenContract.castVote( + "33305536448279361826260693304629530695162329813830343837048230642993916376403", + 1 + ); + await txCastVote.wait(1); + }); + it("queuning and execute", async () => { + const projectOwnerConnectContract = await governor.connect( + projectOwner + ); + projectOwnerIndex = + await projectOwnerConnectContract.getCurrentProjectId(); + + const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMQQ"; + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(args) + ); + const encodedFunctionCall = governor.interface.encodeFunctionData( + FUNC_FUND, + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwnerIndex] + ); + governor = await ethers.getContract("GovernerContract", deployer); + console.log("Queueing..."); + const queueTx = await governor.queue( + [governor.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await queueTx.wait(1); + console.log("Queued"); + + console.log("Executing..."); + + const executeTx = await governor.execute( + [governor.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + expect(executeTx).to.emit(governor, "projectGoesToFunding"); + await executeTx.wait(1); + console.log("Executed!"); + + projectId = await governor._getProjectId(args); + }); + }); + + /* describe("setup other accounts onlyones", () => { + it("transfer and delegate", async () => { + gtToken = await ethers.getContract("GovernanceToken", deployer); + let tx1 = await gtToken.transfer( + voter2.address, + ethers.utils.parseEther("500000") + ); + tx1 = await gtToken.transfer( + voter3.address, + ethers.utils.parseEther("300000") + ); + + await tx1.wait(1); + + const voter2ConnectToken = gtToken.connect(voter2); + tx1 = await voter2ConnectToken.delegate(voter2.address); + await tx1.wait(1); + + const voter3ConnectToken = gtToken.connect(voter3); + tx1 = await voter3ConnectToken.delegate(voter3.address); + await tx1.wait(1); + assert(tx1); + }); + }); */ + }); diff --git a/test/unit/dao.test.js b/test/unit/dao.unit.test.js similarity index 92% rename from test/unit/dao.test.js rename to test/unit/dao.unit.test.js index 6342a4f..54a9a51 100644 --- a/test/unit/dao.test.js +++ b/test/unit/dao.unit.test.js @@ -21,19 +21,22 @@ const fs = require("fs"); account1, account2, account3, - projectOwner, + projectOwnerIndex, governor, timeLock, fund, - blockNumber; + blockNumber, + projectOwner; + beforeEach(async function () { account1 = (await ethers.getSigners())[1]; account2 = (await ethers.getSigners())[2]; account3 = (await ethers.getSigners())[3]; projectOwner = (await ethers.getSigners())[4]; deployer = (await getNamedAccounts()).deployer; - projectOwner = deployer; + await deployments.fixture("all"); + gtToken = await ethers.getContract("GovernanceToken"); governor = await ethers.getContract("GovernerContract"); timeLock = await ethers.getContract("TimeLock"); @@ -126,31 +129,46 @@ const fs = require("fs"); blockNumber - 1 )}` ); - const letsTry = await ethers.getContract( - "GovernanceToken", - projectOwner - ); - const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; - const encodedFunctionCall = governor.interface.encodeFunctionData( - FUNC_FUND, - [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner] - ); - - const enteranceFee = await governor.getEnteranceFee(); + const projectOwnerConnectContract = governor.connect(projectOwner); + const enteranceFee = + await projectOwnerConnectContract.getEnteranceFee(); + projectOwnerIndex = + await projectOwnerConnectContract.getCurrentProjectId(); + const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; await expect( governor.propose( [governor.address], [0], - [encodedFunctionCall], + [ + projectOwnerConnectContract.interface.encodeFunctionData( + FUNC_FUND, + [ + args, + s_fundRaisingGoalAmount, + s_fundingTime, + projectOwnerIndex, + ] + ), + ], args ) ).to.be.revertedWith(`GovernerContract__NeedEnteranceFee`); - const payFee = await governor.paySubmitFee({ value: enteranceFee }); + const payFee = await projectOwnerConnectContract.paySubmitFee({ + value: enteranceFee, + }); await payFee.wait(1); + projectOwnerIndex = + await projectOwnerConnectContract.getCurrentProjectId(); - const proposalTx = await governor.propose( + const encodedFunctionCall = + projectOwnerConnectContract.interface.encodeFunctionData( + FUNC_FUND, + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwnerIndex] + ); + + const proposalTx = await projectOwnerConnectContract.propose( [governor.address], [0], [encodedFunctionCall], @@ -341,23 +359,21 @@ const fs = require("fs"); blockNumber = await ethers.provider.getBlockNumber(); - const letsTry = await ethers.getContract( - "GovernanceToken", - projectOwner - ); - const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; - const encodedFunctionCall = governor.interface.encodeFunctionData( - FUNC_FUND, - [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner] - ); - const enteranceFee = await governor.getEnteranceFee(); - + projectOwnerIndex = await governor.getCurrentProjectId(); + const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; await expect( governor.propose( [governor.address], [0], - [encodedFunctionCall], + [ + governor.interface.encodeFunctionData(FUNC_FUND, [ + args, + s_fundRaisingGoalAmount, + s_fundingTime, + projectOwnerIndex, + ]), + ], args ) ).to.be.revertedWith(`GovernerContract__NeedEnteranceFee`); @@ -365,6 +381,11 @@ const fs = require("fs"); const payFee = await governor.paySubmitFee({ value: enteranceFee }); await payFee.wait(1); + const encodedFunctionCall = governor.interface.encodeFunctionData( + FUNC_FUND, + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwnerIndex] + ); + const proposalTx = await governor.propose( [governor.address], [0], diff --git a/test/unit/fundContract.test.js b/test/unit/fundContract.unit.test.js similarity index 78% rename from test/unit/fundContract.test.js rename to test/unit/fundContract.unit.test.js index b8f99b1..217a853 100644 --- a/test/unit/fundContract.test.js +++ b/test/unit/fundContract.unit.test.js @@ -21,6 +21,7 @@ const fs = require("fs"); account2, account3, projectOwner, + projectOwnerIndex, governor, timeLock, proposalState, @@ -36,7 +37,6 @@ const fs = require("fs"); projectOwner = (await ethers.getSigners())[4]; investor = (await ethers.getSigners())[5]; deployer = (await getNamedAccounts()).deployer; - projectOwner = deployer; await deployments.fixture("all"); gtToken = await ethers.getContract("GovernanceToken"); @@ -73,25 +73,26 @@ const fs = require("fs"); const { upkeepNeeded } = await governor.checkUpkeep([]); assert(!upkeepNeeded); - await ethers.getContract("GovernanceToken", projectOwner); + const projectOwnerConnect = governor.connect(projectOwner); const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; + projectOwnerIndex = await projectOwnerConnect.getCurrentProjectId(); - const encodedFunctionCall = governor.interface.encodeFunctionData( - FUNC_FUND, - [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner] - ); - - const enteranceFee = await governor.getEnteranceFee(); + const encodedFunctionCall = + projectOwnerConnect.interface.encodeFunctionData(FUNC_FUND, [ + args, + s_fundRaisingGoalAmount, + s_fundingTime, + projectOwnerIndex, + ]); - await expect( - governor.propose([governor.address], [0], [encodedFunctionCall], args) - ).to.be.revertedWith("GovernerContract__NeedEnteranceFee"); + const enteranceFee = await projectOwnerConnect.getEnteranceFee(); - const payFee = await governor.paySubmitFee({ value: enteranceFee }); + const payFee = await projectOwnerConnect.paySubmitFee({ + value: enteranceFee, + }); await payFee.wait(1); - assert(await governor.isEnteranceFeePaid(projectOwner)); - const proposalTx = await governor.propose( + const proposalTx = await projectOwnerConnect.propose( [governor.address], [0], [encodedFunctionCall], @@ -173,13 +174,18 @@ const fs = require("fs"); assert(await governor._isApporoveFundingByDao(projectId)); const invest = ethers.utils.parseUnits("1", "ether"); - await ethers.getContract("GovernerContract", investor); - const invTx = await governor.fund(projectId, { value: invest }); + const investorConnectContract = governor.connect(investor); + + const invTx = await investorConnectContract.fund(projectId, { + value: invest, + }); expect().to.emit(governor, "enteranceFeePaid"); await invTx.wait(1); assert.equal( - (await governor.getFunderBalance(projectId)).toString(), + ( + await investorConnectContract.getFunderBalance(projectId) + ).toString(), invest.toString() ); @@ -235,15 +241,43 @@ const fs = require("fs"); }); it("checking funding process", async () => { - const invest = ethers.utils.parseUnits("1", "ether"); + const invest = ethers.utils.parseUnits("10", "ether"); + const projectOwnerConnect = await governor.connect(projectOwner); + const projectOwnerBalanceBefore = + await projectOwnerConnect.provider.getBalance(projectOwner.address); + console.log( + ethers.utils.formatEther(projectOwnerBalanceBefore).toString() + ); - await ethers.getContract("GovernerContract", investor); - const invTx = await governor.fund(projectId, { value: invest }); + const investorConnectContract = await governor.connect(investor); + console.log( + ` investorBalanceBefore = ${ethers.utils + .formatEther( + await investorConnectContract.provider.getBalance( + investor.address + ) + ) + .toString()}` + ); + const invTx = await investorConnectContract.fund(projectId, { + value: invest, + }); await invTx.wait(1); + console.log( + ` investorBalanceAfter = ${ethers.utils + .formatEther( + await investorConnectContract.provider.getBalance( + investor.address + ) + ) + .toString()}` + ); assert.equal( - (await governor.getFunderBalance(projectId)).toString(), + ( + await investorConnectContract.getFunderBalance(projectId) + ).toString(), invest.toString() ); @@ -255,6 +289,12 @@ const fs = require("fs"); ) ).to.emit(governor, "projectSuccessfullyFunded"); + const projectOwnerBalanceAfter = + await projectOwnerConnect.provider.getBalance(projectOwner.address); + console.log( + ethers.utils.formatEther(projectOwnerBalanceAfter).toString() + ); + assert.equal(await governor.is_funding(projectId), false); assert.equal( await governor._isApporoveFundingByDao(projectId), From 82cfbdb0fb332f30e2904f989f4abdb0a0fc0672 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Sun, 13 Nov 2022 23:37:02 +0300 Subject: [PATCH 24/28] Fix bugs update code v2 --- test/staging/dao.staging.test.js | 39 ++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/test/staging/dao.staging.test.js b/test/staging/dao.staging.test.js index ddc3cc7..2f21c42 100644 --- a/test/staging/dao.staging.test.js +++ b/test/staging/dao.staging.test.js @@ -24,6 +24,7 @@ developmentChains.includes(network.name) beforeEach(async () => { deployer = (await getNamedAccounts()).deployer; + deployer = await ethers.getSigner(deployer); projectOwner = await ethers.getSigner( ( await getNamedAccounts() @@ -55,7 +56,7 @@ developmentChains.includes(network.name) }); describe("submit a project", () => { it("submitting", async () => { - const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMQQ"; + const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMAQ"; const projectOwnerConnectContract = await governor.connect( projectOwner ); @@ -89,21 +90,21 @@ developmentChains.includes(network.name) it("Make the vote!", async () => { const voter2ConnectTokenContract = governor.connect(voter2); let txCastVote = await voter2ConnectTokenContract.castVote( - "33305536448279361826260693304629530695162329813830343837048230642993916376403", + "14094970548360658432981678952890731821083177440208283154284427752347616310142", 1 ); await txCastVote.wait(1); const voter3ConnectTokenContract = governor.connect(voter3); txCastVote = await voter3ConnectTokenContract.castVote( - "33305536448279361826260693304629530695162329813830343837048230642993916376403", + "14094970548360658432981678952890731821083177440208283154284427752347616310142", 0 ); await txCastVote.wait(1); const deployerConnectTokenContract = governor.connect(deployer); txCastVote = await deployerConnectTokenContract.castVote( - "33305536448279361826260693304629530695162329813830343837048230642993916376403", + "14094970548360658432981678952890731821083177440208283154284427752347616310142", 1 ); await txCastVote.wait(1); @@ -115,7 +116,7 @@ developmentChains.includes(network.name) projectOwnerIndex = await projectOwnerConnectContract.getCurrentProjectId(); - const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMQQ"; + const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMAQ"; const descriptionHash = ethers.utils.keccak256( ethers.utils.toUtf8Bytes(args) ); @@ -148,6 +149,34 @@ developmentChains.includes(network.name) projectId = await governor._getProjectId(args); }); + + it("Lets fund!", async () => { + const invest = ethers.utils.parseUnits("0.1", "ether"); + const investorConnectContract = await governor.connect(deployer); + console.log( + ` investorBalanceBefore = ${ethers.utils + .formatEther( + await investorConnectContract.provider.getBalance( + deployer.address + ) + ) + .toString()}` + ); + + const invTx = await investorConnectContract.fund(2, { + value: invest, + }); + await invTx.wait(1); + console.log( + ` investorBalanceAfter = ${ethers.utils + .formatEther( + await investorConnectContract.provider.getBalance( + deployer.address + ) + ) + .toString()}` + ); + }); }); /* describe("setup other accounts onlyones", () => { From 54c2dcb17ec316aa2f411818a4271201bf30c532 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Thu, 17 Nov 2022 17:50:55 +0300 Subject: [PATCH 25/28] deployed mumbai testnet --- contracts/GovernanceToken.sol | 4 +- deployments/localhost/GovernanceToken.json | 32 ++-- deployments/localhost/GovernerContract.json | 92 +++++++--- deployments/localhost/TimeLock.json | 46 ++--- .../9bb96e2ab1a2d14e7d6f1254972fa73c.json | 158 ------------------ gas-report-ethMainnet.txt | 47 ++++++ gas-report-matic.txt | 47 ++++++ hardhat.config.js | 16 +- helper-config.js | 5 + test/staging/dao.staging.test.js | 16 +- test/unit/dao.unit.test.js | 4 +- 11 files changed, 231 insertions(+), 236 deletions(-) delete mode 100644 deployments/localhost/solcInputs/9bb96e2ab1a2d14e7d6f1254972fa73c.json create mode 100644 gas-report-ethMainnet.txt create mode 100644 gas-report-matic.txt diff --git a/contracts/GovernanceToken.sol b/contracts/GovernanceToken.sol index cabdaf6..7c7d437 100644 --- a/contracts/GovernanceToken.sol +++ b/contracts/GovernanceToken.sol @@ -14,8 +14,8 @@ contract GovernanceToken is ERC20Votes, Ownable { ); constructor() - ERC20("GovernanceToken", "GT") - ERC20Permit("GovernanceToken") + ERC20("QuickfundDAOToken", "QFD") + ERC20Permit("QuickfundDAOToken") { _mint(msg.sender, s_initialSupply); } diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index f51ab4f..b08d953 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -715,21 +715,21 @@ "type": "function" } ], - "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", + "transactionHash": "0x4cd470da21b7f9a3372dd75c94d5b044c42e3c9ad47353d492c8736e45e36854", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "transactionIndex": 0, - "gasUsed": "3780772", + "gasUsed": "2040267", "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000410000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000001000000000002000000008000000000020000000000000000000000000200000000000000000000000800000000000000000", - "blockHash": "0x2af51296db5025865c915e1643b65de8185d747daa680a993fba3c246b06d241", - "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", + "blockHash": "0x4345f2a1f91201a2990cb67fddf5d8301dc9cf8eee42760b621fbcf470d23d75", + "transactionHash": "0x4cd470da21b7f9a3372dd75c94d5b044c42e3c9ad47353d492c8736e45e36854", "logs": [ { "transactionIndex": 0, "blockNumber": 2, - "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", + "transactionHash": "0x4cd470da21b7f9a3372dd75c94d5b044c42e3c9ad47353d492c8736e45e36854", "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", @@ -738,12 +738,12 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x2af51296db5025865c915e1643b65de8185d747daa680a993fba3c246b06d241" + "blockHash": "0x4345f2a1f91201a2990cb67fddf5d8301dc9cf8eee42760b621fbcf470d23d75" }, { "transactionIndex": 0, "blockNumber": 2, - "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", + "transactionHash": "0x4cd470da21b7f9a3372dd75c94d5b044c42e3c9ad47353d492c8736e45e36854", "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", @@ -752,12 +752,12 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 1, - "blockHash": "0x2af51296db5025865c915e1643b65de8185d747daa680a993fba3c246b06d241" + "blockHash": "0x4345f2a1f91201a2990cb67fddf5d8301dc9cf8eee42760b621fbcf470d23d75" }, { "transactionIndex": 0, "blockNumber": 2, - "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", + "transactionHash": "0x4cd470da21b7f9a3372dd75c94d5b044c42e3c9ad47353d492c8736e45e36854", "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "topics": [ "0xd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6", @@ -766,20 +766,20 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 2, - "blockHash": "0x2af51296db5025865c915e1643b65de8185d747daa680a993fba3c246b06d241" + "blockHash": "0x4345f2a1f91201a2990cb67fddf5d8301dc9cf8eee42760b621fbcf470d23d75" } ], "blockNumber": 2, - "cumulativeGasUsed": "3780772", + "cumulativeGasUsed": "2040267", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "9bb96e2ab1a2d14e7d6f1254972fa73c", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"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\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_initialSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"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.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"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/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes, Ownable {\\n uint256 public s_initialSupply = 1000000e18;\\n\\n event TokenTransfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n _mint(msg.sender, s_initialSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n emit TokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount)\\n internal\\n override(ERC20Votes)\\n onlyOwner\\n {\\n super._mint(to, amount);\\n }\\n\\n function mintToken(address to, uint256 amount) external {\\n _mint(to, amount);\\n }\\n\\n function burnToken(address account, uint256 amount) external {\\n _burn(account, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xa092abf2f4621743762f91889e716f2f475be65a32165fca151a4741f2c58ca3\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x61014060405269d3c21bcecceda1000000600b553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000fea565b5080600490816200011d919062000fea565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001898184846200020d60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505050620001f3620001e76200024960201b60201c565b6200025160201b60201c565b6200020733600b546200031760201b60201c565b6200157a565b600083838346306040516020016200022a95949392919062001142565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003276200034260201b60201c565b6200033e8282620003d360201b6200107a1760201c565b5050565b620003526200024960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003786200049160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c89062001200565b60405180910390fd5b565b620003ea8282620004bb60201b620011071760201c565b620003fa6200063360201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620004286200065760201b60201c565b11156200046c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004639062001298565b60405180910390fd5b6200048b60096200066160201b6200126617836200067960201b60201c565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000524906200130a565b60405180910390fd5b62000541600083836200092a60201b60201c565b80600260008282546200055591906200135b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005ac91906200135b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000613919062001396565b60405180910390a36200062f600083836200092f60201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b600081836200067191906200135b565b905092915050565b60008060008580549050905060008114620006ee57856001826200069e9190620013b3565b81548110620006b257620006b1620013ee565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620006f1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200071d83858760201c565b915060008111801562000776575043866001836200073c9190620013b3565b8154811062000750576200074f620013ee565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1562000817576200079282620009b360201b6200127c1760201c565b86600183620007a29190620013b3565b81548110620007b657620007b5620013ee565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000921565b856040518060400160405280620008394362000a2160201b620012e71760201c565b63ffffffff1681526020016200085a85620009b360201b6200127c1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b6200094783838362000a7760201b6200133a1760201c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051620009a6919062001396565b60405180910390a3505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a109062001493565b60405180910390fd5b819050919050565b600063ffffffff801682111562000a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a66906200152b565b60405180910390fd5b819050919050565b62000a8f83838362000ac760201b620013651760201c565b62000ac262000aa48462000acc60201b60201c565b62000ab58462000acc60201b60201c565b8362000b3560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000b725750600081115b1562000d5357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000c655760008062000c0c600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000d5860201b6200136a17856200067960201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c5a9291906200154d565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000d525760008062000cf9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200066160201b6200126617856200067960201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000d479291906200154d565b60405180910390a250505b5b505050565b6000818362000d689190620013b3565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000df257607f821691505b60208210810362000e085762000e0762000daa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000e727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000e33565b62000e7e868362000e33565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ecb62000ec562000ebf8462000e96565b62000ea0565b62000e96565b9050919050565b6000819050919050565b62000ee78362000eaa565b62000eff62000ef68262000ed2565b84845462000e40565b825550505050565b600090565b62000f1662000f07565b62000f2381848462000edc565b505050565b5b8181101562000f4b5762000f3f60008262000f0c565b60018101905062000f29565b5050565b601f82111562000f9a5762000f648162000e0e565b62000f6f8462000e23565b8101602085101562000f7f578190505b62000f9762000f8e8562000e23565b83018262000f28565b50505b505050565b600082821c905092915050565b600062000fbf6000198460080262000f9f565b1980831691505092915050565b600062000fda838362000fac565b9150826002028217905092915050565b62000ff58262000d70565b67ffffffffffffffff81111562001011576200101062000d7b565b5b6200101d825462000dd9565b6200102a82828562000f4f565b600060209050601f8311600181146200106257600084156200104d578287015190505b62001059858262000fcc565b865550620010c9565b601f198416620010728662000e0e565b60005b828110156200109c5784890151825560018201915060208501945060208101905062001075565b86831015620010bc5784890151620010b8601f89168262000fac565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b620010e681620010d1565b82525050565b620010f78162000e96565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200112a82620010fd565b9050919050565b6200113c816200111d565b82525050565b600060a082019050620011596000830188620010db565b620011686020830187620010db565b620011776040830186620010db565b620011866060830185620010ec565b62001195608083018462001131565b9695505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620011e86020836200119f565b9150620011f582620011b0565b602082019050919050565b600060208201905081810360008301526200121b81620011d9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000620012806030836200119f565b91506200128d8262001222565b604082019050919050565b60006020820190508181036000830152620012b38162001271565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620012f2601f836200119f565b9150620012ff82620012ba565b602082019050919050565b600060208201905081810360008301526200132581620012e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013688262000e96565b9150620013758362000e96565b925082820190508082111562001390576200138f6200132c565b5b92915050565b6000602082019050620013ad6000830184620010ec565b92915050565b6000620013c08262000e96565b9150620013cd8362000e96565b9250828203905081811115620013e857620013e76200132c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200147b6027836200119f565b915062001488826200141d565b604082019050919050565b60006020820190508181036000830152620014ae816200146c565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620015136026836200119f565b91506200152082620014b5565b604082019050919050565b60006020820190508181036000830152620015468162001504565b9050919050565b6000604082019050620015646000830185620010ec565b620015736020830184620010ec565b9392505050565b60805160a05160c05160e0516101005161012051613ed6620015ca600039600061190a0152600061194c0152600061192b01526000611860015260006118b6015260006118df0152613ed66000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610555578063dd62ed3e14610571578063f1127ed8146105a1578063f2fde38b146105d1576101c4565b8063a9059cbb146104ed578063c3cda5201461051d578063d1df306c14610539576101c4565b80638e539e8c116100d35780638e539e8c1461043f57806395d89b411461046f5780639ab24eb01461048d578063a457c2d7146104bd576101c4565b806379c65068146103d55780637ecebe00146103f15780638da5cb5b14610421576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461034f5780636fcfff451461036b57806370a082311461039b578063715018a6146103cb576101c4565b806339509351146102bf5780633a46b1a8146102ef578063587cde1e1461031f576101c4565b806318160ddd116101a257806318160ddd1461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf14610217575b600080fd5b6101d16105ed565b6040516101de9190612907565b60405180910390f35b61020160048036038101906101fc91906129c2565b61067f565b60405161020e9190612a1d565b60405180910390f35b61021f6106a2565b60405161022c9190612a47565b60405180910390f35b61023d6106a8565b60405161024a9190612a47565b60405180910390f35b61026d60048036038101906102689190612a62565b6106b2565b60405161027a9190612a1d565b60405180910390f35b61028b6106e1565b6040516102989190612ad1565b60405180910390f35b6102a96106ea565b6040516102b69190612b05565b60405180910390f35b6102d960048036038101906102d491906129c2565b6106f9565b6040516102e69190612a1d565b60405180910390f35b610309600480360381019061030491906129c2565b610730565b6040516103169190612a47565b60405180910390f35b61033960048036038101906103349190612b20565b6107c4565b6040516103469190612b5c565b60405180910390f35b61036960048036038101906103649190612b20565b61082d565b005b61038560048036038101906103809190612b20565b610841565b6040516103929190612b96565b60405180910390f35b6103b560048036038101906103b09190612b20565b610895565b6040516103c29190612a47565b60405180910390f35b6103d36108dd565b005b6103ef60048036038101906103ea91906129c2565b6108f1565b005b61040b60048036038101906104069190612b20565b6108ff565b6040516104189190612a47565b60405180910390f35b61042961094f565b6040516104369190612b5c565b60405180910390f35b61045960048036038101906104549190612bb1565b610979565b6040516104669190612a47565b60405180910390f35b6104776109cf565b6040516104849190612907565b60405180910390f35b6104a760048036038101906104a29190612b20565b610a61565b6040516104b49190612a47565b60405180910390f35b6104d760048036038101906104d291906129c2565b610b72565b6040516104e49190612a1d565b60405180910390f35b610507600480360381019061050291906129c2565b610be9565b6040516105149190612a1d565b60405180910390f35b61053760048036038101906105329190612c36565b610c0c565b005b610553600480360381019061054e91906129c2565b610d10565b005b61056f600480360381019061056a9190612cc3565b610d1e565b005b61058b60048036038101906105869190612d65565b610e60565b6040516105989190612a47565b60405180910390f35b6105bb60048036038101906105b69190612dd1565b610ee7565b6040516105c89190612e86565b60405180910390f35b6105eb60048036038101906105e69190612b20565b610ff7565b005b6060600380546105fc90612ed0565b80601f016020809104026020016040519081016040528092919081815260200182805461062890612ed0565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60008061068a611380565b9050610697818585611388565b600191505092915050565b600b5481565b6000600254905090565b6000806106bd611380565b90506106ca858285611551565b6106d58585856115dd565b60019150509392505050565b60006012905090565b60006106f461185c565b905090565b600080610704611380565b90506107258185856107168589610e60565b6107209190612f30565b611388565b600191505092915050565b6000438210610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90612fb0565b60405180910390fd5b6107bc600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611976565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61083e610838611380565b82611a82565b50565b600061088e600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506112e7565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108e5611b9c565b6108ef6000611c1a565b565b6108fb8282611ce0565b5050565b6000610948600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cf6565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612fb0565b60405180910390fd5b6109c8600983611976565b9050919050565b6060600480546109de90612ed0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90612ed0565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b4957600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610afd9190612fd0565b81548110610b0e57610b0d613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b4c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610b7d611380565b90506000610b8b8286610e60565b905083811015610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906130a5565b60405180910390fd5b610bdd8286868403611388565b60019250505092915050565b600080610bf4611380565b9050610c018185856115dd565b600191505092915050565b83421115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613111565b60405180910390fd5b6000610cb1610ca97fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610c8e9493929190613131565b60405160208183030381529060405280519060200120611d04565b858585611d1e565b9050610cbc81611d49565b8614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906131c2565b60405180910390fd5b610d078188611a82565b50505050505050565b610d1a8282611da7565b5050565b83421115610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061322e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d908c611d49565b89604051602001610da69695949392919061324e565b6040516020818303038152906040528051906020012090506000610dc982611d04565b90506000610dd982878787611d1e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906132fb565b60405180910390fd5b610e548a8a8a611388565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610eef612839565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f4657610f45613004565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610fff611b9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110659061338d565b60405180910390fd5b61107781611c1a565b50565b6110848282611107565b61108c611db5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110b26106a8565b11156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061341f565b60405180910390fd5b611101600961126683611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061348b565b60405180910390fd5b61118260008383612051565b80600260008282546111949190612f30565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e99190612f30565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124e9190612a47565b60405180910390a361126260008383612056565b5050565b600081836112749190612f30565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061351d565b60405180910390fd5b819050919050565b600063ffffffff8016821115611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906135af565b60405180910390fd5b819050919050565b611345838383611365565b611360611351846107c4565b61135a846107c4565b836120cb565b505050565b505050565b600081836113789190612fd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90613641565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906136d3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115449190612a47565b60405180910390a3505050565b600061155d8484610e60565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115d757818110156115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061373f565b60405180910390fd5b6115d68484848403611388565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906137d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613863565b60405180910390fd5b6116c6838383612051565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906138f5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117df9190612f30565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118439190612a47565b60405180910390a3611856848484612056565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156118d857507f000000000000000000000000000000000000000000000000000000000000000046145b15611905577f00000000000000000000000000000000000000000000000000000000000000009050611973565b6119707f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122c4565b90505b90565b6000808380549050905060005b818110156119f557600061199782846122fe565b9050848682815481106119ad576119ac613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156119df578092506119ef565b6001816119ec9190612f30565b91505b50611983565b60008214611a575784600183611a0b9190612fd0565b81548110611a1c57611a1b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611a5a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000611a8d836107c4565b90506000611a9a84610895565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b968284836120cb565b50505050565b611ba4611380565b73ffffffffffffffffffffffffffffffffffffffff16611bc261094f565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613961565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ce8611b9c565b611cf2828261107a565b5050565b600081600001549050919050565b6000611d17611d1161185c565b83612324565b9050919050565b6000806000611d2f87878787612357565b91509150611d3c81612463565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9681611cf6565b9150611da18161262f565b50919050565b611db18282612645565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611e475785600182611dfb9190612fd0565b81548110611e0c57611e0b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611e4a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611e7883858763ffffffff16565b9150600081118015611ecb57504386600183611e949190612fd0565b81548110611ea557611ea4613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f5857611ed98261127c565b86600183611ee79190612fd0565b81548110611ef857611ef7613004565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612048565b856040518060400160405280611f6d436112e7565b63ffffffff168152602001611f818561127c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b61206183838361133a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516120be9190612a47565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121075750600081115b156122bf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121e55760008061218e600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136a85611dd9565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121da929190613981565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122be57600080612267600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061126685611dd9565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122b3929190613981565b60405180910390a250505b5b505050565b600083838346306040516020016122df9594939291906139aa565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861230f9190613a2c565b82841661231c9190612f30565b905092915050565b60008282604051602001612339929190613ad5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561239257600060039150915061245a565b601b8560ff16141580156123aa5750601c8560ff1614155b156123bc57600060049150915061245a565b6000600187878787604051600081526020016040526040516123e19493929190613b0c565b6020604051602081039080840390855afa158015612403573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124515760006001925092505061245a565b80600092509250505b94509492505050565b6000600481111561247757612476613b51565b5b81600481111561248a57612489613b51565b5b031561262c57600160048111156124a4576124a3613b51565b5b8160048111156124b7576124b6613b51565b5b036124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90613bcc565b60405180910390fd5b6002600481111561250b5761250a613b51565b5b81600481111561251e5761251d613b51565b5b0361255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613c38565b60405180910390fd5b6003600481111561257257612571613b51565b5b81600481111561258557612584613b51565b5b036125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc90613cca565b60405180910390fd5b6004808111156125d8576125d7613b51565b5b8160048111156125eb576125ea613b51565b5b0361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290613d5c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61264f8282612663565b61265d600961136a83611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990613dee565b60405180910390fd5b6126de82600083612051565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613e80565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127bb9190612fd0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128209190612a47565b60405180910390a361283483600084612056565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b1578082015181840152602081019050612896565b60008484015250505050565b6000601f19601f8301169050919050565b60006128d982612877565b6128e38185612882565b93506128f3818560208601612893565b6128fc816128bd565b840191505092915050565b6000602082019050818103600083015261292181846128ce565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129598261292e565b9050919050565b6129698161294e565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b6000819050919050565b61299f8161298c565b81146129aa57600080fd5b50565b6000813590506129bc81612996565b92915050565b600080604083850312156129d9576129d8612929565b5b60006129e785828601612977565b92505060206129f8858286016129ad565b9150509250929050565b60008115159050919050565b612a1781612a02565b82525050565b6000602082019050612a326000830184612a0e565b92915050565b612a418161298c565b82525050565b6000602082019050612a5c6000830184612a38565b92915050565b600080600060608486031215612a7b57612a7a612929565b5b6000612a8986828701612977565b9350506020612a9a86828701612977565b9250506040612aab868287016129ad565b9150509250925092565b600060ff82169050919050565b612acb81612ab5565b82525050565b6000602082019050612ae66000830184612ac2565b92915050565b6000819050919050565b612aff81612aec565b82525050565b6000602082019050612b1a6000830184612af6565b92915050565b600060208284031215612b3657612b35612929565b5b6000612b4484828501612977565b91505092915050565b612b568161294e565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600063ffffffff82169050919050565b612b9081612b77565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b600060208284031215612bc757612bc6612929565b5b6000612bd5848285016129ad565b91505092915050565b612be781612ab5565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b612c1381612aec565b8114612c1e57600080fd5b50565b600081359050612c3081612c0a565b92915050565b60008060008060008060c08789031215612c5357612c52612929565b5b6000612c6189828a01612977565b9650506020612c7289828a016129ad565b9550506040612c8389828a016129ad565b9450506060612c9489828a01612bf5565b9350506080612ca589828a01612c21565b92505060a0612cb689828a01612c21565b9150509295509295509295565b600080600080600080600060e0888a031215612ce257612ce1612929565b5b6000612cf08a828b01612977565b9750506020612d018a828b01612977565b9650506040612d128a828b016129ad565b9550506060612d238a828b016129ad565b9450506080612d348a828b01612bf5565b93505060a0612d458a828b01612c21565b92505060c0612d568a828b01612c21565b91505092959891949750929550565b60008060408385031215612d7c57612d7b612929565b5b6000612d8a85828601612977565b9250506020612d9b85828601612977565b9150509250929050565b612dae81612b77565b8114612db957600080fd5b50565b600081359050612dcb81612da5565b92915050565b60008060408385031215612de857612de7612929565b5b6000612df685828601612977565b9250506020612e0785828601612dbc565b9150509250929050565b612e1a81612b77565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612e5181612e20565b82525050565b604082016000820151612e6d6000850182612e11565b506020820151612e806020850182612e48565b50505050565b6000604082019050612e9b6000830184612e57565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ee857607f821691505b602082108103612efb57612efa612ea1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f3b8261298c565b9150612f468361298c565b9250828201905080821115612f5e57612f5d612f01565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612f9a601f83612882565b9150612fa582612f64565b602082019050919050565b60006020820190508181036000830152612fc981612f8d565b9050919050565b6000612fdb8261298c565b9150612fe68361298c565b9250828203905081811115612ffe57612ffd612f01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061308f602583612882565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006130fb601d83612882565b9150613106826130c5565b602082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b60006080820190506131466000830187612af6565b6131536020830186612b4d565b6131606040830185612a38565b61316d6060830184612a38565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006131ac601983612882565b91506131b782613176565b602082019050919050565b600060208201905081810360008301526131db8161319f565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613218601d83612882565b9150613223826131e2565b602082019050919050565b600060208201905081810360008301526132478161320b565b9050919050565b600060c0820190506132636000830189612af6565b6132706020830188612b4d565b61327d6040830187612b4d565b61328a6060830186612a38565b6132976080830185612a38565b6132a460a0830184612a38565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006132e5601e83612882565b91506132f0826132af565b602082019050919050565b60006020820190508181036000830152613314816132d8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613377602683612882565b91506133828261331b565b604082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613409603083612882565b9150613414826133ad565b604082019050919050565b60006020820190508181036000830152613438816133fc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613475601f83612882565b91506134808261343f565b602082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000613507602783612882565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613599602683612882565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362b602483612882565b9150613636826135cf565b604082019050919050565b6000602082019050818103600083015261365a8161361e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136bd602283612882565b91506136c882613661565b604082019050919050565b600060208201905081810360008301526136ec816136b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613729601d83612882565b9150613734826136f3565b602082019050919050565b600060208201905081810360008301526137588161371c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bb602583612882565b91506137c68261375f565b604082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061384d602383612882565b9150613858826137f1565b604082019050919050565b6000602082019050818103600083015261387c81613840565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138df602683612882565b91506138ea82613883565b604082019050919050565b6000602082019050818103600083015261390e816138d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061394b602083612882565b915061395682613915565b602082019050919050565b6000602082019050818103600083015261397a8161393e565b9050919050565b60006040820190506139966000830185612a38565b6139a36020830184612a38565b9392505050565b600060a0820190506139bf6000830188612af6565b6139cc6020830187612af6565b6139d96040830186612af6565b6139e66060830185612a38565b6139f36080830184612b4d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a378261298c565b9150613a428361298c565b925082613a5257613a516139fd565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a9e600283613a5d565b9150613aa982613a68565b600282019050919050565b6000819050919050565b613acf613aca82612aec565b613ab4565b82525050565b6000613ae082613a91565b9150613aec8285613abe565b602082019150613afc8284613abe565b6020820191508190509392505050565b6000608082019050613b216000830187612af6565b613b2e6020830186612ac2565b613b3b6040830185612af6565b613b486060830184612af6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bb6601883612882565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c22601f83612882565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cb4602283612882565b9150613cbf82613c58565b604082019050919050565b60006020820190508181036000830152613ce381613ca7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d46602283612882565b9150613d5182613cea565b604082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd8602183612882565b9150613de382613d7c565b604082019050919050565b60006020820190508181036000830152613e0781613dcb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6a602283612882565b9150613e7582613e0e565b604082019050919050565b60006020820190508181036000830152613e9981613e5d565b905091905056fea264697066735822122017be51580e499600e196331255d1b51b80dc95152f4ab3928e0760c4b3acb21e64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610555578063dd62ed3e14610571578063f1127ed8146105a1578063f2fde38b146105d1576101c4565b8063a9059cbb146104ed578063c3cda5201461051d578063d1df306c14610539576101c4565b80638e539e8c116100d35780638e539e8c1461043f57806395d89b411461046f5780639ab24eb01461048d578063a457c2d7146104bd576101c4565b806379c65068146103d55780637ecebe00146103f15780638da5cb5b14610421576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461034f5780636fcfff451461036b57806370a082311461039b578063715018a6146103cb576101c4565b806339509351146102bf5780633a46b1a8146102ef578063587cde1e1461031f576101c4565b806318160ddd116101a257806318160ddd1461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf14610217575b600080fd5b6101d16105ed565b6040516101de9190612907565b60405180910390f35b61020160048036038101906101fc91906129c2565b61067f565b60405161020e9190612a1d565b60405180910390f35b61021f6106a2565b60405161022c9190612a47565b60405180910390f35b61023d6106a8565b60405161024a9190612a47565b60405180910390f35b61026d60048036038101906102689190612a62565b6106b2565b60405161027a9190612a1d565b60405180910390f35b61028b6106e1565b6040516102989190612ad1565b60405180910390f35b6102a96106ea565b6040516102b69190612b05565b60405180910390f35b6102d960048036038101906102d491906129c2565b6106f9565b6040516102e69190612a1d565b60405180910390f35b610309600480360381019061030491906129c2565b610730565b6040516103169190612a47565b60405180910390f35b61033960048036038101906103349190612b20565b6107c4565b6040516103469190612b5c565b60405180910390f35b61036960048036038101906103649190612b20565b61082d565b005b61038560048036038101906103809190612b20565b610841565b6040516103929190612b96565b60405180910390f35b6103b560048036038101906103b09190612b20565b610895565b6040516103c29190612a47565b60405180910390f35b6103d36108dd565b005b6103ef60048036038101906103ea91906129c2565b6108f1565b005b61040b60048036038101906104069190612b20565b6108ff565b6040516104189190612a47565b60405180910390f35b61042961094f565b6040516104369190612b5c565b60405180910390f35b61045960048036038101906104549190612bb1565b610979565b6040516104669190612a47565b60405180910390f35b6104776109cf565b6040516104849190612907565b60405180910390f35b6104a760048036038101906104a29190612b20565b610a61565b6040516104b49190612a47565b60405180910390f35b6104d760048036038101906104d291906129c2565b610b72565b6040516104e49190612a1d565b60405180910390f35b610507600480360381019061050291906129c2565b610be9565b6040516105149190612a1d565b60405180910390f35b61053760048036038101906105329190612c36565b610c0c565b005b610553600480360381019061054e91906129c2565b610d10565b005b61056f600480360381019061056a9190612cc3565b610d1e565b005b61058b60048036038101906105869190612d65565b610e60565b6040516105989190612a47565b60405180910390f35b6105bb60048036038101906105b69190612dd1565b610ee7565b6040516105c89190612e86565b60405180910390f35b6105eb60048036038101906105e69190612b20565b610ff7565b005b6060600380546105fc90612ed0565b80601f016020809104026020016040519081016040528092919081815260200182805461062890612ed0565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60008061068a611380565b9050610697818585611388565b600191505092915050565b600b5481565b6000600254905090565b6000806106bd611380565b90506106ca858285611551565b6106d58585856115dd565b60019150509392505050565b60006012905090565b60006106f461185c565b905090565b600080610704611380565b90506107258185856107168589610e60565b6107209190612f30565b611388565b600191505092915050565b6000438210610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90612fb0565b60405180910390fd5b6107bc600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611976565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61083e610838611380565b82611a82565b50565b600061088e600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506112e7565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108e5611b9c565b6108ef6000611c1a565b565b6108fb8282611ce0565b5050565b6000610948600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cf6565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612fb0565b60405180910390fd5b6109c8600983611976565b9050919050565b6060600480546109de90612ed0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90612ed0565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b4957600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610afd9190612fd0565b81548110610b0e57610b0d613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b4c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610b7d611380565b90506000610b8b8286610e60565b905083811015610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906130a5565b60405180910390fd5b610bdd8286868403611388565b60019250505092915050565b600080610bf4611380565b9050610c018185856115dd565b600191505092915050565b83421115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613111565b60405180910390fd5b6000610cb1610ca97fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610c8e9493929190613131565b60405160208183030381529060405280519060200120611d04565b858585611d1e565b9050610cbc81611d49565b8614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906131c2565b60405180910390fd5b610d078188611a82565b50505050505050565b610d1a8282611da7565b5050565b83421115610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061322e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d908c611d49565b89604051602001610da69695949392919061324e565b6040516020818303038152906040528051906020012090506000610dc982611d04565b90506000610dd982878787611d1e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906132fb565b60405180910390fd5b610e548a8a8a611388565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610eef612839565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f4657610f45613004565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610fff611b9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110659061338d565b60405180910390fd5b61107781611c1a565b50565b6110848282611107565b61108c611db5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110b26106a8565b11156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061341f565b60405180910390fd5b611101600961126683611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061348b565b60405180910390fd5b61118260008383612051565b80600260008282546111949190612f30565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e99190612f30565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124e9190612a47565b60405180910390a361126260008383612056565b5050565b600081836112749190612f30565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061351d565b60405180910390fd5b819050919050565b600063ffffffff8016821115611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906135af565b60405180910390fd5b819050919050565b611345838383611365565b611360611351846107c4565b61135a846107c4565b836120cb565b505050565b505050565b600081836113789190612fd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90613641565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906136d3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115449190612a47565b60405180910390a3505050565b600061155d8484610e60565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115d757818110156115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061373f565b60405180910390fd5b6115d68484848403611388565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906137d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613863565b60405180910390fd5b6116c6838383612051565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906138f5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117df9190612f30565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118439190612a47565b60405180910390a3611856848484612056565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156118d857507f000000000000000000000000000000000000000000000000000000000000000046145b15611905577f00000000000000000000000000000000000000000000000000000000000000009050611973565b6119707f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122c4565b90505b90565b6000808380549050905060005b818110156119f557600061199782846122fe565b9050848682815481106119ad576119ac613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156119df578092506119ef565b6001816119ec9190612f30565b91505b50611983565b60008214611a575784600183611a0b9190612fd0565b81548110611a1c57611a1b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611a5a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000611a8d836107c4565b90506000611a9a84610895565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b968284836120cb565b50505050565b611ba4611380565b73ffffffffffffffffffffffffffffffffffffffff16611bc261094f565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613961565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ce8611b9c565b611cf2828261107a565b5050565b600081600001549050919050565b6000611d17611d1161185c565b83612324565b9050919050565b6000806000611d2f87878787612357565b91509150611d3c81612463565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9681611cf6565b9150611da18161262f565b50919050565b611db18282612645565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611e475785600182611dfb9190612fd0565b81548110611e0c57611e0b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611e4a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611e7883858763ffffffff16565b9150600081118015611ecb57504386600183611e949190612fd0565b81548110611ea557611ea4613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f5857611ed98261127c565b86600183611ee79190612fd0565b81548110611ef857611ef7613004565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612048565b856040518060400160405280611f6d436112e7565b63ffffffff168152602001611f818561127c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b61206183838361133a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516120be9190612a47565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121075750600081115b156122bf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121e55760008061218e600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136a85611dd9565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121da929190613981565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122be57600080612267600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061126685611dd9565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122b3929190613981565b60405180910390a250505b5b505050565b600083838346306040516020016122df9594939291906139aa565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861230f9190613a2c565b82841661231c9190612f30565b905092915050565b60008282604051602001612339929190613ad5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561239257600060039150915061245a565b601b8560ff16141580156123aa5750601c8560ff1614155b156123bc57600060049150915061245a565b6000600187878787604051600081526020016040526040516123e19493929190613b0c565b6020604051602081039080840390855afa158015612403573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124515760006001925092505061245a565b80600092509250505b94509492505050565b6000600481111561247757612476613b51565b5b81600481111561248a57612489613b51565b5b031561262c57600160048111156124a4576124a3613b51565b5b8160048111156124b7576124b6613b51565b5b036124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90613bcc565b60405180910390fd5b6002600481111561250b5761250a613b51565b5b81600481111561251e5761251d613b51565b5b0361255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613c38565b60405180910390fd5b6003600481111561257257612571613b51565b5b81600481111561258557612584613b51565b5b036125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc90613cca565b60405180910390fd5b6004808111156125d8576125d7613b51565b5b8160048111156125eb576125ea613b51565b5b0361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290613d5c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61264f8282612663565b61265d600961136a83611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990613dee565b60405180910390fd5b6126de82600083612051565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613e80565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127bb9190612fd0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128209190612a47565b60405180910390a361283483600084612056565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b1578082015181840152602081019050612896565b60008484015250505050565b6000601f19601f8301169050919050565b60006128d982612877565b6128e38185612882565b93506128f3818560208601612893565b6128fc816128bd565b840191505092915050565b6000602082019050818103600083015261292181846128ce565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129598261292e565b9050919050565b6129698161294e565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b6000819050919050565b61299f8161298c565b81146129aa57600080fd5b50565b6000813590506129bc81612996565b92915050565b600080604083850312156129d9576129d8612929565b5b60006129e785828601612977565b92505060206129f8858286016129ad565b9150509250929050565b60008115159050919050565b612a1781612a02565b82525050565b6000602082019050612a326000830184612a0e565b92915050565b612a418161298c565b82525050565b6000602082019050612a5c6000830184612a38565b92915050565b600080600060608486031215612a7b57612a7a612929565b5b6000612a8986828701612977565b9350506020612a9a86828701612977565b9250506040612aab868287016129ad565b9150509250925092565b600060ff82169050919050565b612acb81612ab5565b82525050565b6000602082019050612ae66000830184612ac2565b92915050565b6000819050919050565b612aff81612aec565b82525050565b6000602082019050612b1a6000830184612af6565b92915050565b600060208284031215612b3657612b35612929565b5b6000612b4484828501612977565b91505092915050565b612b568161294e565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600063ffffffff82169050919050565b612b9081612b77565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b600060208284031215612bc757612bc6612929565b5b6000612bd5848285016129ad565b91505092915050565b612be781612ab5565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b612c1381612aec565b8114612c1e57600080fd5b50565b600081359050612c3081612c0a565b92915050565b60008060008060008060c08789031215612c5357612c52612929565b5b6000612c6189828a01612977565b9650506020612c7289828a016129ad565b9550506040612c8389828a016129ad565b9450506060612c9489828a01612bf5565b9350506080612ca589828a01612c21565b92505060a0612cb689828a01612c21565b9150509295509295509295565b600080600080600080600060e0888a031215612ce257612ce1612929565b5b6000612cf08a828b01612977565b9750506020612d018a828b01612977565b9650506040612d128a828b016129ad565b9550506060612d238a828b016129ad565b9450506080612d348a828b01612bf5565b93505060a0612d458a828b01612c21565b92505060c0612d568a828b01612c21565b91505092959891949750929550565b60008060408385031215612d7c57612d7b612929565b5b6000612d8a85828601612977565b9250506020612d9b85828601612977565b9150509250929050565b612dae81612b77565b8114612db957600080fd5b50565b600081359050612dcb81612da5565b92915050565b60008060408385031215612de857612de7612929565b5b6000612df685828601612977565b9250506020612e0785828601612dbc565b9150509250929050565b612e1a81612b77565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612e5181612e20565b82525050565b604082016000820151612e6d6000850182612e11565b506020820151612e806020850182612e48565b50505050565b6000604082019050612e9b6000830184612e57565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ee857607f821691505b602082108103612efb57612efa612ea1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f3b8261298c565b9150612f468361298c565b9250828201905080821115612f5e57612f5d612f01565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612f9a601f83612882565b9150612fa582612f64565b602082019050919050565b60006020820190508181036000830152612fc981612f8d565b9050919050565b6000612fdb8261298c565b9150612fe68361298c565b9250828203905081811115612ffe57612ffd612f01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061308f602583612882565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006130fb601d83612882565b9150613106826130c5565b602082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b60006080820190506131466000830187612af6565b6131536020830186612b4d565b6131606040830185612a38565b61316d6060830184612a38565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006131ac601983612882565b91506131b782613176565b602082019050919050565b600060208201905081810360008301526131db8161319f565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613218601d83612882565b9150613223826131e2565b602082019050919050565b600060208201905081810360008301526132478161320b565b9050919050565b600060c0820190506132636000830189612af6565b6132706020830188612b4d565b61327d6040830187612b4d565b61328a6060830186612a38565b6132976080830185612a38565b6132a460a0830184612a38565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006132e5601e83612882565b91506132f0826132af565b602082019050919050565b60006020820190508181036000830152613314816132d8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613377602683612882565b91506133828261331b565b604082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613409603083612882565b9150613414826133ad565b604082019050919050565b60006020820190508181036000830152613438816133fc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613475601f83612882565b91506134808261343f565b602082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000613507602783612882565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613599602683612882565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362b602483612882565b9150613636826135cf565b604082019050919050565b6000602082019050818103600083015261365a8161361e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136bd602283612882565b91506136c882613661565b604082019050919050565b600060208201905081810360008301526136ec816136b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613729601d83612882565b9150613734826136f3565b602082019050919050565b600060208201905081810360008301526137588161371c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bb602583612882565b91506137c68261375f565b604082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061384d602383612882565b9150613858826137f1565b604082019050919050565b6000602082019050818103600083015261387c81613840565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138df602683612882565b91506138ea82613883565b604082019050919050565b6000602082019050818103600083015261390e816138d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061394b602083612882565b915061395682613915565b602082019050919050565b6000602082019050818103600083015261397a8161393e565b9050919050565b60006040820190506139966000830185612a38565b6139a36020830184612a38565b9392505050565b600060a0820190506139bf6000830188612af6565b6139cc6020830187612af6565b6139d96040830186612af6565b6139e66060830185612a38565b6139f36080830184612b4d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a378261298c565b9150613a428361298c565b925082613a5257613a516139fd565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a9e600283613a5d565b9150613aa982613a68565b600282019050919050565b6000819050919050565b613acf613aca82612aec565b613ab4565b82525050565b6000613ae082613a91565b9150613aec8285613abe565b602082019150613afc8284613abe565b6020820191508190509392505050565b6000608082019050613b216000830187612af6565b613b2e6020830186612ac2565b613b3b6040830185612af6565b613b486060830184612af6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bb6601883612882565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c22601f83612882565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cb4602283612882565b9150613cbf82613c58565b604082019050919050565b60006020820190508181036000830152613ce381613ca7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d46602283612882565b9150613d5182613cea565b604082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd8602183612882565b9150613de382613d7c565b604082019050919050565b60006020820190508181036000830152613e0781613dcb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6a602283612882565b9150613e7582613e0e565b604082019050919050565b60006020820190508181036000830152613e9981613e5d565b905091905056fea264697066735822122017be51580e499600e196331255d1b51b80dc95152f4ab3928e0760c4b3acb21e64736f6c63430008110033", + "solcInputHash": "a1407720c5f6b2a7e45e84dbad9d7fc2", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"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\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_initialSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"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.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"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/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes, Ownable {\\n uint256 public s_initialSupply = 1000000e18;\\n\\n event TokenTransfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n _mint(msg.sender, s_initialSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n emit TokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount)\\n internal\\n override(ERC20Votes)\\n onlyOwner\\n {\\n super._mint(to, amount);\\n }\\n\\n function mintToken(address to, uint256 amount) external {\\n _mint(to, amount);\\n }\\n\\n function burnToken(address account, uint256 amount) external {\\n _burn(account, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xa092abf2f4621743762f91889e716f2f475be65a32165fca151a4741f2c58ca3\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x61014060405269d3c21bcecceda1000000600b553480156200002057600080fd5b506040518060400160405280600f81526020016e23b7bb32b93730b731b2aa37b5b2b760891b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600f81526020016e23b7bb32b93730b731b2aa37b5b2b760891b8152506040518060400160405280600281526020016111d560f21b8152508160039080519060200190620000bf92919062000899565b508051620000d590600490602084019062000899565b5050825160209384012082519284019290922060e08390526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818901819052818301979097526060810194909452608080850193909352308483018190528151808603909301835260c0948501909152815191909601209052929092526101205250620001749050336200018e565b6200018833600b54620001e060201b60201c565b620009d3565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001ea62000205565b6200020182826200026760201b62000b891760201c565b5050565b600a546001600160a01b03163314620002655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6200027e82826200031a60201b62000c191760201c565b6001600160e01b0362000292620004098216565b1115620002fb5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016200025c565b62000314600962000d006200040f60201b178362000424565b50505050565b6001600160a01b038216620003725760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200025c565b80600260008282546200038691906200094b565b90915550506001600160a01b03821660009081526020819052604081208054839290620003b59084906200094b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36200020160008383620005db565b60025490565b60006200041d82846200094b565b9392505050565b8254600090819080156200047657856200044060018362000966565b8154811062000453576200045362000980565b60009182526020909120015464010000000090046001600160e01b031662000479565b60005b6001600160e01b031692506200049083858760201c565b9150600081118015620004d457504386620004ad60018462000966565b81548110620004c057620004c062000980565b60009182526020909120015463ffffffff16145b156200054857620004f0826200064660201b62000d0c1760201c565b86620004fe60018462000966565b8154811062000511576200051162000980565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550620005cd565b8560405180604001604052806200056a43620006b560201b62000d791760201c565b63ffffffff1681526020016200058b856200064660201b62000d0c1760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b620005f38383836200071c60201b62000dde1760201c565b816001600160a01b0316836001600160a01b03167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516200063991815260200190565b60405180910390a3505050565b60006001600160e01b03821115620006b15760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200025c565b5090565b600063ffffffff821115620006b15760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200025c565b62000734838383620005d660201b62000e101760201c565b6001600160a01b03838116600090815260076020526040808220548584168352912054620005d692918216911683818314801590620007735750600081115b15620005d6576001600160a01b0383161562000800576001600160a01b038316600090815260086020908152604082208291620007bd91906200088b901b62000e15178562000424565b91509150846001600160a01b0316600080516020620029f98339815191528383604051620007f5929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615620005d6576001600160a01b0382166000908152600860209081526040822082916200084491906200040f901b62000d00178562000424565b91509150836001600160a01b0316600080516020620029f983398151915283836040516200087c929190918252602082015260400190565b60405180910390a25050505050565b60006200041d828462000966565b828054620008a79062000996565b90600052602060002090601f016020900481019282620008cb576000855562000916565b82601f10620008e657805160ff191683800117855562000916565b8280016001018555821562000916579182015b8281111562000916578251825591602001919060010190620008f9565b50620006b19291505b80821115620006b157600081556001016200091f565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000961576200096162000935565b500190565b6000828210156200097b576200097b62000935565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620009ab57607f821691505b60208210811415620009cd57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051611fd662000a23600039600061121801526000611267015260006112420152600061119b015260006111c5015260006111ef0152611fd66000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf146103dc578063dd62ed3e146103ef578063f1127ed814610402578063f2fde38b1461043f57600080fd5b8063a9059cbb146103a3578063c3cda520146103b6578063d1df306c146103c957600080fd5b80638e539e8c116100d35780638e539e8c1461036257806395d89b41146103755780639ab24eb01461037d578063a457c2d71461039057600080fd5b806379c650681461032b5780637ecebe001461033e5780638da5cb5b1461035157600080fd5b806339509351116101665780635c19a95c116101405780635c19a95c146102bd5780636fcfff45146102d257806370a08231146102fa578063715018a61461032357600080fd5b806339509351146102535780633a46b1a814610266578063587cde1e1461027957600080fd5b806318160ddd116101a257806318160ddd1461022157806323b872dd14610229578063313ce5671461023c5780633644e5151461024b57600080fd5b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf1461020a575b600080fd5b6101d1610452565b6040516101de9190611c87565b60405180910390f35b6101fa6101f5366004611cf8565b6104e4565b60405190151581526020016101de565b610213600b5481565b6040519081526020016101de565b600254610213565b6101fa610237366004611d22565b6104fc565b604051601281526020016101de565b610213610520565b6101fa610261366004611cf8565b61052f565b610213610274366004611cf8565b610551565b6102a5610287366004611d5e565b6001600160a01b039081166000908152600760205260409020541690565b6040516001600160a01b0390911681526020016101de565b6102d06102cb366004611d5e565b6105d0565b005b6102e56102e0366004611d5e565b6105dd565b60405163ffffffff90911681526020016101de565b610213610308366004611d5e565b6001600160a01b031660009081526020819052604090205490565b6102d0610605565b6102d0610339366004611cf8565b610619565b61021361034c366004611d5e565b610627565b600a546001600160a01b03166102a5565b610213610370366004611d79565b610645565b6101d16106a1565b61021361038b366004611d5e565b6106b0565b6101fa61039e366004611cf8565b610737565b6101fa6103b1366004611cf8565b6107b2565b6102d06103c4366004611da3565b6107c0565b6102d06103d7366004611cf8565b6108f6565b6102d06103ea366004611dfb565b610900565b6102136103fd366004611e65565b610a64565b610415610410366004611e98565b610a8f565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016101de565b6102d061044d366004611d5e565b610b13565b60606003805461046190611ed8565b80601f016020809104026020016040519081016040528092919081815260200182805461048d90611ed8565b80156104da5780601f106104af576101008083540402835291602001916104da565b820191906000526020600020905b8154815290600101906020018083116104bd57829003601f168201915b5050505050905090565b6000336104f2818585610e21565b5060019392505050565b60003361050a858285610f46565b610515858585610fba565b506001949350505050565b600061052a61118e565b905090565b6000336104f28185856105428383610a64565b61054c9190611f23565b610e21565b60004382106105a75760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064015b60405180910390fd5b6001600160a01b03831660009081526008602052604090206105c990836112b5565b9392505050565b6105da3382611372565b50565b6001600160a01b0381166000908152600860205260408120546105ff90610d79565b92915050565b61060d6113eb565b6106176000611445565b565b6106238282611497565b5050565b6001600160a01b0381166000908152600560205260408120546105ff565b60004382106106965760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161059e565b6105ff6009836112b5565b60606004805461046190611ed8565b6001600160a01b0381166000908152600860205260408120548015610724576001600160a01b03831660009081526008602052604090206106f2600183611f3b565b8154811061070257610702611f52565b60009182526020909120015464010000000090046001600160e01b0316610727565b60005b6001600160e01b03169392505050565b600033816107458286610a64565b9050838110156107a55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161059e565b6105158286868403610e21565b6000336104f2818585610fba565b834211156108105760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161059e565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009061088a906108829060a001604051602081830303815290604052805190602001206114a9565b8585856114f7565b90506108958161151f565b86146108e35760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161059e565b6108ed8188611372565b50505050505050565b6106238282611547565b834211156109505760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161059e565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861097f8c61151f565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006109da826114a9565b905060006109ea828787876114f7565b9050896001600160a01b0316816001600160a01b031614610a4d5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161059e565b610a588a8a8a610e21565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60408051808201909152600080825260208201526001600160a01b0383166000908152600860205260409020805463ffffffff8416908110610ad357610ad3611f52565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b610b1b6113eb565b6001600160a01b038116610b805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161059e565b6105da81611445565b610b938282610c19565b6002546001600160e01b031015610c055760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840161059e565b610c136009610d0083611551565b50505050565b6001600160a01b038216610c6f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161059e565b8060026000828254610c819190611f23565b90915550506001600160a01b03821660009081526020819052604081208054839290610cae908490611f23565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610623600083836116ca565b60006105c98284611f23565b60006001600160e01b03821115610d755760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161059e565b5090565b600063ffffffff821115610d755760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161059e565b6001600160a01b03838116600090815260076020526040808220548584168352912054610e109291821691168361171a565b505050565b60006105c98284611f3b565b6001600160a01b038316610e835760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161059e565b6001600160a01b038216610ee45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161059e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610f528484610a64565b90506000198114610c135781811015610fad5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161059e565b610c138484848403610e21565b6001600160a01b03831661101e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161059e565b6001600160a01b0382166110805760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161059e565b6001600160a01b038316600090815260208190526040902054818110156110f85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161059e565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061112f908490611f23565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161117b91815260200190565b60405180910390a3610c138484846116ca565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156111e757507f000000000000000000000000000000000000000000000000000000000000000046145b1561121157507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b818110156113195760006112d08284611857565b9050848682815481106112e5576112e5611f52565b60009182526020909120015463ffffffff16111561130557809250611313565b611310816001611f23565b91505b506112bc565b811561135d578461132b600184611f3b565b8154811061133b5761133b611f52565b60009182526020909120015464010000000090046001600160e01b0316611360565b60005b6001600160e01b031695945050505050565b6001600160a01b038281166000818152600760208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610c1382848361171a565b600a546001600160a01b031633146106175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161059e565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61149f6113eb565b6106238282610b89565b60006105ff6114b661118e565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061150887878787611872565b915091506115158161195f565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6106238282611b1a565b82546000908190801561159c578561156a600183611f3b565b8154811061157a5761157a611f52565b60009182526020909120015464010000000090046001600160e01b031661159f565b60005b6001600160e01b031692506115b883858763ffffffff16565b91506000811180156115f6575043866115d2600184611f3b565b815481106115e2576115e2611f52565b60009182526020909120015463ffffffff16145b156116565761160482610d0c565b86611610600184611f3b565b8154811061162057611620611f52565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b031602179055506116c1565b85604051806040016040528061166b43610d79565b63ffffffff16815260200161167f85610d0c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6116d5838383610dde565b816001600160a01b0316836001600160a01b03167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051610f3991815260200190565b816001600160a01b0316836001600160a01b03161415801561173c5750600081115b15610e10576001600160a01b038316156117ca576001600160a01b0383166000908152600860205260408120819061177790610e1585611551565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516117bf929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610e10576001600160a01b0382166000908152600860205260408120819061180090610d0085611551565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611848929190918252602082015260400190565b60405180910390a25050505050565b60006118666002848418611f68565b6105c990848416611f23565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156118a95750600090506003611956565b8460ff16601b141580156118c157508460ff16601c14155b156118d25750600090506004611956565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611926573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661194f57600060019250925050611956565b9150600090505b94509492505050565b600081600481111561197357611973611f8a565b141561197c5750565b600181600481111561199057611990611f8a565b14156119de5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161059e565b60028160048111156119f2576119f2611f8a565b1415611a405760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161059e565b6003816004811115611a5457611a54611f8a565b1415611aad5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161059e565b6004816004811115611ac157611ac1611f8a565b14156105da5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161059e565b611b248282611b32565b610c136009610e1583611551565b6001600160a01b038216611b925760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161059e565b6001600160a01b03821660009081526020819052604090205481811015611c065760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161059e565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611c35908490611f3b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610e10836000846116ca565b600060208083528351808285015260005b81811015611cb457858101830151858201604001528201611c98565b81811115611cc6576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114611cf357600080fd5b919050565b60008060408385031215611d0b57600080fd5b611d1483611cdc565b946020939093013593505050565b600080600060608486031215611d3757600080fd5b611d4084611cdc565b9250611d4e60208501611cdc565b9150604084013590509250925092565b600060208284031215611d7057600080fd5b6105c982611cdc565b600060208284031215611d8b57600080fd5b5035919050565b803560ff81168114611cf357600080fd5b60008060008060008060c08789031215611dbc57600080fd5b611dc587611cdc565b95506020870135945060408701359350611de160608801611d92565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215611e1657600080fd5b611e1f88611cdc565b9650611e2d60208901611cdc565b95506040880135945060608801359350611e4960808901611d92565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611e7857600080fd5b611e8183611cdc565b9150611e8f60208401611cdc565b90509250929050565b60008060408385031215611eab57600080fd5b611eb483611cdc565b9150602083013563ffffffff81168114611ecd57600080fd5b809150509250929050565b600181811c90821680611eec57607f821691505b6020821081141561154157634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115611f3657611f36611f0d565b500190565b600082821015611f4d57611f4d611f0d565b500390565b634e487b7160e01b600052603260045260246000fd5b600082611f8557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220b3ac892852d1453dc0de8fc234a475d39cc4d78139ac703680e549b1f22b995c64736f6c63430008090033dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf146103dc578063dd62ed3e146103ef578063f1127ed814610402578063f2fde38b1461043f57600080fd5b8063a9059cbb146103a3578063c3cda520146103b6578063d1df306c146103c957600080fd5b80638e539e8c116100d35780638e539e8c1461036257806395d89b41146103755780639ab24eb01461037d578063a457c2d71461039057600080fd5b806379c650681461032b5780637ecebe001461033e5780638da5cb5b1461035157600080fd5b806339509351116101665780635c19a95c116101405780635c19a95c146102bd5780636fcfff45146102d257806370a08231146102fa578063715018a61461032357600080fd5b806339509351146102535780633a46b1a814610266578063587cde1e1461027957600080fd5b806318160ddd116101a257806318160ddd1461022157806323b872dd14610229578063313ce5671461023c5780633644e5151461024b57600080fd5b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf1461020a575b600080fd5b6101d1610452565b6040516101de9190611c87565b60405180910390f35b6101fa6101f5366004611cf8565b6104e4565b60405190151581526020016101de565b610213600b5481565b6040519081526020016101de565b600254610213565b6101fa610237366004611d22565b6104fc565b604051601281526020016101de565b610213610520565b6101fa610261366004611cf8565b61052f565b610213610274366004611cf8565b610551565b6102a5610287366004611d5e565b6001600160a01b039081166000908152600760205260409020541690565b6040516001600160a01b0390911681526020016101de565b6102d06102cb366004611d5e565b6105d0565b005b6102e56102e0366004611d5e565b6105dd565b60405163ffffffff90911681526020016101de565b610213610308366004611d5e565b6001600160a01b031660009081526020819052604090205490565b6102d0610605565b6102d0610339366004611cf8565b610619565b61021361034c366004611d5e565b610627565b600a546001600160a01b03166102a5565b610213610370366004611d79565b610645565b6101d16106a1565b61021361038b366004611d5e565b6106b0565b6101fa61039e366004611cf8565b610737565b6101fa6103b1366004611cf8565b6107b2565b6102d06103c4366004611da3565b6107c0565b6102d06103d7366004611cf8565b6108f6565b6102d06103ea366004611dfb565b610900565b6102136103fd366004611e65565b610a64565b610415610410366004611e98565b610a8f565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016101de565b6102d061044d366004611d5e565b610b13565b60606003805461046190611ed8565b80601f016020809104026020016040519081016040528092919081815260200182805461048d90611ed8565b80156104da5780601f106104af576101008083540402835291602001916104da565b820191906000526020600020905b8154815290600101906020018083116104bd57829003601f168201915b5050505050905090565b6000336104f2818585610e21565b5060019392505050565b60003361050a858285610f46565b610515858585610fba565b506001949350505050565b600061052a61118e565b905090565b6000336104f28185856105428383610a64565b61054c9190611f23565b610e21565b60004382106105a75760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064015b60405180910390fd5b6001600160a01b03831660009081526008602052604090206105c990836112b5565b9392505050565b6105da3382611372565b50565b6001600160a01b0381166000908152600860205260408120546105ff90610d79565b92915050565b61060d6113eb565b6106176000611445565b565b6106238282611497565b5050565b6001600160a01b0381166000908152600560205260408120546105ff565b60004382106106965760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161059e565b6105ff6009836112b5565b60606004805461046190611ed8565b6001600160a01b0381166000908152600860205260408120548015610724576001600160a01b03831660009081526008602052604090206106f2600183611f3b565b8154811061070257610702611f52565b60009182526020909120015464010000000090046001600160e01b0316610727565b60005b6001600160e01b03169392505050565b600033816107458286610a64565b9050838110156107a55760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161059e565b6105158286868403610e21565b6000336104f2818585610fba565b834211156108105760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161059e565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b03881691810191909152606081018690526080810185905260009061088a906108829060a001604051602081830303815290604052805190602001206114a9565b8585856114f7565b90506108958161151f565b86146108e35760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161059e565b6108ed8188611372565b50505050505050565b6106238282611547565b834211156109505760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161059e565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861097f8c61151f565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006109da826114a9565b905060006109ea828787876114f7565b9050896001600160a01b0316816001600160a01b031614610a4d5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161059e565b610a588a8a8a610e21565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60408051808201909152600080825260208201526001600160a01b0383166000908152600860205260409020805463ffffffff8416908110610ad357610ad3611f52565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b610b1b6113eb565b6001600160a01b038116610b805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161059e565b6105da81611445565b610b938282610c19565b6002546001600160e01b031015610c055760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840161059e565b610c136009610d0083611551565b50505050565b6001600160a01b038216610c6f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161059e565b8060026000828254610c819190611f23565b90915550506001600160a01b03821660009081526020819052604081208054839290610cae908490611f23565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610623600083836116ca565b60006105c98284611f23565b60006001600160e01b03821115610d755760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161059e565b5090565b600063ffffffff821115610d755760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161059e565b6001600160a01b03838116600090815260076020526040808220548584168352912054610e109291821691168361171a565b505050565b60006105c98284611f3b565b6001600160a01b038316610e835760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161059e565b6001600160a01b038216610ee45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161059e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610f528484610a64565b90506000198114610c135781811015610fad5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161059e565b610c138484848403610e21565b6001600160a01b03831661101e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161059e565b6001600160a01b0382166110805760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161059e565b6001600160a01b038316600090815260208190526040902054818110156110f85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161059e565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061112f908490611f23565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161117b91815260200190565b60405180910390a3610c138484846116ca565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156111e757507f000000000000000000000000000000000000000000000000000000000000000046145b1561121157507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b818110156113195760006112d08284611857565b9050848682815481106112e5576112e5611f52565b60009182526020909120015463ffffffff16111561130557809250611313565b611310816001611f23565b91505b506112bc565b811561135d578461132b600184611f3b565b8154811061133b5761133b611f52565b60009182526020909120015464010000000090046001600160e01b0316611360565b60005b6001600160e01b031695945050505050565b6001600160a01b038281166000818152600760208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610c1382848361171a565b600a546001600160a01b031633146106175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161059e565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61149f6113eb565b6106238282610b89565b60006105ff6114b661118e565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061150887878787611872565b915091506115158161195f565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6106238282611b1a565b82546000908190801561159c578561156a600183611f3b565b8154811061157a5761157a611f52565b60009182526020909120015464010000000090046001600160e01b031661159f565b60005b6001600160e01b031692506115b883858763ffffffff16565b91506000811180156115f6575043866115d2600184611f3b565b815481106115e2576115e2611f52565b60009182526020909120015463ffffffff16145b156116565761160482610d0c565b86611610600184611f3b565b8154811061162057611620611f52565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b031602179055506116c1565b85604051806040016040528061166b43610d79565b63ffffffff16815260200161167f85610d0c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b6116d5838383610dde565b816001600160a01b0316836001600160a01b03167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051610f3991815260200190565b816001600160a01b0316836001600160a01b03161415801561173c5750600081115b15610e10576001600160a01b038316156117ca576001600160a01b0383166000908152600860205260408120819061177790610e1585611551565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516117bf929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610e10576001600160a01b0382166000908152600860205260408120819061180090610d0085611551565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611848929190918252602082015260400190565b60405180910390a25050505050565b60006118666002848418611f68565b6105c990848416611f23565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156118a95750600090506003611956565b8460ff16601b141580156118c157508460ff16601c14155b156118d25750600090506004611956565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611926573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661194f57600060019250925050611956565b9150600090505b94509492505050565b600081600481111561197357611973611f8a565b141561197c5750565b600181600481111561199057611990611f8a565b14156119de5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161059e565b60028160048111156119f2576119f2611f8a565b1415611a405760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161059e565b6003816004811115611a5457611a54611f8a565b1415611aad5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161059e565b6004816004811115611ac157611ac1611f8a565b14156105da5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161059e565b611b248282611b32565b610c136009610e1583611551565b6001600160a01b038216611b925760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161059e565b6001600160a01b03821660009081526020819052604090205481811015611c065760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161059e565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611c35908490611f3b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610e10836000846116ca565b600060208083528351808285015260005b81811015611cb457858101830151858201604001528201611c98565b81811115611cc6576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114611cf357600080fd5b919050565b60008060408385031215611d0b57600080fd5b611d1483611cdc565b946020939093013593505050565b600080600060608486031215611d3757600080fd5b611d4084611cdc565b9250611d4e60208501611cdc565b9150604084013590509250925092565b600060208284031215611d7057600080fd5b6105c982611cdc565b600060208284031215611d8b57600080fd5b5035919050565b803560ff81168114611cf357600080fd5b60008060008060008060c08789031215611dbc57600080fd5b611dc587611cdc565b95506020870135945060408701359350611de160608801611d92565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215611e1657600080fd5b611e1f88611cdc565b9650611e2d60208901611cdc565b95506040880135945060608801359350611e4960808901611d92565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611e7857600080fd5b611e8183611cdc565b9150611e8f60208401611cdc565b90509250929050565b60008060408385031215611eab57600080fd5b611eb483611cdc565b9150602083013563ffffffff81168114611ecd57600080fd5b809150509250929050565b600181811c90821680611eec57607f821691505b6020821081141561154157634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115611f3657611f36611f0d565b500190565b600082821015611f4d57611f4d611f0d565b500390565b634e487b7160e01b600052603260045260246000fd5b600082611f8557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220b3ac892852d1453dc0de8fc234a475d39cc4d78139ac703680e549b1f22b995c64736f6c63430008090033", "devdoc": { "kind": "dev", "methods": { @@ -957,7 +957,7 @@ "type": "t_address" }, { - "astId": 10893, + "astId": 10916, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "s_initialSupply", "offset": 0, diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json index 82bac57..291e723 100644 --- a/deployments/localhost/GovernerContract.json +++ b/deployments/localhost/GovernerContract.json @@ -711,9 +711,9 @@ "type": "uint256" }, { - "internalType": "address", - "name": "_projectOwnerAddress", - "type": "address" + "internalType": "uint256", + "name": "_projectOwnerAddressIndex", + "type": "uint256" } ], "name": "apporoveFundingByDao", @@ -1030,6 +1030,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getCurrentProjectId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getDaoPercentage", @@ -1570,6 +1583,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "projectOwnerAddressIndex", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -2073,81 +2105,81 @@ "type": "receive" } ], - "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", + "transactionHash": "0x26e79c2e807253ac11dfeda2b147e04b966a8a219ad2a9d6fcd6c4dc1b90e49c", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "transactionIndex": 0, - "gasUsed": "8307777", + "gasUsed": "4829697", "logsBloom": "0x00000000000000000100000000001000000000000000000000800000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000001000000000000000010000000000000000000020000080002000100000800000000000000000000000000000000401000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000200000000000000000000000003000000000080000800020000000000000000000000000000000000000000000000000000000000000002000", - "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6", - "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", + "blockHash": "0x91a0e511322591a9fe54ffcce352cfbeb2475258639144f619cbfefef6e0209f", + "transactionHash": "0x26e79c2e807253ac11dfeda2b147e04b966a8a219ad2a9d6fcd6c4dc1b90e49c", "logs": [ { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", + "transactionHash": "0x26e79c2e807253ac11dfeda2b147e04b966a8a219ad2a9d6fcd6c4dc1b90e49c", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 0, - "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" + "blockHash": "0x91a0e511322591a9fe54ffcce352cfbeb2475258639144f619cbfefef6e0209f" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", + "transactionHash": "0x26e79c2e807253ac11dfeda2b147e04b966a8a219ad2a9d6fcd6c4dc1b90e49c", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" ], - "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8", + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032", "logIndex": 1, - "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" + "blockHash": "0x91a0e511322591a9fe54ffcce352cfbeb2475258639144f619cbfefef6e0209f" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", + "transactionHash": "0x26e79c2e807253ac11dfeda2b147e04b966a8a219ad2a9d6fcd6c4dc1b90e49c", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 2, - "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" + "blockHash": "0x91a0e511322591a9fe54ffcce352cfbeb2475258639144f619cbfefef6e0209f" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", + "transactionHash": "0x26e79c2e807253ac11dfeda2b147e04b966a8a219ad2a9d6fcd6c4dc1b90e49c", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 3, - "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" + "blockHash": "0x91a0e511322591a9fe54ffcce352cfbeb2475258639144f619cbfefef6e0209f" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", + "transactionHash": "0x26e79c2e807253ac11dfeda2b147e04b966a8a219ad2a9d6fcd6c4dc1b90e49c", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3", "logIndex": 4, - "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" + "blockHash": "0x91a0e511322591a9fe54ffcce352cfbeb2475258639144f619cbfefef6e0209f" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", + "transactionHash": "0x26e79c2e807253ac11dfeda2b147e04b966a8a219ad2a9d6fcd6c4dc1b90e49c", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", @@ -2156,11 +2188,11 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" + "blockHash": "0x91a0e511322591a9fe54ffcce352cfbeb2475258639144f619cbfefef6e0209f" } ], "blockNumber": 4, - "cumulativeGasUsed": "8307777", + "cumulativeGasUsed": "4829697", "status": 1, "byzantium": true }, @@ -2168,16 +2200,16 @@ "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "0x5FbDB2315678afecb367f032d93F642f64180aa3", 0, - 200, + 50, 0, "10000000000000000", "10" ], "numDeployments": 1, - "solcInputHash": "9bb96e2ab1a2d14e7d6f1254972fa73c", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enteranceFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_daoPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__EnteranceFeeNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotEnoughPayment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"FundProject__TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__UpkeepNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__WithdrawTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__withdrawFund\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NeedEnteranceFee\",\"type\":\"error\"},{\"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\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_projectOwner\",\"type\":\"address\"}],\"name\":\"enteranceFeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectFundingFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectGoesToFunding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectSuccessfullyFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"__investor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"__projectId\",\"type\":\"uint256\"}],\"name\":\"withdrawFundSuccessfully\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_ProjectFundingStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getBalanceOfProject\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"_getProjectStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isApporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_fundingGoalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_projectOwnerAddress\",\"type\":\"address\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDaoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEnteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"getFunderBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"investor\",\"type\":\"address\"}],\"name\":\"getInvestedProjects\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"getTimeleft\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"investedProjects\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"is_funding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paySubmitFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectToTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"withdrawFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"performUpkeep(bytes)\":{\"details\":\"The input to this method should not be trusted, and the caller of the method should not even be restricted to any single registry. Anyone should be able call it, and the input should be validated, there is no guarantee that the data passed in is the performData returned from checkUpkeep. This could happen due to malicious keepers, racing keepers, or simply a state change while the performUpkeep transaction is waiting for confirmation. Always validate the data passed in.\",\"params\":{\"performData\":\"is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state.\"}},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"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.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"performUpkeep(bytes)\":{\"notice\":\"method that is actually executed by the keepers, via the registry. The data returned by the checkUpkeep simulation will be passed into this method to actually be executed.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/AutomationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract AutomationBase {\\n error OnlySimulatedBackend();\\n\\n /**\\n * @notice method that allows it to be simulated via eth_call by checking that\\n * the sender is the zero address.\\n */\\n function preventExecution() internal view {\\n if (tx.origin != address(0)) {\\n revert OnlySimulatedBackend();\\n }\\n }\\n\\n /**\\n * @notice modifier that allows it to be simulated via eth_call by checking\\n * that the sender is the zero address.\\n */\\n modifier cannotExecute() {\\n preventExecution();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x5d354afa1a97dffe66094397cdcbb0c14713cf3d609d88fd8f9891010e9a351a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AutomationBase.sol\\\";\\nimport \\\"./interfaces/AutomationCompatibleInterface.sol\\\";\\n\\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\\n\",\"keccak256\":\"0x40e5ae0eff4edd0740c1b5590d09c344f84dee031e82d5294563e99603774f80\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror FundProject__NotApporovedByDao();\\nerror FundProject__UpkeepNeeded();\\nerror FundProject__TransferFailed(uint256 _projectId);\\nerror FundProject__NotEnoughPayment();\\nerror FundProject__withdrawFund();\\nerror FundProject__WithdrawTransferFailed();\\nerror FundProject__EnteranceFeeNeeded();\\n\\ncontract FundProject is Ownable, AutomationCompatibleInterface {\\n enum ProjectFundingStatus {\\n ONPROGRESS,\\n SUCCESS,\\n FAILED,\\n CANCELED\\n }\\n\\n uint256 public projectId = 1;\\n\\n uint public lastTimeStamp;\\n uint256 public daoPercentage;\\n uint256 public enteranceFee;\\n\\n mapping(uint256 => bool) public _isFunding;\\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\\n mapping(uint256 => uint256) public time;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders; // projectId => funderAddress => funderBalance\\n mapping(uint256 => uint256) public projectFunds;\\n mapping(uint256 => uint256) public projectFundingGoalAmount;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n mapping(uint256 => address) public projectOwnerAddress;\\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\\n mapping(address => bool) public _isEnteranceFeePaid;\\n mapping(address => uint256[]) public investedProjects; // investor address => investedProjects\\n\\n event projectSuccessfullyFunded(uint256 indexed _projectId);\\n event projectFundingFailed(uint256 indexed _projectId);\\n event enteranceFeePaid(address indexed _projectOwner);\\n event projectGoesToFunding(uint256 indexed _projectId);\\n event withdrawFundSuccessfully(\\n address indexed __investor,\\n uint256 indexed __projectId\\n );\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\\n lastTimeStamp = block.timestamp;\\n daoPercentage = _daoPercentage;\\n enteranceFee = _enteranceFee;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n projectFunds[_projecID] += msg.value;\\n investedProjects[msg.sender] = [_projecID]; // need testing\\n }\\n\\n function apporoveFundingByDao(\\n string memory _ipfsHash,\\n uint256 _fundingGoalAmount,\\n uint256 _time,\\n address _projectOwnerAddress\\n ) external onlyOwner {\\n // only dao can call it\\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\\n revert FundProject__EnteranceFeeNeeded();\\n } else {\\n projectToTime[projectId][_time] = block.timestamp;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\\n time[projectId] = _time;\\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n projectOwnerAddress[projectId] = _projectOwnerAddress;\\n _isApporovedByDao[projectId] = true;\\n _isFunding[projectId] = true;\\n emit projectGoesToFunding(projectId);\\n projectId++;\\n }\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call it\\n _isApporovedByDao[_projecID] = false;\\n _isFunding[projectId] = false;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\\n }\\n\\n function checkUpkeep(\\n bytes memory /* checkData */\\n )\\n public\\n view\\n override\\n returns (bool upkeepNeeded, bytes memory performData)\\n {\\n for (uint i = 1; i <= projectId; i++) {\\n bool isFunded = _isFunding[i];\\n bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) >\\n time[i];\\n upkeepNeeded = (isFunded && timePassed);\\n if (upkeepNeeded) {\\n performData = abi.encodePacked(i);\\n break;\\n }\\n }\\n }\\n\\n function performUpkeep(bytes calldata performData) external override {\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\n if (!upkeepNeeded) {\\n revert FundProject__UpkeepNeeded();\\n }\\n\\n uint256 ProjectId = uint256(bytes32(performData));\\n _isFunding[ProjectId] = false;\\n _isApporovedByDao[ProjectId] = false;\\n\\n if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) {\\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS;\\n uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) /\\n 100;\\n projectFunds[ProjectId] = 0;\\n (bool success, ) = (projectOwnerAddress[ProjectId]).call{\\n value: fundsToSent\\n }(\\\"\\\");\\n if (!success) {\\n revert FundProject__TransferFailed(projectFunds[ProjectId]);\\n }\\n\\n emit projectSuccessfullyFunded(ProjectId);\\n } else {\\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.FAILED;\\n emit projectFundingFailed(ProjectId);\\n }\\n }\\n\\n function paySubmitFee() public payable {\\n if (msg.value < enteranceFee) {\\n revert FundProject__NotEnoughPayment();\\n } else {\\n _isEnteranceFeePaid[msg.sender] = true;\\n emit enteranceFeePaid(msg.sender);\\n }\\n }\\n\\n function withdrawFund(uint256 _projectID) public {\\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\\n uint256 fundToSent = funders[_projectID][msg.sender];\\n funders[_projectID][msg.sender] = 0;\\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\\n \\\"\\\"\\n );\\n if (!success) {\\n revert FundProject__WithdrawTransferFailed();\\n }\\n emit withdrawFundSuccessfully(msg.sender, projectId);\\n } else {\\n revert FundProject__withdrawFund();\\n }\\n }\\n\\n function _isApporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n\\n function _getBalanceOfProject(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFunds[_projecID];\\n }\\n\\n function _getFundingGoalAmount(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFundingGoalAmount[_projecID];\\n }\\n\\n function is_funding(uint256 _projectID) public view returns (bool) {\\n return _isFunding[_projectID];\\n }\\n\\n function _getProjectStatus(uint256 _projectID)\\n public\\n view\\n returns (ProjectFundingStatus)\\n {\\n return _ProjectFundingStatus[_projectID];\\n }\\n\\n function getEnteranceFee() public view returns (uint256) {\\n return enteranceFee;\\n }\\n\\n function isEnteranceFeePaid(address account) public view returns (bool) {\\n return _isEnteranceFeePaid[account];\\n }\\n\\n function getFunderBalance(uint256 _projectID)\\n public\\n view\\n returns (uint256)\\n {\\n return funders[_projectID][msg.sender];\\n }\\n\\n function getInvestedProjects(address investor)\\n public\\n view\\n returns (uint256[] memory)\\n {\\n return investedProjects[investor]; // need testing\\n }\\n\\n function getDaoPercentage() public view returns (uint256) {\\n return daoPercentage;\\n }\\n\\n function getTimeleft(uint256 _projectID)\\n public\\n view\\n returns (uint256 a, uint256 b)\\n {\\n a = block.timestamp - projectToTime[_projectID][time[_projectID]];\\n b = time[_projectID];\\n }\\n}\\n\",\"keccak256\":\"0x02f9eea250f8d3c01957575bda4d62a5aa8df3d336d7b018b54b7698d17213ed\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\nimport \\\"./FundProject.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl,\\n FundProject\\n{\\n error GovernerContract__NeedEnteranceFee();\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage,\\n uint256 _enteranceFee,\\n uint256 _daoPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n FundProject(_enteranceFee, _daoPercentage)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n if (!_isEnteranceFeePaid[msg.sender]) {\\n revert GovernerContract__NeedEnteranceFee();\\n }\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x1713670032ac0e6e45120b9ea97b9727a23883448ec04fc1f6722a7c8520c8be\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6101606040526001600d553480156200001757600080fd5b506040516200a4a93803806200a4a983398181016040528101906200003d919062000bff565b818187858a898960006040518060400160405280601081526020017f476f7665726e6572436f6e747261637400000000000000000000000000000000815250806200008d6200022660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f68184846200026360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000150919062000f22565b505062000163836200029f60201b60201c565b6200017482620002e660201b60201c565b62000185816200037360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001cf81620003ba60201b60201c565b50620001e1816200059960201b60201c565b5062000202620001f66200063a60201b60201c565b6200064260201b60201c565b42600e8190555080600f81905550816010819055505050505050505050506200142d565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200028095949392919062001046565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051620002d4929190620010a3565b60405180910390a18060048190555050565b600081116200032c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003239062001157565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405162000361929190620010a3565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051620003a8929190620010a3565b60405180910390a18060068190555050565b620003ca6200070860201b60201c565b8111156200040f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004069062001215565b60405180910390fd5b6000620004216200071160201b60201c565b9050600081141580156200043d57506000600960000180549050145b156200053d5760096000016040518060400160405280600063ffffffff16815260200162000476846200074960201b62003abd1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000558826009620007b760201b62003b281790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200058d929190620010a3565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ee92919062001237565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064905090565b6000806009600001805490501462000740576200073a6009620009f560201b62003d2a1760201c565b62000744565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a690620012da565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620007d986620009f560201b60201c565b90506000821180156200083557504386600001600184620007fb91906200132b565b815481106200080f576200080e62001366565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008d95762000851856200074960201b62003abd1760201c565b866000016001846200086491906200132b565b8154811062000878576200087762001366565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009e6565b856000016040518060400160405280620008fe4362000a9760201b62003dc51760201c565b63ffffffff1681526020016200091f886200074960201b62003abd1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811462000a6e578260000160018262000a1e91906200132b565b8154811062000a325762000a3162001366565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000a71565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff801682111562000ae5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000adc906200140b565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b1f8262000af2565b9050919050565b600062000b338262000b12565b9050919050565b62000b458162000b26565b811462000b5157600080fd5b50565b60008151905062000b658162000b3a565b92915050565b600062000b788262000af2565b9050919050565b600062000b8c8262000b6b565b9050919050565b62000b9e8162000b7f565b811462000baa57600080fd5b50565b60008151905062000bbe8162000b93565b92915050565b6000819050919050565b62000bd98162000bc4565b811462000be557600080fd5b50565b60008151905062000bf98162000bce565b92915050565b600080600080600080600060e0888a03121562000c215762000c2062000aed565b5b600062000c318a828b0162000b54565b975050602062000c448a828b0162000bad565b965050604062000c578a828b0162000be8565b955050606062000c6a8a828b0162000be8565b945050608062000c7d8a828b0162000be8565b93505060a062000c908a828b0162000be8565b92505060c062000ca38a828b0162000be8565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d3457607f821691505b60208210810362000d4a5762000d4962000cec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000db47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d75565b62000dc0868362000d75565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000e0362000dfd62000df78462000bc4565b62000dd8565b62000bc4565b9050919050565b6000819050919050565b62000e1f8362000de2565b62000e3762000e2e8262000e0a565b84845462000d82565b825550505050565b600090565b62000e4e62000e3f565b62000e5b81848462000e14565b505050565b5b8181101562000e835762000e7760008262000e44565b60018101905062000e61565b5050565b601f82111562000ed25762000e9c8162000d50565b62000ea78462000d65565b8101602085101562000eb7578190505b62000ecf62000ec68562000d65565b83018262000e60565b50505b505050565b600082821c905092915050565b600062000ef76000198460080262000ed7565b1980831691505092915050565b600062000f12838362000ee4565b9150826002028217905092915050565b62000f2d8262000cb2565b67ffffffffffffffff81111562000f495762000f4862000cbd565b5b62000f55825462000d1b565b62000f6282828562000e87565b600060209050601f83116001811462000f9a576000841562000f85578287015190505b62000f91858262000f04565b86555062001001565b601f19841662000faa8662000d50565b60005b8281101562000fd45784890151825560018201915060208501945060208101905062000fad565b8683101562000ff4578489015162000ff0601f89168262000ee4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6200101e8162001009565b82525050565b6200102f8162000bc4565b82525050565b620010408162000b12565b82525050565b600060a0820190506200105d600083018862001013565b6200106c602083018762001013565b6200107b604083018662001013565b6200108a606083018562001024565b62001099608083018462001035565b9695505050505050565b6000604082019050620010ba600083018562001024565b620010c9602083018462001024565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200113f602783620010d0565b91506200114c82620010e1565b604082019050919050565b60006020820190508181036000830152620011728162001130565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620011fd604383620010d0565b91506200120a8262001179565b606082019050919050565b600060208201905081810360008301526200123081620011ee565b9050919050565b60006040820190506200124e600083018562001035565b6200125d602083018462001035565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620012c2602783620010d0565b9150620012cf8262001264565b604082019050919050565b60006020820190508181036000830152620012f581620012b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013388262000bc4565b9150620013458362000bc4565b925082820390508181111562001360576200135f620012fc565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620013f3602683620010d0565b9150620014008262001395565b604082019050919050565b600060208201905081810360008301526200142681620013e4565b9050919050565b60805160a05160c05160e05161010051610120516101405161901362001496600039600081816139c201528181614cb50152614f29015260006151ef0152600061523101526000615210015260006151450152600061519b015260006151c401526190136000f3fe6080604052600436106104825760003560e01c8063794d556011610255578063bd1c9e4911610144578063deaaa7cc116100c1578063ece40cc111610085578063ece40cc114611464578063f23a6e611461148d578063f2fde38b146114ca578063f8ce560a146114f3578063fc0c546a14611530578063fea856a11461155b576104c8565b8063deaaa7cc14611358578063e0c410cc14611383578063e8405801146113c0578063ea0217cf146113fe578063eb9019d414611427576104c8565b8063ca1d209d11610108578063ca1d209d1461126c578063cf68625914611288578063d33219b4146112c5578063dc73204b146112f0578063dd4e2ba51461132d576104c8565b8063bd1c9e4914611161578063c01f9e371461118c578063c0d55329146111c9578063c28bc2fa14611206578063c59057e41461122f576104c8565b806397c3d334116101d2578063abe1aae611610196578063abe1aae614611042578063b58131b01461107f578063b59d18a0146110aa578063bba9c219146110e7578063bc197c8114611124576104c8565b806397c3d33414610f495780639a802a6d14610f74578063a7713a7014610fb1578063a890c91014610fdc578063ab58fb8e14611005576104c8565b806387030f4d1161021957806387030f4d14610e505780638da5cb5b14610e795780638fb5548f14610ea4578063902bfa2414610ee157806396aa167e14610f1e576104c8565b8063794d556014610d315780637b3c71d314610d6e5780637d5e81e214610dab578063809b268e14610de8578063868661cb14610e25576104c8565b80633fafa127116103715780635b6b4652116102ee5780636ee8e8ef116102b25780636ee8e8ef14610c3a57806370084d7a14610c7757806370b0f66014610cb457806370c753f014610cdd578063715018a614610d1a576104c8565b80635b6b465214610b085780635ced7d4014610b455780635f398a1414610b8257806360c4247f14610bbf5780636e04ff0d14610bfc576104c8565b80634fac2bb7116103355780634fac2bb7146109f9578063535bf50f14610a36578063544ffc9c14610a6157806354fd4d5014610aa05780635678138814610acb576104c8565b80633fafa127146108ee5780633fd1c809146109195780634385963214610956578063446a156f146109935780634585e33b146109d0576104c8565b8063160cbed7116103ff5780633932abb1116103c35780633932abb1146107f55780633bccf4fd146108205780633be2f2a31461085d5780633e4f49e6146108865780633f3b3b27146108c3576104c8565b8063160cbed7146106e35780632656227d146107205780632d63f693146107505780632fe3e2611461078d57806335debf2d146107b8576104c8565b80630cee1725116104465780630cee1725146105c6578063141a6c22146105ef578063148038b01461062c578063150b7a0214610669578063156277be146106a6576104c8565b806301ffc9a7146104cd57806302a251a31461050a578063034201811461053557806306f3f9e61461057257806306fdde031461059b576104c8565b366104c8573073ffffffffffffffffffffffffffffffffffffffff166104a6611565565b73ffffffffffffffffffffffffffffffffffffffff16146104c657600080fd5b005b600080fd5b3480156104d957600080fd5b506104f460048036038101906104ef9190615e9e565b611574565b6040516105019190615ee6565b60405180910390f35b34801561051657600080fd5b5061051f611586565b60405161052c9190615f1a565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190616176565b611595565b6040516105699190615f1a565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190616254565b61167a565b005b3480156105a757600080fd5b506105b0611771565b6040516105bd9190616300565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190616254565b611803565b005b3480156105fb57600080fd5b50610616600480360381019061061191906163c3565b611a1f565b6040516106239190615f1a565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e919061646a565b611a47565b6040516106609190615f1a565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b91906164aa565b611a6c565b60405161069d919061653c565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190616254565b611a80565b6040516106da9190616566565b60405180910390f35b3480156106ef57600080fd5b5061070a600480360381019061070591906167e8565b611ab3565b6040516107179190615f1a565b60405180910390f35b61073a600480360381019061073591906167e8565b611d6d565b6040516107479190615f1a565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190616254565b611eba565b6040516107849190615f1a565b60405180910390f35b34801561079957600080fd5b506107a2611f28565b6040516107af91906168b2565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da91906168cd565b611f4c565b6040516107ec91906169b8565b60405180910390f35b34801561080157600080fd5b5061080a611fe3565b6040516108179190615f1a565b60405180910390f35b34801561082c57600080fd5b50610847600480360381019061084291906169da565b611ff2565b6040516108549190615f1a565b60405180910390f35b34801561086957600080fd5b50610884600480360381019061087f9190616a55565b61207c565b005b34801561089257600080fd5b506108ad60048036038101906108a89190616254565b6122e9565b6040516108ba9190616b4f565b60405180910390f35b3480156108cf57600080fd5b506108d86122fb565b6040516108e59190615f1a565b60405180910390f35b3480156108fa57600080fd5b50610903612301565b6040516109109190615f1a565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b9190616254565b612307565b60405161094d9190615f1a565b60405180910390f35b34801561096257600080fd5b5061097d6004803603810190610978919061646a565b612361565b60405161098a9190615ee6565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190616254565b6123cc565b6040516109c79190616bb2565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190616c23565b6123f6565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190616254565b612702565b604051610a2d9190615ee6565b60405180910390f35b348015610a4257600080fd5b50610a4b612722565b604051610a589190615f1a565b60405180910390f35b348015610a6d57600080fd5b50610a886004803603810190610a839190616254565b61272c565b604051610a9793929190616c70565b60405180910390f35b348015610aac57600080fd5b50610ab5612764565b604051610ac29190616300565b60405180910390f35b348015610ad757600080fd5b50610af26004803603810190610aed9190616ca7565b6127a1565b604051610aff9190615f1a565b60405180910390f35b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190616254565b6127d2565b604051610b3c9190615f1a565b60405180910390f35b348015610b5157600080fd5b50610b6c6004803603810190610b679190616254565b6127ea565b604051610b799190615f1a565b60405180910390f35b348015610b8e57600080fd5b50610ba96004803603810190610ba49190616ce7565b612802565b604051610bb69190615f1a565b60405180910390f35b348015610bcb57600080fd5b50610be66004803603810190610be19190616254565b61286c565b604051610bf39190615f1a565b60405180910390f35b348015610c0857600080fd5b50610c236004803603810190610c1e9190616d8b565b6129b8565b604051610c31929190616e29565b60405180910390f35b348015610c4657600080fd5b50610c616004803603810190610c5c91906168cd565b612aa3565b604051610c6e9190615ee6565b60405180910390f35b348015610c8357600080fd5b50610c9e6004803603810190610c999190616254565b612ac3565b604051610cab9190616bb2565b60405180910390f35b348015610cc057600080fd5b50610cdb6004803603810190610cd69190616254565b612ae3565b005b348015610ce957600080fd5b50610d046004803603810190610cff9190616e59565b612bda565b604051610d119190615f1a565b60405180910390f35b348015610d2657600080fd5b50610d2f612c0b565b005b348015610d3d57600080fd5b50610d586004803603810190610d539190616254565b612c1f565b604051610d659190615f1a565b60405180910390f35b348015610d7a57600080fd5b50610d956004803603810190610d909190616e99565b612c37565b604051610da29190615f1a565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd9190616f0d565b612c9f565b604051610ddf9190615f1a565b60405180910390f35b348015610df457600080fd5b50610e0f6004803603810190610e0a9190616254565b612d3a565b604051610e1c9190615ee6565b60405180910390f35b348015610e3157600080fd5b50610e3a612d64565b604051610e479190615f1a565b60405180910390f35b348015610e5c57600080fd5b50610e776004803603810190610e729190616254565b612d6a565b005b348015610e8557600080fd5b50610e8e612e0d565b604051610e9b9190616566565b60405180910390f35b348015610eb057600080fd5b50610ecb6004803603810190610ec69190616254565b612e37565b604051610ed89190616300565b60405180910390f35b348015610eed57600080fd5b50610f086004803603810190610f039190616254565b612ed7565b604051610f159190615ee6565b60405180910390f35b348015610f2a57600080fd5b50610f33612ef7565b604051610f409190615f1a565b60405180910390f35b348015610f5557600080fd5b50610f5e612efd565b604051610f6b9190615f1a565b60405180910390f35b348015610f8057600080fd5b50610f9b6004803603810190610f969190616fe4565b612f06565b604051610fa89190615f1a565b60405180910390f35b348015610fbd57600080fd5b50610fc6612f1c565b604051610fd39190615f1a565b60405180910390f35b348015610fe857600080fd5b506110036004803603810190610ffe91906170a3565b612f45565b005b34801561101157600080fd5b5061102c60048036038101906110279190616254565b61303c565b6040516110399190615f1a565b60405180910390f35b34801561104e57600080fd5b5061106960048036038101906110649190616254565b613109565b6040516110769190616300565b60405180910390f35b34801561108b57600080fd5b506110946131ae565b6040516110a19190615f1a565b60405180910390f35b3480156110b657600080fd5b506110d160048036038101906110cc9190616254565b6131bd565b6040516110de9190615f1a565b60405180910390f35b3480156110f357600080fd5b5061110e60048036038101906111099190616254565b6131da565b60405161111b9190615f1a565b60405180910390f35b34801561113057600080fd5b5061114b600480360381019061114691906170d0565b6131f7565b604051611158919061653c565b60405180910390f35b34801561116d57600080fd5b5061117661320c565b6040516111839190615f1a565b60405180910390f35b34801561119857600080fd5b506111b360048036038101906111ae9190616254565b613216565b6040516111c09190615f1a565b60405180910390f35b3480156111d557600080fd5b506111f060048036038101906111eb91906168cd565b613284565b6040516111fd9190615ee6565b60405180910390f35b34801561121257600080fd5b5061122d6004803603810190611228919061719f565b6132da565b005b34801561123b57600080fd5b50611256600480360381019061125191906167e8565b61341b565b6040516112639190615f1a565b60405180910390f35b61128660048036038101906112819190616254565b613457565b005b34801561129457600080fd5b506112af60048036038101906112aa91906163c3565b6135a1565b6040516112bc9190615f1a565b60405180910390f35b3480156112d157600080fd5b506112da6135cf565b6040516112e79190616566565b60405180910390f35b3480156112fc57600080fd5b5061131760048036038101906113129190617213565b6135f9565b6040516113249190615f1a565b60405180910390f35b34801561133957600080fd5b5061134261361e565b60405161134f9190616300565b60405180910390f35b34801561136457600080fd5b5061136d61365b565b60405161137a91906168b2565b60405180910390f35b34801561138f57600080fd5b506113aa60048036038101906113a59190616254565b61367f565b6040516113b79190615ee6565b60405180910390f35b3480156113cc57600080fd5b506113e760048036038101906113e29190616254565b6136a9565b6040516113f5929190617253565b60405180910390f35b34801561140a57600080fd5b5061142560048036038101906114209190616254565b61370c565b005b34801561143357600080fd5b5061144e60048036038101906114499190616e59565b613803565b60405161145b9190615f1a565b60405180910390f35b34801561147057600080fd5b5061148b60048036038101906114869190616254565b61381f565b005b34801561149957600080fd5b506114b460048036038101906114af919061727c565b613916565b6040516114c1919061653c565b60405180910390f35b3480156114d657600080fd5b506114f160048036038101906114ec91906168cd565b61392b565b005b3480156114ff57600080fd5b5061151a60048036038101906115159190616254565b6139ae565b6040516115279190615f1a565b60405180910390f35b34801561153c57600080fd5b506115456139c0565b6040516115529190617372565b60405180910390f35b6115636139e4565b005b600061156f613e18565b905090565b600061157f82613e42565b9050919050565b6000611590613ebc565b905090565b6000806116186116107fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c6040516115d19291906173bd565b60405180910390208b805190602001206040516020016115f59594939291906173e5565b60405160208183030381529060405280519060200120613ec6565b868686613ee0565b905061166b8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613f0b565b91505098975050505050505050565b611682611565565b73ffffffffffffffffffffffffffffffffffffffff166116a06140c7565b73ffffffffffffffffffffffffffffffffffffffff16146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611715611565565b73ffffffffffffffffffffffffffffffffffffffff161461176557600061173a6140cf565b6040516117489291906173bd565b604051809103902090505b8061175e60026140dc565b0361175357505b61176e816141b8565b50565b606060008054611780906174d3565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac906174d3565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b5050505050905090565b6002600381111561181757611816616ad8565b5b601b600083815260200190815260200160002060009054906101000a900460ff16600381111561184a57611849616ad8565b5b036119ea5760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16826040516119209061752a565b60006040518083038185875af1925050503d806000811461195d576040519150601f19603f3d011682016040523d82523d6000602084013e611962565b606091505b505090508061199d576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d543373ffffffffffffffffffffffffffffffffffffffff167f370c08173448a868859170331cf95622fc6b9ca192121cc9aae246cf05b3ab7c60405160405180910390a35050611a1c565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000601482604051611a31919061757b565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611ac28686868661341b565b905060046007811115611ad857611ad7616ad8565b5b611ae1826122e9565b6007811115611af357611af2616ad8565b5b14611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a90617604565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190617639565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611c2c959493929190617878565b602060405180830381865afa158015611c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6d91906178f5565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611cea96959493929190617922565b600060405180830381600087803b158015611d0457600080fd5b505af1158015611d18573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611d4a91906179c7565b604051611d58929190617253565b60405180910390a18192505050949350505050565b600080611d7c8686868661341b565b90506000611d89826122e9565b905060046007811115611d9f57611d9e616ad8565b5b816007811115611db257611db1616ad8565b5b1480611de2575060056007811115611dcd57611dcc616ad8565b5b816007811115611de057611ddf616ad8565b5b145b611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890617604565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611e7e9190615f1a565b60405180910390a1611e93828888888861436c565b611ea0828888888861444f565b611ead8288888888614463565b8192505050949350505050565b6000611f17600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6060601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611fd757602002820191906000526020600020905b815481526020019060010190808311611fc3575b50505050509050919050565b6000611fed6144cc565b905090565b60008061205361204b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001612030939291906179fb565b60405160208183030381529060405280519060200120613ec6565b868686613ee0565b9050612070878288604051806020016040528060008152506144d6565b91505095945050505050565b6120846144f6565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612107576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561216b5761216a616ad8565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d546014856040516121b7919061757b565b9081526020016040518091039020819055508360156000600d54815260200190815260200160002090816121eb9190617bd4565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d60008154809291906122de90617ca6565b919050555050505050565b60006122f482614574565b9050919050565b600e5481565b600d5481565b60006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000612410604051806020016040528060008152506129b8565b5090508061244a576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008383906124599190617cf9565b60001c905060006011600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601860008281526020019081526020016000205460176000838152602001908152602001600020541115612692576001601b600083815260200190815260200160002060006101000a81548160ff0219169083600381111561251b5761251a616ad8565b5b021790555060006064600f5460176000858152602001908152602001600020546125459190617d58565b61254f9190617dc9565b9050600060176000848152602001908152602001600020819055506000601a600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516125c39061752a565b60006040518083038185875af1925050503d8060008114612600576040519150601f19603f3d011682016040523d82523d6000602084013e612605565b606091505b505090508061265e5760176000848152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016126559190615f1a565b60405180910390fd5b827f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a250506126fc565b6002601b600083815260200190815260200160002060006101000a81548160ff021916908360038111156126c9576126c8616ad8565b5b0217905550807f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b50505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806127ac6140c7565b90506127c9848285604051806020016040528060008152506144d6565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b60008061280d6140c7565b905061286087828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613f0b565b91505095945050505050565b60008060096000018054905090506000810361288d576008549150506129b3565b600060096000016001836128a19190617dfa565b815481106128b2576128b1617e2e565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161299a5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506129b3565b6129ae84600961474790919063ffffffff16565b925050505b919050565b600060606000600190505b600d548111612a9d5760006011600083815260200190815260200160002060009054906101000a900460ff16905060006013600084815260200190815260200160002054601260008581526020019081526020016000206000601360008781526020019081526020016000205481526020019081526020016000205442612a4a9190617dfa565b119050818015612a575750805b94508415612a885782604051602001612a709190617e7e565b60405160208183030381529060405293505050612a9d565b50508080612a9590617ca6565b9150506129c3565b50915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b612aeb611565565b73ffffffffffffffffffffffffffffffffffffffff16612b096140c7565b73ffffffffffffffffffffffffffffffffffffffff1614612b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5690617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612b7e611565565b73ffffffffffffffffffffffffffffffffffffffff1614612bce576000612ba36140cf565b604051612bb19291906173bd565b604051809103902090505b80612bc760026140dc565b03612bbc57505b612bd78161489f565b50565b601d6020528160005260406000208181548110612bf657600080fd5b90600052602060002001600091509150505481565b612c136144f6565b612c1d60006148e4565b565b60176020528060005260406000206000915090505481565b600080612c426140c7565b9050612c9486828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506144d6565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d24576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d30858585856149aa565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612d726144f6565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612e0557612e04616ad8565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612e56906174d3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e82906174d3565b8015612ecf5780601f10612ea457610100808354040283529160200191612ecf565b820191906000526020600020905b815481529060010190602001808311612eb257829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612f13848484614cb1565b90509392505050565b60008060096000018054905014612f3c57612f376009613d2a565b612f40565b6008545b905090565b612f4d611565565b73ffffffffffffffffffffffffffffffffffffffff16612f6b6140c7565b73ffffffffffffffffffffffffffffffffffffffff1614612fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb890617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612fe0611565565b73ffffffffffffffffffffffffffffffffffffffff16146130305760006130056140cf565b6040516130139291906173bd565b604051809103902090505b8061302960026140dc565b0361301e57505b61303981614d58565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b81526004016130ad91906168b2565b602060405180830381865afa1580156130ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ee9190617639565b9050600181146130fe5780613101565b60005b915050919050565b6060601560008381526020019081526020016000208054613129906174d3565b80601f0160208091040260200160405190810160405280929190818152602001828054613155906174d3565b80156131a25780601f10613177576101008083540402835291602001916131a2565b820191906000526020600020905b81548152906001019060200180831161318557829003601f168201915b50505050509050919050565b60006131b8614df7565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000600f54905090565b6000613273600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6132e2611565565b73ffffffffffffffffffffffffffffffffffffffff166133006140c7565b73ffffffffffffffffffffffffffffffffffffffff1614613356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334d90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16613375611565565b73ffffffffffffffffffffffffffffffffffffffff16146133c557600061339a6140cf565b6040516133a89291906173bd565b604051809103902090505b806133be60026140dc565b036133b357505b6134148483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085614e01565b5050505050565b6000848484846040516020016134349493929190617e99565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff166134af576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461350f91906179c7565b925050819055503460176000848152602001908152602001600020600082825461353991906179c7565b92505081905550604051806020016040528083815250601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090600161359c929190615dc8565b505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806012600084815260200190815260200160002060006013600086815260200190815260200160002054815260200190815260200160002054426136ef9190617dfa565b915060136000848152602001908152602001600020549050915091565b613714611565565b73ffffffffffffffffffffffffffffffffffffffff166137326140c7565b73ffffffffffffffffffffffffffffffffffffffff1614613788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377f90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166137a7611565565b73ffffffffffffffffffffffffffffffffffffffff16146137f75760006137cc6140cf565b6040516137da9291906173bd565b604051809103902090505b806137f060026140dc565b036137e557505b61380081614e30565b50565b60006138178383613812614eb8565b614cb1565b905092915050565b613827611565565b73ffffffffffffffffffffffffffffffffffffffff166138456140c7565b73ffffffffffffffffffffffffffffffffffffffff161461389b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389290617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166138ba611565565b73ffffffffffffffffffffffffffffffffffffffff161461390a5760006138df6140cf565b6040516138ed9291906173bd565b604051809103902090505b8061390360026140dc565b036138f857505b61391381614ecf565b50565b600063f23a6e6160e01b905095945050505050565b6139336144f6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036139a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399990617f65565b60405180910390fd5b6139ab816148e4565b50565b60006139b982614f14565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601054341015613a20576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1790617ff7565b60405180910390fd5b819050919050565b6000806000846000018054905090506000613b4286613d2a565b9050600082118015613b9857504386600001600184613b619190617dfa565b81548110613b7257613b71617e2e565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15613c2857613ba685613abd565b86600001600184613bb79190617dfa565b81548110613bc857613bc7617e2e565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613d1b565b856000016040518060400160405280613c4043613dc5565b63ffffffff168152602001613c5488613abd565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613d9c5782600001600182613d509190617dfa565b81548110613d6157613d60617e2e565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613d9f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115613e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e0790618089565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613eb55750613eb482614fdc565b5b9050919050565b6000600554905090565b6000613ed9613ed3615141565b8361525b565b9050919050565b6000806000613ef18787878761528e565b91509150613efe8161539a565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613f3757613f36616ad8565b5b613f40886122e9565b6007811115613f5257613f51616ad8565b5b14613f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f899061811b565b60405180910390fd5b6000613ff187613fe1846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff1686614cb1565b90506140008888888488615566565b6000845103614062578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051614055949392919061813b565b60405180910390a26140b9565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb871289888489896040516140b0959493929190618187565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b60006140e78261576a565b1561411e576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b6141c0612efd565b811115614202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141f990618280565b60405180910390fd5b600061420c612f1c565b90506000811415801561422757506000600960000180549050145b156143195760096000016040518060400160405280600063ffffffff16815260200161425284613abd565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b61432d826009613b2890919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051614360929190617253565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff1661438b611565565b73ffffffffffffffffffffffffffffffffffffffff16146144485760005b8451811015614446573073ffffffffffffffffffffffffffffffffffffffff168582815181106143dc576143db617e2e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036144355761443483828151811061441557614414617e2e565b5b602002602001015180519060200120600261579f90919063ffffffff16565b5b8061443f90617ca6565b90506143a9565b505b5050505050565b61445c858585858561581b565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff16614482611565565b73ffffffffffffffffffffffffffffffffffffffff16146144b7576144a7600261576a565b6144b6576144b560026158b9565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006144ec858585856144e7614eb8565b613f0b565b9050949350505050565b6144fe6140c7565b73ffffffffffffffffffffffffffffffffffffffff1661451c612e0d565b73ffffffffffffffffffffffffffffffffffffffff1614614572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614569906182ec565b60405180910390fd5b565b6000806145808361593a565b90506004600781111561459657614595616ad8565b5b8160078111156145a9576145a8616ad8565b5b146145b75780915050614742565b6000600b60008581526020019081526020016000205490506000801b81036145e3578192505050614742565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b815260040161463e91906168b2565b602060405180830381865afa15801561465b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467f9190618338565b1561468f57600792505050614742565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016146ea91906168b2565b602060405180830381865afa158015614707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061472b9190618338565b1561473b57600592505050614742565b6002925050505b919050565b600043821061478b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614782906183b1565b60405180910390fd5b60008360000180549050905060005b8181101561480f5760006147ae8284615a4e565b9050848660000182815481106147c7576147c6617e2e565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156147f957809250614809565b60018161480691906179c7565b91505b5061479a565b6000821461487457846000016001836148289190617dfa565b8154811061483957614838617e2e565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16614877565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516148d2929190617253565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006149b46131ae565b6149d16149bf6140c7565b6001436149cc9190617dfa565b613803565b1015614a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a0990618443565b60405180910390fd5b6000614a27868686868051906020012061341b565b90508451865114614a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a64906184d5565b60405180910390fd5b8351865114614ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aa8906184d5565b60405180910390fd5b6000865111614af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aec90618541565b60405180910390fd5b6000600160008381526020019081526020016000209050614b55816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050615a74565b614b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b8b906185d3565b60405180910390fd5b6000614ba6614ba1611fe3565b615a8e565b614baf43615a8e565b614bb99190618607565b90506000614bcd614bc8611586565b615a8e565b82614bd89190618607565b9050614bf08284600001615ae590919063ffffffff16565b614c068184600101615ae590919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614c306140c7565b8b8b8d5167ffffffffffffffff811115614c4d57614c4c616015565b5b604051908082528060200260200182016040528015614c8057816020015b6060815260200190600190039081614c6b5790505b508c88888e604051614c9a99989796959493929190618780565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401614d0e929190618830565b602060405180830381865afa158015614d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d4f9190617639565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051614dab929190618859565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b6060614e27848484604051806060016040528060298152602001618fb560299139615b14565b90509392505050565b60008111614e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614e6a906188f4565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614ea6929190617253565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614f02929190617253565b60405180910390a18060068190555050565b6000614f1e612efd565b614f278361286c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614f809190615f1a565b602060405180830381865afa158015614f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fc19190617639565b614fcb9190617d58565b614fd59190617dc9565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806150c257507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061512a57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061513a575061513982615c28565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156151bd57507f000000000000000000000000000000000000000000000000000000000000000046145b156151ea577f00000000000000000000000000000000000000000000000000000000000000009050615258565b6152557f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000615c92565b90505b90565b60008282604051602001615270929190618981565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156152c9576000600391509150615391565b601b8560ff16141580156152e15750601c8560ff1614155b156152f3576000600491509150615391565b60006001878787876040516000815260200160405260405161531894939291906189b8565b6020604051602081039080840390855afa15801561533a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361538857600060019250925050615391565b80600092509250505b94509492505050565b600060048111156153ae576153ad616ad8565b5b8160048111156153c1576153c0616ad8565b5b031561556357600160048111156153db576153da616ad8565b5b8160048111156153ee576153ed616ad8565b5b0361542e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161542590618a49565b60405180910390fd5b6002600481111561544257615441616ad8565b5b81600481111561545557615454616ad8565b5b03615495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161548c90618ab5565b60405180910390fd5b600360048111156154a9576154a8616ad8565b5b8160048111156154bc576154bb616ad8565b5b036154fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016154f390618b47565b60405180910390fd5b60048081111561550f5761550e616ad8565b5b81600481111561552257615521616ad8565b5b03615562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161555990618bd9565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561560c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161560390618c6b565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561567a57615679616ad8565b5b60ff168460ff16036156a6578281600001600082825461569a91906179c7565b92505081905550615762565b600160028111156156ba576156b9616ad8565b5b60ff168460ff16036156e657828160010160008282546156da91906179c7565b92505081905550615761565b6002808111156156f9576156f8616ad8565b5b60ff168460ff1603615725578281600201600082825461571991906179c7565b92505081905550615760565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161575790618cfd565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401615880959493929190617878565b6000604051808303818588803b15801561589957600080fd5b505af11580156158ad573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615615973576007915050615a49565b8060020160019054906101000a900460ff1615615994576002915050615a49565b600061599f84611eba565b9050600081036159e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159db90618d69565b60405180910390fd5b4381106159f657600092505050615a49565b6000615a0185613216565b9050438110615a165760019350505050615a49565b615a1f85615ccc565b8015615a305750615a2f85615d13565b5b15615a415760049350505050615a49565b600393505050505b919050565b60006002828418615a5f9190617dc9565b828416615a6c91906179c7565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115615add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615ad490618dfb565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b5090618e8d565b60405180910390fd5b615b6285615d3e565b615ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b9890618ef9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615bca9190618f4a565b60006040518083038185875af1925050503d8060008114615c07576040519150601f19603f3d011682016040523d82523d6000602084013e615c0c565b606091505b5091509150615c1c828286615d61565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615cad959493929190618f61565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154615cf891906179c7565b615d09615d0485611eba565b6139ae565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315615d7157829050615dc1565b600083511115615d845782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615db89190616300565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215615e04579160200282015b82811115615e03578251825591602001919060010190615de8565b5b509050615e119190615e15565b5090565b5b80821115615e2e576000816000905550600101615e16565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b615e7b81615e46565b8114615e8657600080fd5b50565b600081359050615e9881615e72565b92915050565b600060208284031215615eb457615eb3615e3c565b5b6000615ec284828501615e89565b91505092915050565b60008115159050919050565b615ee081615ecb565b82525050565b6000602082019050615efb6000830184615ed7565b92915050565b6000819050919050565b615f1481615f01565b82525050565b6000602082019050615f2f6000830184615f0b565b92915050565b615f3e81615f01565b8114615f4957600080fd5b50565b600081359050615f5b81615f35565b92915050565b600060ff82169050919050565b615f7781615f61565b8114615f8257600080fd5b50565b600081359050615f9481615f6e565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615fbf57615fbe615f9a565b5b8235905067ffffffffffffffff811115615fdc57615fdb615f9f565b5b602083019150836001820283011115615ff857615ff7615fa4565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61604d82616004565b810181811067ffffffffffffffff8211171561606c5761606b616015565b5b80604052505050565b600061607f615e32565b905061608b8282616044565b919050565b600067ffffffffffffffff8211156160ab576160aa616015565b5b6160b482616004565b9050602081019050919050565b82818337600083830152505050565b60006160e36160de84616090565b616075565b9050828152602081018484840111156160ff576160fe615fff565b5b61610a8482856160c1565b509392505050565b600082601f83011261612757616126615f9a565b5b81356161378482602086016160d0565b91505092915050565b6000819050919050565b61615381616140565b811461615e57600080fd5b50565b6000813590506161708161614a565b92915050565b60008060008060008060008060e0898b03121561619657616195615e3c565b5b60006161a48b828c01615f4c565b98505060206161b58b828c01615f85565b975050604089013567ffffffffffffffff8111156161d6576161d5615e41565b5b6161e28b828c01615fa9565b9650965050606089013567ffffffffffffffff81111561620557616204615e41565b5b6162118b828c01616112565b94505060806162228b828c01615f85565b93505060a06162338b828c01616161565b92505060c06162448b828c01616161565b9150509295985092959890939650565b60006020828403121561626a57616269615e3c565b5b600061627884828501615f4c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156162bb5780820151818401526020810190506162a0565b60008484015250505050565b60006162d282616281565b6162dc818561628c565b93506162ec81856020860161629d565b6162f581616004565b840191505092915050565b6000602082019050818103600083015261631a81846162c7565b905092915050565b600067ffffffffffffffff82111561633d5761633c616015565b5b61634682616004565b9050602081019050919050565b600061636661636184616322565b616075565b90508281526020810184848401111561638257616381615fff565b5b61638d8482856160c1565b509392505050565b600082601f8301126163aa576163a9615f9a565b5b81356163ba848260208601616353565b91505092915050565b6000602082840312156163d9576163d8615e3c565b5b600082013567ffffffffffffffff8111156163f7576163f6615e41565b5b61640384828501616395565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006164378261640c565b9050919050565b6164478161642c565b811461645257600080fd5b50565b6000813590506164648161643e565b92915050565b6000806040838503121561648157616480615e3c565b5b600061648f85828601615f4c565b92505060206164a085828601616455565b9150509250929050565b600080600080608085870312156164c4576164c3615e3c565b5b60006164d287828801616455565b94505060206164e387828801616455565b93505060406164f487828801615f4c565b925050606085013567ffffffffffffffff81111561651557616514615e41565b5b61652187828801616112565b91505092959194509250565b61653681615e46565b82525050565b6000602082019050616551600083018461652d565b92915050565b6165608161642c565b82525050565b600060208201905061657b6000830184616557565b92915050565b600067ffffffffffffffff82111561659c5761659b616015565b5b602082029050602081019050919050565b60006165c06165bb84616581565b616075565b905080838252602082019050602084028301858111156165e3576165e2615fa4565b5b835b8181101561660c57806165f88882616455565b8452602084019350506020810190506165e5565b5050509392505050565b600082601f83011261662b5761662a615f9a565b5b813561663b8482602086016165ad565b91505092915050565b600067ffffffffffffffff82111561665f5761665e616015565b5b602082029050602081019050919050565b600061668361667e84616644565b616075565b905080838252602082019050602084028301858111156166a6576166a5615fa4565b5b835b818110156166cf57806166bb8882615f4c565b8452602084019350506020810190506166a8565b5050509392505050565b600082601f8301126166ee576166ed615f9a565b5b81356166fe848260208601616670565b91505092915050565b600067ffffffffffffffff82111561672257616721616015565b5b602082029050602081019050919050565b600061674661674184616707565b616075565b9050808382526020820190506020840283018581111561676957616768615fa4565b5b835b818110156167b057803567ffffffffffffffff81111561678e5761678d615f9a565b5b80860161679b8982616112565b8552602085019450505060208101905061676b565b5050509392505050565b600082601f8301126167cf576167ce615f9a565b5b81356167df848260208601616733565b91505092915050565b6000806000806080858703121561680257616801615e3c565b5b600085013567ffffffffffffffff8111156168205761681f615e41565b5b61682c87828801616616565b945050602085013567ffffffffffffffff81111561684d5761684c615e41565b5b616859878288016166d9565b935050604085013567ffffffffffffffff81111561687a57616879615e41565b5b616886878288016167ba565b925050606061689787828801616161565b91505092959194509250565b6168ac81616140565b82525050565b60006020820190506168c760008301846168a3565b92915050565b6000602082840312156168e3576168e2615e3c565b5b60006168f184828501616455565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61692f81615f01565b82525050565b60006169418383616926565b60208301905092915050565b6000602082019050919050565b6000616965826168fa565b61696f8185616905565b935061697a83616916565b8060005b838110156169ab5781516169928882616935565b975061699d8361694d565b92505060018101905061697e565b5085935050505092915050565b600060208201905081810360008301526169d2818461695a565b905092915050565b600080600080600060a086880312156169f6576169f5615e3c565b5b6000616a0488828901615f4c565b9550506020616a1588828901615f85565b9450506040616a2688828901615f85565b9350506060616a3788828901616161565b9250506080616a4888828901616161565b9150509295509295909350565b60008060008060808587031215616a6f57616a6e615e3c565b5b600085013567ffffffffffffffff811115616a8d57616a8c615e41565b5b616a9987828801616395565b9450506020616aaa87828801615f4c565b9350506040616abb87828801615f4c565b9250506060616acc87828801616455565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110616b1857616b17616ad8565b5b50565b6000819050616b2982616b07565b919050565b6000616b3982616b1b565b9050919050565b616b4981616b2e565b82525050565b6000602082019050616b646000830184616b40565b92915050565b60048110616b7b57616b7a616ad8565b5b50565b6000819050616b8c82616b6a565b919050565b6000616b9c82616b7e565b9050919050565b616bac81616b91565b82525050565b6000602082019050616bc76000830184616ba3565b92915050565b60008083601f840112616be357616be2615f9a565b5b8235905067ffffffffffffffff811115616c0057616bff615f9f565b5b602083019150836001820283011115616c1c57616c1b615fa4565b5b9250929050565b60008060208385031215616c3a57616c39615e3c565b5b600083013567ffffffffffffffff811115616c5857616c57615e41565b5b616c6485828601616bcd565b92509250509250929050565b6000606082019050616c856000830186615f0b565b616c926020830185615f0b565b616c9f6040830184615f0b565b949350505050565b60008060408385031215616cbe57616cbd615e3c565b5b6000616ccc85828601615f4c565b9250506020616cdd85828601615f85565b9150509250929050565b600080600080600060808688031215616d0357616d02615e3c565b5b6000616d1188828901615f4c565b9550506020616d2288828901615f85565b945050604086013567ffffffffffffffff811115616d4357616d42615e41565b5b616d4f88828901615fa9565b9350935050606086013567ffffffffffffffff811115616d7257616d71615e41565b5b616d7e88828901616112565b9150509295509295909350565b600060208284031215616da157616da0615e3c565b5b600082013567ffffffffffffffff811115616dbf57616dbe615e41565b5b616dcb84828501616112565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000616dfb82616dd4565b616e058185616ddf565b9350616e1581856020860161629d565b616e1e81616004565b840191505092915050565b6000604082019050616e3e6000830185615ed7565b8181036020830152616e508184616df0565b90509392505050565b60008060408385031215616e7057616e6f615e3c565b5b6000616e7e85828601616455565b9250506020616e8f85828601615f4c565b9150509250929050565b60008060008060608587031215616eb357616eb2615e3c565b5b6000616ec187828801615f4c565b9450506020616ed287828801615f85565b935050604085013567ffffffffffffffff811115616ef357616ef2615e41565b5b616eff87828801615fa9565b925092505092959194509250565b60008060008060808587031215616f2757616f26615e3c565b5b600085013567ffffffffffffffff811115616f4557616f44615e41565b5b616f5187828801616616565b945050602085013567ffffffffffffffff811115616f7257616f71615e41565b5b616f7e878288016166d9565b935050604085013567ffffffffffffffff811115616f9f57616f9e615e41565b5b616fab878288016167ba565b925050606085013567ffffffffffffffff811115616fcc57616fcb615e41565b5b616fd887828801616395565b91505092959194509250565b600080600060608486031215616ffd57616ffc615e3c565b5b600061700b86828701616455565b935050602061701c86828701615f4c565b925050604084013567ffffffffffffffff81111561703d5761703c615e41565b5b61704986828701616112565b9150509250925092565b600061705e8261640c565b9050919050565b600061707082617053565b9050919050565b61708081617065565b811461708b57600080fd5b50565b60008135905061709d81617077565b92915050565b6000602082840312156170b9576170b8615e3c565b5b60006170c78482850161708e565b91505092915050565b600080600080600060a086880312156170ec576170eb615e3c565b5b60006170fa88828901616455565b955050602061710b88828901616455565b945050604086013567ffffffffffffffff81111561712c5761712b615e41565b5b617138888289016166d9565b935050606086013567ffffffffffffffff81111561715957617158615e41565b5b617165888289016166d9565b925050608086013567ffffffffffffffff81111561718657617185615e41565b5b61719288828901616112565b9150509295509295909350565b600080600080606085870312156171b9576171b8615e3c565b5b60006171c787828801616455565b94505060206171d887828801615f4c565b935050604085013567ffffffffffffffff8111156171f9576171f8615e41565b5b61720587828801616bcd565b925092505092959194509250565b6000806040838503121561722a57617229615e3c565b5b600061723885828601615f4c565b925050602061724985828601615f4c565b9150509250929050565b60006040820190506172686000830185615f0b565b6172756020830184615f0b565b9392505050565b600080600080600060a0868803121561729857617297615e3c565b5b60006172a688828901616455565b95505060206172b788828901616455565b94505060406172c888828901615f4c565b93505060606172d988828901615f4c565b925050608086013567ffffffffffffffff8111156172fa576172f9615e41565b5b61730688828901616112565b9150509295509295909350565b6000819050919050565b600061733861733361732e8461640c565b617313565b61640c565b9050919050565b600061734a8261731d565b9050919050565b600061735c8261733f565b9050919050565b61736c81617351565b82525050565b60006020820190506173876000830184617363565b92915050565b600081905092915050565b60006173a4838561738d565b93506173b18385846160c1565b82840190509392505050565b60006173ca828486617398565b91508190509392505050565b6173df81615f61565b82525050565b600060a0820190506173fa60008301886168a3565b6174076020830187615f0b565b61741460408301866173d6565b61742160608301856168a3565b61742e60808301846168a3565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b600061746e60188361628c565b915061747982617438565b602082019050919050565b6000602082019050818103600083015261749d81617461565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806174eb57607f821691505b6020821081036174fe576174fd6174a4565b5b50919050565b50565b600061751460008361738d565b915061751f82617504565b600082019050919050565b600061753582617507565b9150819050919050565b600081905092915050565b600061755582616281565b61755f818561753f565b935061756f81856020860161629d565b80840191505092915050565b6000617587828461754a565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006175ee60218361628c565b91506175f982617592565b604082019050919050565b6000602082019050818103600083015261761d816175e1565b9050919050565b60008151905061763381615f35565b92915050565b60006020828403121561764f5761764e615e3c565b5b600061765d84828501617624565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61769b8161642c565b82525050565b60006176ad8383617692565b60208301905092915050565b6000602082019050919050565b60006176d182617666565b6176db8185617671565b93506176e683617682565b8060005b838110156177175781516176fe88826176a1565b9750617709836176b9565b9250506001810190506176ea565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061776c82616dd4565b6177768185617750565b935061778681856020860161629d565b61778f81616004565b840191505092915050565b60006177a68383617761565b905092915050565b6000602082019050919050565b60006177c682617724565b6177d0818561772f565b9350836020820285016177e285617740565b8060005b8581101561781e57848403895281516177ff858261779a565b945061780a836177ae565b925060208a019950506001810190506177e6565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061786261785d61785884617830565b61783a565b616140565b9050919050565b61787281617847565b82525050565b600060a082019050818103600083015261789281886176c6565b905081810360208301526178a6818761695a565b905081810360408301526178ba81866177bb565b90506178c96060830185617869565b6178d660808301846168a3565b9695505050505050565b6000815190506178ef8161614a565b92915050565b60006020828403121561790b5761790a615e3c565b5b6000617919848285016178e0565b91505092915050565b600060c082019050818103600083015261793c81896176c6565b90508181036020830152617950818861695a565b9050818103604083015261796481876177bb565b90506179736060830186617869565b61798060808301856168a3565b61798d60a0830184615f0b565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006179d282615f01565b91506179dd83615f01565b92508282019050808211156179f5576179f4617998565b5b92915050565b6000606082019050617a1060008301866168a3565b617a1d6020830185615f0b565b617a2a60408301846173d6565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302617a947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617a57565b617a9e8683617a57565b95508019841693508086168417925050509392505050565b6000617ad1617acc617ac784615f01565b617313565b615f01565b9050919050565b6000819050919050565b617aeb83617ab6565b617aff617af782617ad8565b848454617a64565b825550505050565b600090565b617b14617b07565b617b1f818484617ae2565b505050565b5b81811015617b4357617b38600082617b0c565b600181019050617b25565b5050565b601f821115617b8857617b5981617a32565b617b6284617a47565b81016020851015617b71578190505b617b85617b7d85617a47565b830182617b24565b50505b505050565b600082821c905092915050565b6000617bab60001984600802617b8d565b1980831691505092915050565b6000617bc48383617b9a565b9150826002028217905092915050565b617bdd82616281565b67ffffffffffffffff811115617bf657617bf5616015565b5b617c0082546174d3565b617c0b828285617b47565b600060209050601f831160018114617c3e5760008415617c2c578287015190505b617c368582617bb8565b865550617c9e565b601f198416617c4c86617a32565b60005b82811015617c7457848901518255600182019150602085019450602081019050617c4f565b86831015617c915784890151617c8d601f891682617b9a565b8355505b6001600288020188555050505b505050505050565b6000617cb182615f01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203617ce357617ce2617998565b5b600182019050919050565b600082905092915050565b6000617d058383617cee565b82617d108135616140565b92506020821015617d5057617d4b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802617a57565b831692505b505092915050565b6000617d6382615f01565b9150617d6e83615f01565b9250828202617d7c81615f01565b91508282048414831517617d9357617d92617998565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000617dd482615f01565b9150617ddf83615f01565b925082617def57617dee617d9a565b5b828204905092915050565b6000617e0582615f01565b9150617e1083615f01565b9250828203905081811115617e2857617e27617998565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b617e78617e7382615f01565b617e5d565b82525050565b6000617e8a8284617e67565b60208201915081905092915050565b60006080820190508181036000830152617eb381876176c6565b90508181036020830152617ec7818661695a565b90508181036040830152617edb81856177bb565b9050617eea60608301846168a3565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000617f4f60268361628c565b9150617f5a82617ef3565b604082019050919050565b60006020820190508181036000830152617f7e81617f42565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617fe160278361628c565b9150617fec82617f85565b604082019050919050565b6000602082019050818103600083015261801081617fd4565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b600061807360268361628c565b915061807e82618017565b604082019050919050565b600060208201905081810360008301526180a281618066565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b600061810560238361628c565b9150618110826180a9565b604082019050919050565b60006020820190508181036000830152618134816180f8565b9050919050565b60006080820190506181506000830187615f0b565b61815d60208301866173d6565b61816a6040830185615f0b565b818103606083015261817c81846162c7565b905095945050505050565b600060a08201905061819c6000830188615f0b565b6181a960208301876173d6565b6181b66040830186615f0b565b81810360608301526181c881856162c7565b905081810360808301526181dc8184616df0565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b600061826a60438361628c565b9150618275826181e8565b606082019050919050565b600060208201905081810360008301526182998161825d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006182d660208361628c565b91506182e1826182a0565b602082019050919050565b60006020820190508181036000830152618305816182c9565b9050919050565b61831581615ecb565b811461832057600080fd5b50565b6000815190506183328161830c565b92915050565b60006020828403121561834e5761834d615e3c565b5b600061835c84828501618323565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b600061839b60208361628c565b91506183a682618365565b602082019050919050565b600060208201905081810360008301526183ca8161838e565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b600061842d60318361628c565b9150618438826183d1565b604082019050919050565b6000602082019050818103600083015261845c81618420565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006184bf60218361628c565b91506184ca82618463565b604082019050919050565b600060208201905081810360008301526184ee816184b2565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b600061852b60188361628c565b9150618536826184f5565b602082019050919050565b6000602082019050818103600083015261855a8161851e565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006185bd60218361628c565b91506185c882618561565b604082019050919050565b600060208201905081810360008301526185ec816185b0565b9050919050565b600067ffffffffffffffff82169050919050565b6000618612826185f3565b915061861d836185f3565b9250828201905067ffffffffffffffff81111561863d5761863c617998565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061868b82616281565b618695818561866f565b93506186a581856020860161629d565b6186ae81616004565b840191505092915050565b60006186c58383618680565b905092915050565b6000602082019050919050565b60006186e582618643565b6186ef818561864e565b9350836020820285016187018561865f565b8060005b8581101561873d578484038952815161871e85826186b9565b9450618729836186cd565b925060208a01995050600181019050618705565b50829750879550505050505092915050565b600061876a618765618760846185f3565b617313565b615f01565b9050919050565b61877a8161874f565b82525050565b600061012082019050618796600083018c615f0b565b6187a3602083018b616557565b81810360408301526187b5818a6176c6565b905081810360608301526187c9818961695a565b905081810360808301526187dd81886186da565b905081810360a08301526187f181876177bb565b905061880060c0830186618771565b61880d60e0830185618771565b81810361010083015261882081846162c7565b90509a9950505050505050505050565b60006040820190506188456000830185616557565b6188526020830184615f0b565b9392505050565b600060408201905061886e6000830185616557565b61887b6020830184616557565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006188de60278361628c565b91506188e982618882565b604082019050919050565b6000602082019050818103600083015261890d816188d1565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061894a60028361753f565b915061895582618914565b600282019050919050565b6000819050919050565b61897b61897682616140565b618960565b82525050565b600061898c8261893d565b9150618998828561896a565b6020820191506189a8828461896a565b6020820191508190509392505050565b60006080820190506189cd60008301876168a3565b6189da60208301866173d6565b6189e760408301856168a3565b6189f460608301846168a3565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000618a3360188361628c565b9150618a3e826189fd565b602082019050919050565b60006020820190508181036000830152618a6281618a26565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618a9f601f8361628c565b9150618aaa82618a69565b602082019050919050565b60006020820190508181036000830152618ace81618a92565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618b3160228361628c565b9150618b3c82618ad5565b604082019050919050565b60006020820190508181036000830152618b6081618b24565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618bc360228361628c565b9150618bce82618b67565b604082019050919050565b60006020820190508181036000830152618bf281618bb6565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b6000618c5560278361628c565b9150618c6082618bf9565b604082019050919050565b60006020820190508181036000830152618c8481618c48565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b6000618ce760358361628c565b9150618cf282618c8b565b604082019050919050565b60006020820190508181036000830152618d1681618cda565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b6000618d53601d8361628c565b9150618d5e82618d1d565b602082019050919050565b60006020820190508181036000830152618d8281618d46565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b6000618de560268361628c565b9150618df082618d89565b604082019050919050565b60006020820190508181036000830152618e1481618dd8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000618e7760268361628c565b9150618e8282618e1b565b604082019050919050565b60006020820190508181036000830152618ea681618e6a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618ee3601d8361628c565b9150618eee82618ead565b602082019050919050565b60006020820190508181036000830152618f1281618ed6565b9050919050565b6000618f2482616dd4565b618f2e818561738d565b9350618f3e81856020860161629d565b80840191505092915050565b6000618f568284618f19565b915081905092915050565b600060a082019050618f7660008301886168a3565b618f8360208301876168a3565b618f9060408301866168a3565b618f9d6060830185615f0b565b618faa6080830184616557565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220e4c4ef21389682e5feb911735f43d26b7f768b1c9cb28c392aa5dda9dbadea4264736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106104825760003560e01c8063794d556011610255578063bd1c9e4911610144578063deaaa7cc116100c1578063ece40cc111610085578063ece40cc114611464578063f23a6e611461148d578063f2fde38b146114ca578063f8ce560a146114f3578063fc0c546a14611530578063fea856a11461155b576104c8565b8063deaaa7cc14611358578063e0c410cc14611383578063e8405801146113c0578063ea0217cf146113fe578063eb9019d414611427576104c8565b8063ca1d209d11610108578063ca1d209d1461126c578063cf68625914611288578063d33219b4146112c5578063dc73204b146112f0578063dd4e2ba51461132d576104c8565b8063bd1c9e4914611161578063c01f9e371461118c578063c0d55329146111c9578063c28bc2fa14611206578063c59057e41461122f576104c8565b806397c3d334116101d2578063abe1aae611610196578063abe1aae614611042578063b58131b01461107f578063b59d18a0146110aa578063bba9c219146110e7578063bc197c8114611124576104c8565b806397c3d33414610f495780639a802a6d14610f74578063a7713a7014610fb1578063a890c91014610fdc578063ab58fb8e14611005576104c8565b806387030f4d1161021957806387030f4d14610e505780638da5cb5b14610e795780638fb5548f14610ea4578063902bfa2414610ee157806396aa167e14610f1e576104c8565b8063794d556014610d315780637b3c71d314610d6e5780637d5e81e214610dab578063809b268e14610de8578063868661cb14610e25576104c8565b80633fafa127116103715780635b6b4652116102ee5780636ee8e8ef116102b25780636ee8e8ef14610c3a57806370084d7a14610c7757806370b0f66014610cb457806370c753f014610cdd578063715018a614610d1a576104c8565b80635b6b465214610b085780635ced7d4014610b455780635f398a1414610b8257806360c4247f14610bbf5780636e04ff0d14610bfc576104c8565b80634fac2bb7116103355780634fac2bb7146109f9578063535bf50f14610a36578063544ffc9c14610a6157806354fd4d5014610aa05780635678138814610acb576104c8565b80633fafa127146108ee5780633fd1c809146109195780634385963214610956578063446a156f146109935780634585e33b146109d0576104c8565b8063160cbed7116103ff5780633932abb1116103c35780633932abb1146107f55780633bccf4fd146108205780633be2f2a31461085d5780633e4f49e6146108865780633f3b3b27146108c3576104c8565b8063160cbed7146106e35780632656227d146107205780632d63f693146107505780632fe3e2611461078d57806335debf2d146107b8576104c8565b80630cee1725116104465780630cee1725146105c6578063141a6c22146105ef578063148038b01461062c578063150b7a0214610669578063156277be146106a6576104c8565b806301ffc9a7146104cd57806302a251a31461050a578063034201811461053557806306f3f9e61461057257806306fdde031461059b576104c8565b366104c8573073ffffffffffffffffffffffffffffffffffffffff166104a6611565565b73ffffffffffffffffffffffffffffffffffffffff16146104c657600080fd5b005b600080fd5b3480156104d957600080fd5b506104f460048036038101906104ef9190615e9e565b611574565b6040516105019190615ee6565b60405180910390f35b34801561051657600080fd5b5061051f611586565b60405161052c9190615f1a565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190616176565b611595565b6040516105699190615f1a565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190616254565b61167a565b005b3480156105a757600080fd5b506105b0611771565b6040516105bd9190616300565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190616254565b611803565b005b3480156105fb57600080fd5b50610616600480360381019061061191906163c3565b611a1f565b6040516106239190615f1a565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e919061646a565b611a47565b6040516106609190615f1a565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b91906164aa565b611a6c565b60405161069d919061653c565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190616254565b611a80565b6040516106da9190616566565b60405180910390f35b3480156106ef57600080fd5b5061070a600480360381019061070591906167e8565b611ab3565b6040516107179190615f1a565b60405180910390f35b61073a600480360381019061073591906167e8565b611d6d565b6040516107479190615f1a565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190616254565b611eba565b6040516107849190615f1a565b60405180910390f35b34801561079957600080fd5b506107a2611f28565b6040516107af91906168b2565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da91906168cd565b611f4c565b6040516107ec91906169b8565b60405180910390f35b34801561080157600080fd5b5061080a611fe3565b6040516108179190615f1a565b60405180910390f35b34801561082c57600080fd5b50610847600480360381019061084291906169da565b611ff2565b6040516108549190615f1a565b60405180910390f35b34801561086957600080fd5b50610884600480360381019061087f9190616a55565b61207c565b005b34801561089257600080fd5b506108ad60048036038101906108a89190616254565b6122e9565b6040516108ba9190616b4f565b60405180910390f35b3480156108cf57600080fd5b506108d86122fb565b6040516108e59190615f1a565b60405180910390f35b3480156108fa57600080fd5b50610903612301565b6040516109109190615f1a565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b9190616254565b612307565b60405161094d9190615f1a565b60405180910390f35b34801561096257600080fd5b5061097d6004803603810190610978919061646a565b612361565b60405161098a9190615ee6565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190616254565b6123cc565b6040516109c79190616bb2565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190616c23565b6123f6565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190616254565b612702565b604051610a2d9190615ee6565b60405180910390f35b348015610a4257600080fd5b50610a4b612722565b604051610a589190615f1a565b60405180910390f35b348015610a6d57600080fd5b50610a886004803603810190610a839190616254565b61272c565b604051610a9793929190616c70565b60405180910390f35b348015610aac57600080fd5b50610ab5612764565b604051610ac29190616300565b60405180910390f35b348015610ad757600080fd5b50610af26004803603810190610aed9190616ca7565b6127a1565b604051610aff9190615f1a565b60405180910390f35b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190616254565b6127d2565b604051610b3c9190615f1a565b60405180910390f35b348015610b5157600080fd5b50610b6c6004803603810190610b679190616254565b6127ea565b604051610b799190615f1a565b60405180910390f35b348015610b8e57600080fd5b50610ba96004803603810190610ba49190616ce7565b612802565b604051610bb69190615f1a565b60405180910390f35b348015610bcb57600080fd5b50610be66004803603810190610be19190616254565b61286c565b604051610bf39190615f1a565b60405180910390f35b348015610c0857600080fd5b50610c236004803603810190610c1e9190616d8b565b6129b8565b604051610c31929190616e29565b60405180910390f35b348015610c4657600080fd5b50610c616004803603810190610c5c91906168cd565b612aa3565b604051610c6e9190615ee6565b60405180910390f35b348015610c8357600080fd5b50610c9e6004803603810190610c999190616254565b612ac3565b604051610cab9190616bb2565b60405180910390f35b348015610cc057600080fd5b50610cdb6004803603810190610cd69190616254565b612ae3565b005b348015610ce957600080fd5b50610d046004803603810190610cff9190616e59565b612bda565b604051610d119190615f1a565b60405180910390f35b348015610d2657600080fd5b50610d2f612c0b565b005b348015610d3d57600080fd5b50610d586004803603810190610d539190616254565b612c1f565b604051610d659190615f1a565b60405180910390f35b348015610d7a57600080fd5b50610d956004803603810190610d909190616e99565b612c37565b604051610da29190615f1a565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd9190616f0d565b612c9f565b604051610ddf9190615f1a565b60405180910390f35b348015610df457600080fd5b50610e0f6004803603810190610e0a9190616254565b612d3a565b604051610e1c9190615ee6565b60405180910390f35b348015610e3157600080fd5b50610e3a612d64565b604051610e479190615f1a565b60405180910390f35b348015610e5c57600080fd5b50610e776004803603810190610e729190616254565b612d6a565b005b348015610e8557600080fd5b50610e8e612e0d565b604051610e9b9190616566565b60405180910390f35b348015610eb057600080fd5b50610ecb6004803603810190610ec69190616254565b612e37565b604051610ed89190616300565b60405180910390f35b348015610eed57600080fd5b50610f086004803603810190610f039190616254565b612ed7565b604051610f159190615ee6565b60405180910390f35b348015610f2a57600080fd5b50610f33612ef7565b604051610f409190615f1a565b60405180910390f35b348015610f5557600080fd5b50610f5e612efd565b604051610f6b9190615f1a565b60405180910390f35b348015610f8057600080fd5b50610f9b6004803603810190610f969190616fe4565b612f06565b604051610fa89190615f1a565b60405180910390f35b348015610fbd57600080fd5b50610fc6612f1c565b604051610fd39190615f1a565b60405180910390f35b348015610fe857600080fd5b506110036004803603810190610ffe91906170a3565b612f45565b005b34801561101157600080fd5b5061102c60048036038101906110279190616254565b61303c565b6040516110399190615f1a565b60405180910390f35b34801561104e57600080fd5b5061106960048036038101906110649190616254565b613109565b6040516110769190616300565b60405180910390f35b34801561108b57600080fd5b506110946131ae565b6040516110a19190615f1a565b60405180910390f35b3480156110b657600080fd5b506110d160048036038101906110cc9190616254565b6131bd565b6040516110de9190615f1a565b60405180910390f35b3480156110f357600080fd5b5061110e60048036038101906111099190616254565b6131da565b60405161111b9190615f1a565b60405180910390f35b34801561113057600080fd5b5061114b600480360381019061114691906170d0565b6131f7565b604051611158919061653c565b60405180910390f35b34801561116d57600080fd5b5061117661320c565b6040516111839190615f1a565b60405180910390f35b34801561119857600080fd5b506111b360048036038101906111ae9190616254565b613216565b6040516111c09190615f1a565b60405180910390f35b3480156111d557600080fd5b506111f060048036038101906111eb91906168cd565b613284565b6040516111fd9190615ee6565b60405180910390f35b34801561121257600080fd5b5061122d6004803603810190611228919061719f565b6132da565b005b34801561123b57600080fd5b50611256600480360381019061125191906167e8565b61341b565b6040516112639190615f1a565b60405180910390f35b61128660048036038101906112819190616254565b613457565b005b34801561129457600080fd5b506112af60048036038101906112aa91906163c3565b6135a1565b6040516112bc9190615f1a565b60405180910390f35b3480156112d157600080fd5b506112da6135cf565b6040516112e79190616566565b60405180910390f35b3480156112fc57600080fd5b5061131760048036038101906113129190617213565b6135f9565b6040516113249190615f1a565b60405180910390f35b34801561133957600080fd5b5061134261361e565b60405161134f9190616300565b60405180910390f35b34801561136457600080fd5b5061136d61365b565b60405161137a91906168b2565b60405180910390f35b34801561138f57600080fd5b506113aa60048036038101906113a59190616254565b61367f565b6040516113b79190615ee6565b60405180910390f35b3480156113cc57600080fd5b506113e760048036038101906113e29190616254565b6136a9565b6040516113f5929190617253565b60405180910390f35b34801561140a57600080fd5b5061142560048036038101906114209190616254565b61370c565b005b34801561143357600080fd5b5061144e60048036038101906114499190616e59565b613803565b60405161145b9190615f1a565b60405180910390f35b34801561147057600080fd5b5061148b60048036038101906114869190616254565b61381f565b005b34801561149957600080fd5b506114b460048036038101906114af919061727c565b613916565b6040516114c1919061653c565b60405180910390f35b3480156114d657600080fd5b506114f160048036038101906114ec91906168cd565b61392b565b005b3480156114ff57600080fd5b5061151a60048036038101906115159190616254565b6139ae565b6040516115279190615f1a565b60405180910390f35b34801561153c57600080fd5b506115456139c0565b6040516115529190617372565b60405180910390f35b6115636139e4565b005b600061156f613e18565b905090565b600061157f82613e42565b9050919050565b6000611590613ebc565b905090565b6000806116186116107fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c6040516115d19291906173bd565b60405180910390208b805190602001206040516020016115f59594939291906173e5565b60405160208183030381529060405280519060200120613ec6565b868686613ee0565b905061166b8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613f0b565b91505098975050505050505050565b611682611565565b73ffffffffffffffffffffffffffffffffffffffff166116a06140c7565b73ffffffffffffffffffffffffffffffffffffffff16146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611715611565565b73ffffffffffffffffffffffffffffffffffffffff161461176557600061173a6140cf565b6040516117489291906173bd565b604051809103902090505b8061175e60026140dc565b0361175357505b61176e816141b8565b50565b606060008054611780906174d3565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac906174d3565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b5050505050905090565b6002600381111561181757611816616ad8565b5b601b600083815260200190815260200160002060009054906101000a900460ff16600381111561184a57611849616ad8565b5b036119ea5760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16826040516119209061752a565b60006040518083038185875af1925050503d806000811461195d576040519150601f19603f3d011682016040523d82523d6000602084013e611962565b606091505b505090508061199d576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d543373ffffffffffffffffffffffffffffffffffffffff167f370c08173448a868859170331cf95622fc6b9ca192121cc9aae246cf05b3ab7c60405160405180910390a35050611a1c565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000601482604051611a31919061757b565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611ac28686868661341b565b905060046007811115611ad857611ad7616ad8565b5b611ae1826122e9565b6007811115611af357611af2616ad8565b5b14611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a90617604565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190617639565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611c2c959493929190617878565b602060405180830381865afa158015611c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6d91906178f5565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611cea96959493929190617922565b600060405180830381600087803b158015611d0457600080fd5b505af1158015611d18573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611d4a91906179c7565b604051611d58929190617253565b60405180910390a18192505050949350505050565b600080611d7c8686868661341b565b90506000611d89826122e9565b905060046007811115611d9f57611d9e616ad8565b5b816007811115611db257611db1616ad8565b5b1480611de2575060056007811115611dcd57611dcc616ad8565b5b816007811115611de057611ddf616ad8565b5b145b611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890617604565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611e7e9190615f1a565b60405180910390a1611e93828888888861436c565b611ea0828888888861444f565b611ead8288888888614463565b8192505050949350505050565b6000611f17600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6060601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611fd757602002820191906000526020600020905b815481526020019060010190808311611fc3575b50505050509050919050565b6000611fed6144cc565b905090565b60008061205361204b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001612030939291906179fb565b60405160208183030381529060405280519060200120613ec6565b868686613ee0565b9050612070878288604051806020016040528060008152506144d6565b91505095945050505050565b6120846144f6565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612107576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561216b5761216a616ad8565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d546014856040516121b7919061757b565b9081526020016040518091039020819055508360156000600d54815260200190815260200160002090816121eb9190617bd4565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d60008154809291906122de90617ca6565b919050555050505050565b60006122f482614574565b9050919050565b600e5481565b600d5481565b60006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000612410604051806020016040528060008152506129b8565b5090508061244a576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008383906124599190617cf9565b60001c905060006011600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601860008281526020019081526020016000205460176000838152602001908152602001600020541115612692576001601b600083815260200190815260200160002060006101000a81548160ff0219169083600381111561251b5761251a616ad8565b5b021790555060006064600f5460176000858152602001908152602001600020546125459190617d58565b61254f9190617dc9565b9050600060176000848152602001908152602001600020819055506000601a600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516125c39061752a565b60006040518083038185875af1925050503d8060008114612600576040519150601f19603f3d011682016040523d82523d6000602084013e612605565b606091505b505090508061265e5760176000848152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016126559190615f1a565b60405180910390fd5b827f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a250506126fc565b6002601b600083815260200190815260200160002060006101000a81548160ff021916908360038111156126c9576126c8616ad8565b5b0217905550807f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b50505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806127ac6140c7565b90506127c9848285604051806020016040528060008152506144d6565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b60008061280d6140c7565b905061286087828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613f0b565b91505095945050505050565b60008060096000018054905090506000810361288d576008549150506129b3565b600060096000016001836128a19190617dfa565b815481106128b2576128b1617e2e565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161299a5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506129b3565b6129ae84600961474790919063ffffffff16565b925050505b919050565b600060606000600190505b600d548111612a9d5760006011600083815260200190815260200160002060009054906101000a900460ff16905060006013600084815260200190815260200160002054601260008581526020019081526020016000206000601360008781526020019081526020016000205481526020019081526020016000205442612a4a9190617dfa565b119050818015612a575750805b94508415612a885782604051602001612a709190617e7e565b60405160208183030381529060405293505050612a9d565b50508080612a9590617ca6565b9150506129c3565b50915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b612aeb611565565b73ffffffffffffffffffffffffffffffffffffffff16612b096140c7565b73ffffffffffffffffffffffffffffffffffffffff1614612b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5690617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612b7e611565565b73ffffffffffffffffffffffffffffffffffffffff1614612bce576000612ba36140cf565b604051612bb19291906173bd565b604051809103902090505b80612bc760026140dc565b03612bbc57505b612bd78161489f565b50565b601d6020528160005260406000208181548110612bf657600080fd5b90600052602060002001600091509150505481565b612c136144f6565b612c1d60006148e4565b565b60176020528060005260406000206000915090505481565b600080612c426140c7565b9050612c9486828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506144d6565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d24576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d30858585856149aa565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612d726144f6565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612e0557612e04616ad8565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612e56906174d3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e82906174d3565b8015612ecf5780601f10612ea457610100808354040283529160200191612ecf565b820191906000526020600020905b815481529060010190602001808311612eb257829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612f13848484614cb1565b90509392505050565b60008060096000018054905014612f3c57612f376009613d2a565b612f40565b6008545b905090565b612f4d611565565b73ffffffffffffffffffffffffffffffffffffffff16612f6b6140c7565b73ffffffffffffffffffffffffffffffffffffffff1614612fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb890617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612fe0611565565b73ffffffffffffffffffffffffffffffffffffffff16146130305760006130056140cf565b6040516130139291906173bd565b604051809103902090505b8061302960026140dc565b0361301e57505b61303981614d58565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b81526004016130ad91906168b2565b602060405180830381865afa1580156130ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ee9190617639565b9050600181146130fe5780613101565b60005b915050919050565b6060601560008381526020019081526020016000208054613129906174d3565b80601f0160208091040260200160405190810160405280929190818152602001828054613155906174d3565b80156131a25780601f10613177576101008083540402835291602001916131a2565b820191906000526020600020905b81548152906001019060200180831161318557829003601f168201915b50505050509050919050565b60006131b8614df7565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000600f54905090565b6000613273600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6132e2611565565b73ffffffffffffffffffffffffffffffffffffffff166133006140c7565b73ffffffffffffffffffffffffffffffffffffffff1614613356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334d90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16613375611565565b73ffffffffffffffffffffffffffffffffffffffff16146133c557600061339a6140cf565b6040516133a89291906173bd565b604051809103902090505b806133be60026140dc565b036133b357505b6134148483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085614e01565b5050505050565b6000848484846040516020016134349493929190617e99565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff166134af576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461350f91906179c7565b925050819055503460176000848152602001908152602001600020600082825461353991906179c7565b92505081905550604051806020016040528083815250601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090600161359c929190615dc8565b505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806012600084815260200190815260200160002060006013600086815260200190815260200160002054815260200190815260200160002054426136ef9190617dfa565b915060136000848152602001908152602001600020549050915091565b613714611565565b73ffffffffffffffffffffffffffffffffffffffff166137326140c7565b73ffffffffffffffffffffffffffffffffffffffff1614613788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377f90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166137a7611565565b73ffffffffffffffffffffffffffffffffffffffff16146137f75760006137cc6140cf565b6040516137da9291906173bd565b604051809103902090505b806137f060026140dc565b036137e557505b61380081614e30565b50565b60006138178383613812614eb8565b614cb1565b905092915050565b613827611565565b73ffffffffffffffffffffffffffffffffffffffff166138456140c7565b73ffffffffffffffffffffffffffffffffffffffff161461389b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389290617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166138ba611565565b73ffffffffffffffffffffffffffffffffffffffff161461390a5760006138df6140cf565b6040516138ed9291906173bd565b604051809103902090505b8061390360026140dc565b036138f857505b61391381614ecf565b50565b600063f23a6e6160e01b905095945050505050565b6139336144f6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036139a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399990617f65565b60405180910390fd5b6139ab816148e4565b50565b60006139b982614f14565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601054341015613a20576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1790617ff7565b60405180910390fd5b819050919050565b6000806000846000018054905090506000613b4286613d2a565b9050600082118015613b9857504386600001600184613b619190617dfa565b81548110613b7257613b71617e2e565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15613c2857613ba685613abd565b86600001600184613bb79190617dfa565b81548110613bc857613bc7617e2e565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613d1b565b856000016040518060400160405280613c4043613dc5565b63ffffffff168152602001613c5488613abd565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613d9c5782600001600182613d509190617dfa565b81548110613d6157613d60617e2e565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613d9f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115613e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e0790618089565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613eb55750613eb482614fdc565b5b9050919050565b6000600554905090565b6000613ed9613ed3615141565b8361525b565b9050919050565b6000806000613ef18787878761528e565b91509150613efe8161539a565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613f3757613f36616ad8565b5b613f40886122e9565b6007811115613f5257613f51616ad8565b5b14613f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f899061811b565b60405180910390fd5b6000613ff187613fe1846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff1686614cb1565b90506140008888888488615566565b6000845103614062578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051614055949392919061813b565b60405180910390a26140b9565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb871289888489896040516140b0959493929190618187565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b60006140e78261576a565b1561411e576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b6141c0612efd565b811115614202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141f990618280565b60405180910390fd5b600061420c612f1c565b90506000811415801561422757506000600960000180549050145b156143195760096000016040518060400160405280600063ffffffff16815260200161425284613abd565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b61432d826009613b2890919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051614360929190617253565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff1661438b611565565b73ffffffffffffffffffffffffffffffffffffffff16146144485760005b8451811015614446573073ffffffffffffffffffffffffffffffffffffffff168582815181106143dc576143db617e2e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036144355761443483828151811061441557614414617e2e565b5b602002602001015180519060200120600261579f90919063ffffffff16565b5b8061443f90617ca6565b90506143a9565b505b5050505050565b61445c858585858561581b565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff16614482611565565b73ffffffffffffffffffffffffffffffffffffffff16146144b7576144a7600261576a565b6144b6576144b560026158b9565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006144ec858585856144e7614eb8565b613f0b565b9050949350505050565b6144fe6140c7565b73ffffffffffffffffffffffffffffffffffffffff1661451c612e0d565b73ffffffffffffffffffffffffffffffffffffffff1614614572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614569906182ec565b60405180910390fd5b565b6000806145808361593a565b90506004600781111561459657614595616ad8565b5b8160078111156145a9576145a8616ad8565b5b146145b75780915050614742565b6000600b60008581526020019081526020016000205490506000801b81036145e3578192505050614742565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b815260040161463e91906168b2565b602060405180830381865afa15801561465b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467f9190618338565b1561468f57600792505050614742565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016146ea91906168b2565b602060405180830381865afa158015614707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061472b9190618338565b1561473b57600592505050614742565b6002925050505b919050565b600043821061478b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614782906183b1565b60405180910390fd5b60008360000180549050905060005b8181101561480f5760006147ae8284615a4e565b9050848660000182815481106147c7576147c6617e2e565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156147f957809250614809565b60018161480691906179c7565b91505b5061479a565b6000821461487457846000016001836148289190617dfa565b8154811061483957614838617e2e565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16614877565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516148d2929190617253565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006149b46131ae565b6149d16149bf6140c7565b6001436149cc9190617dfa565b613803565b1015614a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a0990618443565b60405180910390fd5b6000614a27868686868051906020012061341b565b90508451865114614a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a64906184d5565b60405180910390fd5b8351865114614ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aa8906184d5565b60405180910390fd5b6000865111614af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aec90618541565b60405180910390fd5b6000600160008381526020019081526020016000209050614b55816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050615a74565b614b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b8b906185d3565b60405180910390fd5b6000614ba6614ba1611fe3565b615a8e565b614baf43615a8e565b614bb99190618607565b90506000614bcd614bc8611586565b615a8e565b82614bd89190618607565b9050614bf08284600001615ae590919063ffffffff16565b614c068184600101615ae590919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614c306140c7565b8b8b8d5167ffffffffffffffff811115614c4d57614c4c616015565b5b604051908082528060200260200182016040528015614c8057816020015b6060815260200190600190039081614c6b5790505b508c88888e604051614c9a99989796959493929190618780565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401614d0e929190618830565b602060405180830381865afa158015614d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d4f9190617639565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051614dab929190618859565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b6060614e27848484604051806060016040528060298152602001618fb560299139615b14565b90509392505050565b60008111614e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614e6a906188f4565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614ea6929190617253565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614f02929190617253565b60405180910390a18060068190555050565b6000614f1e612efd565b614f278361286c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614f809190615f1a565b602060405180830381865afa158015614f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fc19190617639565b614fcb9190617d58565b614fd59190617dc9565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806150c257507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061512a57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061513a575061513982615c28565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156151bd57507f000000000000000000000000000000000000000000000000000000000000000046145b156151ea577f00000000000000000000000000000000000000000000000000000000000000009050615258565b6152557f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000615c92565b90505b90565b60008282604051602001615270929190618981565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156152c9576000600391509150615391565b601b8560ff16141580156152e15750601c8560ff1614155b156152f3576000600491509150615391565b60006001878787876040516000815260200160405260405161531894939291906189b8565b6020604051602081039080840390855afa15801561533a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361538857600060019250925050615391565b80600092509250505b94509492505050565b600060048111156153ae576153ad616ad8565b5b8160048111156153c1576153c0616ad8565b5b031561556357600160048111156153db576153da616ad8565b5b8160048111156153ee576153ed616ad8565b5b0361542e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161542590618a49565b60405180910390fd5b6002600481111561544257615441616ad8565b5b81600481111561545557615454616ad8565b5b03615495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161548c90618ab5565b60405180910390fd5b600360048111156154a9576154a8616ad8565b5b8160048111156154bc576154bb616ad8565b5b036154fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016154f390618b47565b60405180910390fd5b60048081111561550f5761550e616ad8565b5b81600481111561552257615521616ad8565b5b03615562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161555990618bd9565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561560c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161560390618c6b565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561567a57615679616ad8565b5b60ff168460ff16036156a6578281600001600082825461569a91906179c7565b92505081905550615762565b600160028111156156ba576156b9616ad8565b5b60ff168460ff16036156e657828160010160008282546156da91906179c7565b92505081905550615761565b6002808111156156f9576156f8616ad8565b5b60ff168460ff1603615725578281600201600082825461571991906179c7565b92505081905550615760565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161575790618cfd565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401615880959493929190617878565b6000604051808303818588803b15801561589957600080fd5b505af11580156158ad573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615615973576007915050615a49565b8060020160019054906101000a900460ff1615615994576002915050615a49565b600061599f84611eba565b9050600081036159e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159db90618d69565b60405180910390fd5b4381106159f657600092505050615a49565b6000615a0185613216565b9050438110615a165760019350505050615a49565b615a1f85615ccc565b8015615a305750615a2f85615d13565b5b15615a415760049350505050615a49565b600393505050505b919050565b60006002828418615a5f9190617dc9565b828416615a6c91906179c7565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115615add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615ad490618dfb565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b5090618e8d565b60405180910390fd5b615b6285615d3e565b615ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b9890618ef9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615bca9190618f4a565b60006040518083038185875af1925050503d8060008114615c07576040519150601f19603f3d011682016040523d82523d6000602084013e615c0c565b606091505b5091509150615c1c828286615d61565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615cad959493929190618f61565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154615cf891906179c7565b615d09615d0485611eba565b6139ae565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315615d7157829050615dc1565b600083511115615d845782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615db89190616300565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215615e04579160200282015b82811115615e03578251825591602001919060010190615de8565b5b509050615e119190615e15565b5090565b5b80821115615e2e576000816000905550600101615e16565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b615e7b81615e46565b8114615e8657600080fd5b50565b600081359050615e9881615e72565b92915050565b600060208284031215615eb457615eb3615e3c565b5b6000615ec284828501615e89565b91505092915050565b60008115159050919050565b615ee081615ecb565b82525050565b6000602082019050615efb6000830184615ed7565b92915050565b6000819050919050565b615f1481615f01565b82525050565b6000602082019050615f2f6000830184615f0b565b92915050565b615f3e81615f01565b8114615f4957600080fd5b50565b600081359050615f5b81615f35565b92915050565b600060ff82169050919050565b615f7781615f61565b8114615f8257600080fd5b50565b600081359050615f9481615f6e565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615fbf57615fbe615f9a565b5b8235905067ffffffffffffffff811115615fdc57615fdb615f9f565b5b602083019150836001820283011115615ff857615ff7615fa4565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61604d82616004565b810181811067ffffffffffffffff8211171561606c5761606b616015565b5b80604052505050565b600061607f615e32565b905061608b8282616044565b919050565b600067ffffffffffffffff8211156160ab576160aa616015565b5b6160b482616004565b9050602081019050919050565b82818337600083830152505050565b60006160e36160de84616090565b616075565b9050828152602081018484840111156160ff576160fe615fff565b5b61610a8482856160c1565b509392505050565b600082601f83011261612757616126615f9a565b5b81356161378482602086016160d0565b91505092915050565b6000819050919050565b61615381616140565b811461615e57600080fd5b50565b6000813590506161708161614a565b92915050565b60008060008060008060008060e0898b03121561619657616195615e3c565b5b60006161a48b828c01615f4c565b98505060206161b58b828c01615f85565b975050604089013567ffffffffffffffff8111156161d6576161d5615e41565b5b6161e28b828c01615fa9565b9650965050606089013567ffffffffffffffff81111561620557616204615e41565b5b6162118b828c01616112565b94505060806162228b828c01615f85565b93505060a06162338b828c01616161565b92505060c06162448b828c01616161565b9150509295985092959890939650565b60006020828403121561626a57616269615e3c565b5b600061627884828501615f4c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156162bb5780820151818401526020810190506162a0565b60008484015250505050565b60006162d282616281565b6162dc818561628c565b93506162ec81856020860161629d565b6162f581616004565b840191505092915050565b6000602082019050818103600083015261631a81846162c7565b905092915050565b600067ffffffffffffffff82111561633d5761633c616015565b5b61634682616004565b9050602081019050919050565b600061636661636184616322565b616075565b90508281526020810184848401111561638257616381615fff565b5b61638d8482856160c1565b509392505050565b600082601f8301126163aa576163a9615f9a565b5b81356163ba848260208601616353565b91505092915050565b6000602082840312156163d9576163d8615e3c565b5b600082013567ffffffffffffffff8111156163f7576163f6615e41565b5b61640384828501616395565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006164378261640c565b9050919050565b6164478161642c565b811461645257600080fd5b50565b6000813590506164648161643e565b92915050565b6000806040838503121561648157616480615e3c565b5b600061648f85828601615f4c565b92505060206164a085828601616455565b9150509250929050565b600080600080608085870312156164c4576164c3615e3c565b5b60006164d287828801616455565b94505060206164e387828801616455565b93505060406164f487828801615f4c565b925050606085013567ffffffffffffffff81111561651557616514615e41565b5b61652187828801616112565b91505092959194509250565b61653681615e46565b82525050565b6000602082019050616551600083018461652d565b92915050565b6165608161642c565b82525050565b600060208201905061657b6000830184616557565b92915050565b600067ffffffffffffffff82111561659c5761659b616015565b5b602082029050602081019050919050565b60006165c06165bb84616581565b616075565b905080838252602082019050602084028301858111156165e3576165e2615fa4565b5b835b8181101561660c57806165f88882616455565b8452602084019350506020810190506165e5565b5050509392505050565b600082601f83011261662b5761662a615f9a565b5b813561663b8482602086016165ad565b91505092915050565b600067ffffffffffffffff82111561665f5761665e616015565b5b602082029050602081019050919050565b600061668361667e84616644565b616075565b905080838252602082019050602084028301858111156166a6576166a5615fa4565b5b835b818110156166cf57806166bb8882615f4c565b8452602084019350506020810190506166a8565b5050509392505050565b600082601f8301126166ee576166ed615f9a565b5b81356166fe848260208601616670565b91505092915050565b600067ffffffffffffffff82111561672257616721616015565b5b602082029050602081019050919050565b600061674661674184616707565b616075565b9050808382526020820190506020840283018581111561676957616768615fa4565b5b835b818110156167b057803567ffffffffffffffff81111561678e5761678d615f9a565b5b80860161679b8982616112565b8552602085019450505060208101905061676b565b5050509392505050565b600082601f8301126167cf576167ce615f9a565b5b81356167df848260208601616733565b91505092915050565b6000806000806080858703121561680257616801615e3c565b5b600085013567ffffffffffffffff8111156168205761681f615e41565b5b61682c87828801616616565b945050602085013567ffffffffffffffff81111561684d5761684c615e41565b5b616859878288016166d9565b935050604085013567ffffffffffffffff81111561687a57616879615e41565b5b616886878288016167ba565b925050606061689787828801616161565b91505092959194509250565b6168ac81616140565b82525050565b60006020820190506168c760008301846168a3565b92915050565b6000602082840312156168e3576168e2615e3c565b5b60006168f184828501616455565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61692f81615f01565b82525050565b60006169418383616926565b60208301905092915050565b6000602082019050919050565b6000616965826168fa565b61696f8185616905565b935061697a83616916565b8060005b838110156169ab5781516169928882616935565b975061699d8361694d565b92505060018101905061697e565b5085935050505092915050565b600060208201905081810360008301526169d2818461695a565b905092915050565b600080600080600060a086880312156169f6576169f5615e3c565b5b6000616a0488828901615f4c565b9550506020616a1588828901615f85565b9450506040616a2688828901615f85565b9350506060616a3788828901616161565b9250506080616a4888828901616161565b9150509295509295909350565b60008060008060808587031215616a6f57616a6e615e3c565b5b600085013567ffffffffffffffff811115616a8d57616a8c615e41565b5b616a9987828801616395565b9450506020616aaa87828801615f4c565b9350506040616abb87828801615f4c565b9250506060616acc87828801616455565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110616b1857616b17616ad8565b5b50565b6000819050616b2982616b07565b919050565b6000616b3982616b1b565b9050919050565b616b4981616b2e565b82525050565b6000602082019050616b646000830184616b40565b92915050565b60048110616b7b57616b7a616ad8565b5b50565b6000819050616b8c82616b6a565b919050565b6000616b9c82616b7e565b9050919050565b616bac81616b91565b82525050565b6000602082019050616bc76000830184616ba3565b92915050565b60008083601f840112616be357616be2615f9a565b5b8235905067ffffffffffffffff811115616c0057616bff615f9f565b5b602083019150836001820283011115616c1c57616c1b615fa4565b5b9250929050565b60008060208385031215616c3a57616c39615e3c565b5b600083013567ffffffffffffffff811115616c5857616c57615e41565b5b616c6485828601616bcd565b92509250509250929050565b6000606082019050616c856000830186615f0b565b616c926020830185615f0b565b616c9f6040830184615f0b565b949350505050565b60008060408385031215616cbe57616cbd615e3c565b5b6000616ccc85828601615f4c565b9250506020616cdd85828601615f85565b9150509250929050565b600080600080600060808688031215616d0357616d02615e3c565b5b6000616d1188828901615f4c565b9550506020616d2288828901615f85565b945050604086013567ffffffffffffffff811115616d4357616d42615e41565b5b616d4f88828901615fa9565b9350935050606086013567ffffffffffffffff811115616d7257616d71615e41565b5b616d7e88828901616112565b9150509295509295909350565b600060208284031215616da157616da0615e3c565b5b600082013567ffffffffffffffff811115616dbf57616dbe615e41565b5b616dcb84828501616112565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000616dfb82616dd4565b616e058185616ddf565b9350616e1581856020860161629d565b616e1e81616004565b840191505092915050565b6000604082019050616e3e6000830185615ed7565b8181036020830152616e508184616df0565b90509392505050565b60008060408385031215616e7057616e6f615e3c565b5b6000616e7e85828601616455565b9250506020616e8f85828601615f4c565b9150509250929050565b60008060008060608587031215616eb357616eb2615e3c565b5b6000616ec187828801615f4c565b9450506020616ed287828801615f85565b935050604085013567ffffffffffffffff811115616ef357616ef2615e41565b5b616eff87828801615fa9565b925092505092959194509250565b60008060008060808587031215616f2757616f26615e3c565b5b600085013567ffffffffffffffff811115616f4557616f44615e41565b5b616f5187828801616616565b945050602085013567ffffffffffffffff811115616f7257616f71615e41565b5b616f7e878288016166d9565b935050604085013567ffffffffffffffff811115616f9f57616f9e615e41565b5b616fab878288016167ba565b925050606085013567ffffffffffffffff811115616fcc57616fcb615e41565b5b616fd887828801616395565b91505092959194509250565b600080600060608486031215616ffd57616ffc615e3c565b5b600061700b86828701616455565b935050602061701c86828701615f4c565b925050604084013567ffffffffffffffff81111561703d5761703c615e41565b5b61704986828701616112565b9150509250925092565b600061705e8261640c565b9050919050565b600061707082617053565b9050919050565b61708081617065565b811461708b57600080fd5b50565b60008135905061709d81617077565b92915050565b6000602082840312156170b9576170b8615e3c565b5b60006170c78482850161708e565b91505092915050565b600080600080600060a086880312156170ec576170eb615e3c565b5b60006170fa88828901616455565b955050602061710b88828901616455565b945050604086013567ffffffffffffffff81111561712c5761712b615e41565b5b617138888289016166d9565b935050606086013567ffffffffffffffff81111561715957617158615e41565b5b617165888289016166d9565b925050608086013567ffffffffffffffff81111561718657617185615e41565b5b61719288828901616112565b9150509295509295909350565b600080600080606085870312156171b9576171b8615e3c565b5b60006171c787828801616455565b94505060206171d887828801615f4c565b935050604085013567ffffffffffffffff8111156171f9576171f8615e41565b5b61720587828801616bcd565b925092505092959194509250565b6000806040838503121561722a57617229615e3c565b5b600061723885828601615f4c565b925050602061724985828601615f4c565b9150509250929050565b60006040820190506172686000830185615f0b565b6172756020830184615f0b565b9392505050565b600080600080600060a0868803121561729857617297615e3c565b5b60006172a688828901616455565b95505060206172b788828901616455565b94505060406172c888828901615f4c565b93505060606172d988828901615f4c565b925050608086013567ffffffffffffffff8111156172fa576172f9615e41565b5b61730688828901616112565b9150509295509295909350565b6000819050919050565b600061733861733361732e8461640c565b617313565b61640c565b9050919050565b600061734a8261731d565b9050919050565b600061735c8261733f565b9050919050565b61736c81617351565b82525050565b60006020820190506173876000830184617363565b92915050565b600081905092915050565b60006173a4838561738d565b93506173b18385846160c1565b82840190509392505050565b60006173ca828486617398565b91508190509392505050565b6173df81615f61565b82525050565b600060a0820190506173fa60008301886168a3565b6174076020830187615f0b565b61741460408301866173d6565b61742160608301856168a3565b61742e60808301846168a3565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b600061746e60188361628c565b915061747982617438565b602082019050919050565b6000602082019050818103600083015261749d81617461565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806174eb57607f821691505b6020821081036174fe576174fd6174a4565b5b50919050565b50565b600061751460008361738d565b915061751f82617504565b600082019050919050565b600061753582617507565b9150819050919050565b600081905092915050565b600061755582616281565b61755f818561753f565b935061756f81856020860161629d565b80840191505092915050565b6000617587828461754a565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006175ee60218361628c565b91506175f982617592565b604082019050919050565b6000602082019050818103600083015261761d816175e1565b9050919050565b60008151905061763381615f35565b92915050565b60006020828403121561764f5761764e615e3c565b5b600061765d84828501617624565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61769b8161642c565b82525050565b60006176ad8383617692565b60208301905092915050565b6000602082019050919050565b60006176d182617666565b6176db8185617671565b93506176e683617682565b8060005b838110156177175781516176fe88826176a1565b9750617709836176b9565b9250506001810190506176ea565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061776c82616dd4565b6177768185617750565b935061778681856020860161629d565b61778f81616004565b840191505092915050565b60006177a68383617761565b905092915050565b6000602082019050919050565b60006177c682617724565b6177d0818561772f565b9350836020820285016177e285617740565b8060005b8581101561781e57848403895281516177ff858261779a565b945061780a836177ae565b925060208a019950506001810190506177e6565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061786261785d61785884617830565b61783a565b616140565b9050919050565b61787281617847565b82525050565b600060a082019050818103600083015261789281886176c6565b905081810360208301526178a6818761695a565b905081810360408301526178ba81866177bb565b90506178c96060830185617869565b6178d660808301846168a3565b9695505050505050565b6000815190506178ef8161614a565b92915050565b60006020828403121561790b5761790a615e3c565b5b6000617919848285016178e0565b91505092915050565b600060c082019050818103600083015261793c81896176c6565b90508181036020830152617950818861695a565b9050818103604083015261796481876177bb565b90506179736060830186617869565b61798060808301856168a3565b61798d60a0830184615f0b565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006179d282615f01565b91506179dd83615f01565b92508282019050808211156179f5576179f4617998565b5b92915050565b6000606082019050617a1060008301866168a3565b617a1d6020830185615f0b565b617a2a60408301846173d6565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302617a947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617a57565b617a9e8683617a57565b95508019841693508086168417925050509392505050565b6000617ad1617acc617ac784615f01565b617313565b615f01565b9050919050565b6000819050919050565b617aeb83617ab6565b617aff617af782617ad8565b848454617a64565b825550505050565b600090565b617b14617b07565b617b1f818484617ae2565b505050565b5b81811015617b4357617b38600082617b0c565b600181019050617b25565b5050565b601f821115617b8857617b5981617a32565b617b6284617a47565b81016020851015617b71578190505b617b85617b7d85617a47565b830182617b24565b50505b505050565b600082821c905092915050565b6000617bab60001984600802617b8d565b1980831691505092915050565b6000617bc48383617b9a565b9150826002028217905092915050565b617bdd82616281565b67ffffffffffffffff811115617bf657617bf5616015565b5b617c0082546174d3565b617c0b828285617b47565b600060209050601f831160018114617c3e5760008415617c2c578287015190505b617c368582617bb8565b865550617c9e565b601f198416617c4c86617a32565b60005b82811015617c7457848901518255600182019150602085019450602081019050617c4f565b86831015617c915784890151617c8d601f891682617b9a565b8355505b6001600288020188555050505b505050505050565b6000617cb182615f01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203617ce357617ce2617998565b5b600182019050919050565b600082905092915050565b6000617d058383617cee565b82617d108135616140565b92506020821015617d5057617d4b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802617a57565b831692505b505092915050565b6000617d6382615f01565b9150617d6e83615f01565b9250828202617d7c81615f01565b91508282048414831517617d9357617d92617998565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000617dd482615f01565b9150617ddf83615f01565b925082617def57617dee617d9a565b5b828204905092915050565b6000617e0582615f01565b9150617e1083615f01565b9250828203905081811115617e2857617e27617998565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b617e78617e7382615f01565b617e5d565b82525050565b6000617e8a8284617e67565b60208201915081905092915050565b60006080820190508181036000830152617eb381876176c6565b90508181036020830152617ec7818661695a565b90508181036040830152617edb81856177bb565b9050617eea60608301846168a3565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000617f4f60268361628c565b9150617f5a82617ef3565b604082019050919050565b60006020820190508181036000830152617f7e81617f42565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617fe160278361628c565b9150617fec82617f85565b604082019050919050565b6000602082019050818103600083015261801081617fd4565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b600061807360268361628c565b915061807e82618017565b604082019050919050565b600060208201905081810360008301526180a281618066565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b600061810560238361628c565b9150618110826180a9565b604082019050919050565b60006020820190508181036000830152618134816180f8565b9050919050565b60006080820190506181506000830187615f0b565b61815d60208301866173d6565b61816a6040830185615f0b565b818103606083015261817c81846162c7565b905095945050505050565b600060a08201905061819c6000830188615f0b565b6181a960208301876173d6565b6181b66040830186615f0b565b81810360608301526181c881856162c7565b905081810360808301526181dc8184616df0565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b600061826a60438361628c565b9150618275826181e8565b606082019050919050565b600060208201905081810360008301526182998161825d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006182d660208361628c565b91506182e1826182a0565b602082019050919050565b60006020820190508181036000830152618305816182c9565b9050919050565b61831581615ecb565b811461832057600080fd5b50565b6000815190506183328161830c565b92915050565b60006020828403121561834e5761834d615e3c565b5b600061835c84828501618323565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b600061839b60208361628c565b91506183a682618365565b602082019050919050565b600060208201905081810360008301526183ca8161838e565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b600061842d60318361628c565b9150618438826183d1565b604082019050919050565b6000602082019050818103600083015261845c81618420565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006184bf60218361628c565b91506184ca82618463565b604082019050919050565b600060208201905081810360008301526184ee816184b2565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b600061852b60188361628c565b9150618536826184f5565b602082019050919050565b6000602082019050818103600083015261855a8161851e565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006185bd60218361628c565b91506185c882618561565b604082019050919050565b600060208201905081810360008301526185ec816185b0565b9050919050565b600067ffffffffffffffff82169050919050565b6000618612826185f3565b915061861d836185f3565b9250828201905067ffffffffffffffff81111561863d5761863c617998565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061868b82616281565b618695818561866f565b93506186a581856020860161629d565b6186ae81616004565b840191505092915050565b60006186c58383618680565b905092915050565b6000602082019050919050565b60006186e582618643565b6186ef818561864e565b9350836020820285016187018561865f565b8060005b8581101561873d578484038952815161871e85826186b9565b9450618729836186cd565b925060208a01995050600181019050618705565b50829750879550505050505092915050565b600061876a618765618760846185f3565b617313565b615f01565b9050919050565b61877a8161874f565b82525050565b600061012082019050618796600083018c615f0b565b6187a3602083018b616557565b81810360408301526187b5818a6176c6565b905081810360608301526187c9818961695a565b905081810360808301526187dd81886186da565b905081810360a08301526187f181876177bb565b905061880060c0830186618771565b61880d60e0830185618771565b81810361010083015261882081846162c7565b90509a9950505050505050505050565b60006040820190506188456000830185616557565b6188526020830184615f0b565b9392505050565b600060408201905061886e6000830185616557565b61887b6020830184616557565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006188de60278361628c565b91506188e982618882565b604082019050919050565b6000602082019050818103600083015261890d816188d1565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061894a60028361753f565b915061895582618914565b600282019050919050565b6000819050919050565b61897b61897682616140565b618960565b82525050565b600061898c8261893d565b9150618998828561896a565b6020820191506189a8828461896a565b6020820191508190509392505050565b60006080820190506189cd60008301876168a3565b6189da60208301866173d6565b6189e760408301856168a3565b6189f460608301846168a3565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000618a3360188361628c565b9150618a3e826189fd565b602082019050919050565b60006020820190508181036000830152618a6281618a26565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618a9f601f8361628c565b9150618aaa82618a69565b602082019050919050565b60006020820190508181036000830152618ace81618a92565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618b3160228361628c565b9150618b3c82618ad5565b604082019050919050565b60006020820190508181036000830152618b6081618b24565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618bc360228361628c565b9150618bce82618b67565b604082019050919050565b60006020820190508181036000830152618bf281618bb6565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b6000618c5560278361628c565b9150618c6082618bf9565b604082019050919050565b60006020820190508181036000830152618c8481618c48565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b6000618ce760358361628c565b9150618cf282618c8b565b604082019050919050565b60006020820190508181036000830152618d1681618cda565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b6000618d53601d8361628c565b9150618d5e82618d1d565b602082019050919050565b60006020820190508181036000830152618d8281618d46565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b6000618de560268361628c565b9150618df082618d89565b604082019050919050565b60006020820190508181036000830152618e1481618dd8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000618e7760268361628c565b9150618e8282618e1b565b604082019050919050565b60006020820190508181036000830152618ea681618e6a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618ee3601d8361628c565b9150618eee82618ead565b602082019050919050565b60006020820190508181036000830152618f1281618ed6565b9050919050565b6000618f2482616dd4565b618f2e818561738d565b9350618f3e81856020860161629d565b80840191505092915050565b6000618f568284618f19565b915081905092915050565b600060a082019050618f7660008301886168a3565b618f8360208301876168a3565b618f9060408301866168a3565b618f9d6060830185615f0b565b618faa6080830184616557565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220e4c4ef21389682e5feb911735f43d26b7f768b1c9cb28c392aa5dda9dbadea4264736f6c63430008110033", + "solcInputHash": "a1407720c5f6b2a7e45e84dbad9d7fc2", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enteranceFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_daoPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__EnteranceFeeNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotEnoughPayment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"FundProject__TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__UpkeepNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__WithdrawTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__withdrawFund\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NeedEnteranceFee\",\"type\":\"error\"},{\"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\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_projectOwner\",\"type\":\"address\"}],\"name\":\"enteranceFeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectFundingFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectGoesToFunding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectSuccessfullyFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"__investor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"__projectId\",\"type\":\"uint256\"}],\"name\":\"withdrawFundSuccessfully\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_ProjectFundingStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getBalanceOfProject\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"_getProjectStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isApporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_fundingGoalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_projectOwnerAddressIndex\",\"type\":\"uint256\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDaoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEnteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"getFunderBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"investor\",\"type\":\"address\"}],\"name\":\"getInvestedProjects\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"getTimeleft\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"investedProjects\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"is_funding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paySubmitFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddressIndex\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectToTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"withdrawFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"performUpkeep(bytes)\":{\"details\":\"The input to this method should not be trusted, and the caller of the method should not even be restricted to any single registry. Anyone should be able call it, and the input should be validated, there is no guarantee that the data passed in is the performData returned from checkUpkeep. This could happen due to malicious keepers, racing keepers, or simply a state change while the performUpkeep transaction is waiting for confirmation. Always validate the data passed in.\",\"params\":{\"performData\":\"is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state.\"}},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"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.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"performUpkeep(bytes)\":{\"notice\":\"method that is actually executed by the keepers, via the registry. The data returned by the checkUpkeep simulation will be passed into this method to actually be executed.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/AutomationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract AutomationBase {\\n error OnlySimulatedBackend();\\n\\n /**\\n * @notice method that allows it to be simulated via eth_call by checking that\\n * the sender is the zero address.\\n */\\n function preventExecution() internal view {\\n if (tx.origin != address(0)) {\\n revert OnlySimulatedBackend();\\n }\\n }\\n\\n /**\\n * @notice modifier that allows it to be simulated via eth_call by checking\\n * that the sender is the zero address.\\n */\\n modifier cannotExecute() {\\n preventExecution();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x5d354afa1a97dffe66094397cdcbb0c14713cf3d609d88fd8f9891010e9a351a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AutomationBase.sol\\\";\\nimport \\\"./interfaces/AutomationCompatibleInterface.sol\\\";\\n\\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\\n\",\"keccak256\":\"0x40e5ae0eff4edd0740c1b5590d09c344f84dee031e82d5294563e99603774f80\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror FundProject__NotApporovedByDao();\\nerror FundProject__UpkeepNeeded();\\nerror FundProject__TransferFailed(uint256 _projectId);\\nerror FundProject__NotEnoughPayment();\\nerror FundProject__withdrawFund();\\nerror FundProject__WithdrawTransferFailed();\\nerror FundProject__EnteranceFeeNeeded();\\n\\ncontract FundProject is Ownable, AutomationCompatibleInterface {\\n enum ProjectFundingStatus {\\n ONPROGRESS,\\n SUCCESS,\\n FAILED,\\n CANCELED\\n }\\n\\n uint256 public projectId = 1;\\n\\n uint public lastTimeStamp;\\n uint256 public daoPercentage;\\n uint256 public enteranceFee;\\n\\n mapping(uint256 => bool) public _isFunding;\\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\\n mapping(uint256 => uint256) public time;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders; // projectId => funderAddress => funderBalance\\n mapping(uint256 => uint256) public projectFunds;\\n mapping(uint256 => uint256) public projectFundingGoalAmount;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n mapping(uint256 => address) public projectOwnerAddress;\\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\\n mapping(address => bool) public _isEnteranceFeePaid;\\n mapping(address => uint256[]) public investedProjects; // investor address => investedProjects\\n mapping(uint256 => address) public projectOwnerAddressIndex;\\n\\n event projectSuccessfullyFunded(uint256 indexed _projectId);\\n event projectFundingFailed(uint256 indexed _projectId);\\n event enteranceFeePaid(address indexed _projectOwner);\\n event projectGoesToFunding(uint256 indexed _projectId);\\n event withdrawFundSuccessfully(\\n address indexed __investor,\\n uint256 indexed __projectId\\n );\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\\n lastTimeStamp = block.timestamp;\\n daoPercentage = _daoPercentage;\\n enteranceFee = _enteranceFee;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n projectFunds[_projecID] += msg.value;\\n investedProjects[msg.sender] = [_projecID]; // need testing\\n }\\n\\n function apporoveFundingByDao(\\n string memory _ipfsHash,\\n uint256 _fundingGoalAmount,\\n uint256 _time,\\n uint256 _projectOwnerAddressIndex\\n ) external onlyOwner {\\n // only dao can call it\\n if (\\n !_isEnteranceFeePaid[\\n projectOwnerAddressIndex[_projectOwnerAddressIndex]\\n ]\\n ) {\\n revert FundProject__EnteranceFeeNeeded();\\n } else {\\n projectToTime[projectId][_time] = block.timestamp;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\\n time[projectId] = _time;\\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n projectOwnerAddress[projectId] = projectOwnerAddressIndex[\\n _projectOwnerAddressIndex\\n ];\\n _isApporovedByDao[projectId] = true;\\n _isFunding[projectId] = true;\\n emit projectGoesToFunding(projectId);\\n projectId++;\\n }\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call it\\n _isApporovedByDao[_projecID] = false;\\n _isFunding[projectId] = false;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\\n }\\n\\n function checkUpkeep(\\n bytes memory /* checkData */\\n )\\n public\\n view\\n override\\n returns (bool upkeepNeeded, bytes memory performData)\\n {\\n for (uint projectIndex = 1; projectIndex <= projectId; projectIndex++) {\\n if (_isFunding[projectIndex]) {\\n bool timePassed = (block.timestamp -\\n (projectToTime[projectIndex][time[projectIndex]])) >\\n time[projectIndex];\\n upkeepNeeded = (timePassed);\\n if (upkeepNeeded) {\\n performData = abi.encodePacked(projectIndex);\\n break;\\n }\\n }\\n }\\n }\\n\\n function performUpkeep(bytes calldata performData) external override {\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\n if (!upkeepNeeded) {\\n revert FundProject__UpkeepNeeded();\\n }\\n\\n uint256 ProjectId = uint256(bytes32(performData));\\n _isFunding[ProjectId] = false;\\n _isApporovedByDao[ProjectId] = false;\\n\\n if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) {\\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS;\\n uint256 fundsToSent = (projectFunds[ProjectId] *\\n (100 - daoPercentage)) / 100;\\n projectFunds[ProjectId] = 0;\\n (bool success, ) = (projectOwnerAddress[ProjectId]).call{\\n value: fundsToSent\\n }(\\\"\\\");\\n if (!success) {\\n revert FundProject__TransferFailed(projectFunds[ProjectId]);\\n }\\n\\n emit projectSuccessfullyFunded(ProjectId);\\n } else {\\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.FAILED;\\n emit projectFundingFailed(ProjectId);\\n }\\n }\\n\\n function paySubmitFee() public payable {\\n if (msg.value < enteranceFee) {\\n revert FundProject__NotEnoughPayment();\\n } else {\\n _isEnteranceFeePaid[msg.sender] = true;\\n projectOwnerAddressIndex[projectId] = msg.sender;\\n emit enteranceFeePaid(msg.sender);\\n }\\n }\\n\\n function withdrawFund(uint256 _projectID) public {\\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\\n uint256 fundToSent = funders[_projectID][msg.sender];\\n funders[_projectID][msg.sender] = 0;\\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\\n \\\"\\\"\\n );\\n if (!success) {\\n revert FundProject__WithdrawTransferFailed();\\n }\\n emit withdrawFundSuccessfully(msg.sender, projectId);\\n } else {\\n revert FundProject__withdrawFund();\\n }\\n }\\n\\n function _isApporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n\\n function _getBalanceOfProject(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFunds[_projecID];\\n }\\n\\n function _getFundingGoalAmount(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFundingGoalAmount[_projecID];\\n }\\n\\n function is_funding(uint256 _projectID) public view returns (bool) {\\n return _isFunding[_projectID];\\n }\\n\\n function _getProjectStatus(uint256 _projectID)\\n public\\n view\\n returns (ProjectFundingStatus)\\n {\\n return _ProjectFundingStatus[_projectID];\\n }\\n\\n function getEnteranceFee() public view returns (uint256) {\\n return enteranceFee;\\n }\\n\\n function isEnteranceFeePaid(address account) public view returns (bool) {\\n return _isEnteranceFeePaid[account];\\n }\\n\\n function getFunderBalance(uint256 _projectID)\\n public\\n view\\n returns (uint256)\\n {\\n return funders[_projectID][msg.sender];\\n }\\n\\n function getInvestedProjects(address investor)\\n public\\n view\\n returns (uint256[] memory)\\n {\\n return investedProjects[investor]; // need testing\\n }\\n\\n function getDaoPercentage() public view returns (uint256) {\\n return daoPercentage;\\n }\\n\\n function getTimeleft(uint256 _projectID)\\n public\\n view\\n returns (uint256 a, uint256 b)\\n {\\n a = block.timestamp - projectToTime[_projectID][time[_projectID]];\\n b = time[_projectID];\\n }\\n\\n function getCurrentProjectId() public view returns (uint256) {\\n return projectId;\\n }\\n}\\n\",\"keccak256\":\"0xd689ce70a8d5ffef6a0c3b34f6dd10b82613f8f42048b94c178c36349aa0599f\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\nimport \\\"./FundProject.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl,\\n FundProject\\n{\\n error GovernerContract__NeedEnteranceFee();\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage,\\n uint256 _enteranceFee,\\n uint256 _daoPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n FundProject(_enteranceFee, _daoPercentage)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n if (!_isEnteranceFeePaid[msg.sender]) {\\n revert GovernerContract__NeedEnteranceFee();\\n }\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x1713670032ac0e6e45120b9ea97b9727a23883448ec04fc1f6722a7c8520c8be\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101606040526001600d553480156200001757600080fd5b5060405162005b4138038062005b418339810160408190526200003a9162000882565b818187858a898960006040518060400160405280601081526020016f11dbdd995c9b995c90dbdb9d1c9858dd60821b815250806200007d6200019260201b60201c565b815160208084019190912082518383012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c00190528051940193909320919290916080523060c0526101205250508251620001239250600091506020840190620007cd565b5062000131905083620001ad565b6200013c82620001ee565b620001478162000295565b5050506001600160a01b0316610140526200016281620002d6565b506200016e816200044e565b506200017a33620004b7565b42600e55600f55601055506200096795505050505050565b6040805180820190915260018152603160f81b602082015290565b60045460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600455565b60008111620002545760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b60648201526084015b60405180910390fd5b60055460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600555565b60065460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600655565b60648111156200035b5760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a4016200024b565b60006200036762000509565b90508015801590620003795750600954155b15620003f45760096000016040518060400160405280600063ffffffff168152602001620003b2846200053860201b620026e91760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b6200040f826009620005a760201b620027561790919060201c565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b600a54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009546000901562000531576200052c60096200070360201b620028811760201c565b905090565b5060085490565b60006001600160e01b03821115620005a35760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200024b565b5090565b8154600090819081620005ba8662000703565b9050600082118015620005fe57504386620005d7600185620008ee565b81548110620005ea57620005ea62000914565b60009182526020909120015463ffffffff16145b1562000672576200061a856200053860201b620026e91760201c565b8662000628600185620008ee565b815481106200063b576200063b62000914565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550620006fa565b85600001604051806040016040528062000697436200076660201b620028dd1760201c565b63ffffffff168152602001620006b8886200053860201b620026e91760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b95939450505050565b805460009080156200075357826200071d600183620008ee565b8154811062000730576200073062000914565b60009182526020909120015464010000000090046001600160e01b031662000756565b60005b6001600160e01b03169392505050565b600063ffffffff821115620005a35760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200024b565b828054620007db906200092a565b90600052602060002090601f016020900481019282620007ff57600085556200084a565b82601f106200081a57805160ff19168380011785556200084a565b828001600101855582156200084a579182015b828111156200084a5782518255916020019190600101906200082d565b50620005a39291505b80821115620005a3576000815560010162000853565b6001600160a01b03811681146200087f57600080fd5b50565b600080600080600080600060e0888a0312156200089e57600080fd5b8751620008ab8162000869565b6020890151909750620008be8162000869565b604089015160608a015160808b015160a08c015160c0909c01519a9d939c50919a90999198509650945092505050565b6000828210156200090f57634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200093f57607f821691505b602082108114156200096157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161014051615171620009d0600039600081816111180152818161345c015261366c015260006137f701526000613846015260006138210152600061377a015260006137a4015260006137ce01526151716000f3fe6080604052600436106104985760003560e01c80637d5e81e211610260578063c0d5532911610144578063e0c410cc116100c1578063ece40cc111610085578063ece40cc11461107a578063f23a6e611461109a578063f2fde38b146110c6578063f8ce560a146110e6578063fc0c546a14611106578063fea856a11461113a57600080fd5b8063e0c410cc14610fb5578063e59ca39e14610fe5578063e840580114611005578063ea0217cf1461103a578063eb9019d41461105a57600080fd5b8063cf68625911610108578063cf68625914610ead578063d33219b414610ee5578063dc73204b14610f03578063dd4e2ba514610f3b578063deaaa7cc14610f8157600080fd5b8063c0d5532914610e0c578063c28bc2fa14610e45578063c59057e414610e65578063c868ba9a14610e85578063ca1d209d14610e9a57600080fd5b80639a802a6d116101dd578063b58131b0116101a1578063b58131b014610d3c578063b59d18a014610d51578063bba9c21914610d7e578063bc197c8114610dab578063bd1c9e4914610dd7578063c01f9e3714610dec57600080fd5b80639a802a6d14610ca7578063a7713a7014610cc7578063a890c91014610cdc578063ab58fb8e14610cfc578063abe1aae614610d1c57600080fd5b80638da5cb5b116102245780638da5cb5b14610c0f5780638fb5548f14610c2d578063902bfa2414610c4d57806396aa167e14610c7d57806397c3d33414610c9357600080fd5b80637d5e81e214610b53578063809b268e14610b73578063868661cb14610ba357806387030f4d14610bb95780638bca74cf14610bd957600080fd5b80633fd1c809116103875780635ced7d401161030457806370084d7a116102c857806370084d7a14610a8157806370b0f66014610ab157806370c753f014610ad1578063715018a614610af1578063794d556014610b065780637b3c71d314610b3357600080fd5b80635ced7d40146109b65780635f398a14146109e357806360c4247f14610a035780636e04ff0d14610a235780636ee8e8ef14610a5157600080fd5b8063535bf50f1161034b578063535bf50f146108d5578063544ffc9c146108ea57806354fd4d501461093f57806356781388146109695780635b6b46521461098957600080fd5b80633fd1c809146107c657806343859632146107fe578063446a156f146108485780634585e33b146108855780634fac2bb7146108a557600080fd5b8063160cbed7116104155780633932abb1116103d95780633932abb1146107385780633bccf4fd1461074d5780633e4f49e61461076d5780633f3b3b271461079a5780633fafa127146107b057600080fd5b8063160cbed7146106845780632656227d146106a45780632d63f693146106b75780632fe3e261146106d757806335debf2d1461070b57600080fd5b80630cee17251161045c5780630cee17251461057a578063141a6c221461059a578063148038b0146105ba578063150b7a02146105f2578063156277be1461063657600080fd5b806301ffc9a7146104c057806302a251a3146104f5578063034201811461051857806306f3f9e61461053857806306fdde031461055857600080fd5b366104bb57306104a6611142565b6001600160a01b0316146104b957600080fd5b005b600080fd5b3480156104cc57600080fd5b506104e06104db36600461415f565b61115b565b60405190151581526020015b60405180910390f35b34801561050157600080fd5b5061050a61116c565b6040519081526020016104ec565b34801561052457600080fd5b5061050a610533366004614295565b611177565b34801561054457600080fd5b506104b961055336600461433b565b61126f565b34801561056457600080fd5b5061056d611307565b6040516104ec91906143ac565b34801561058657600080fd5b506104b961059536600461433b565b611399565b3480156105a657600080fd5b5061050a6105b53660046143bf565b611497565b3480156105c657600080fd5b5061050a6105d5366004614408565b601660209081526000928352604080842090915290825290205481565b3480156105fe57600080fd5b5061061d61060d366004614438565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016104ec565b34801561064257600080fd5b5061066c61065136600461433b565b601a602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016104ec565b34801561069057600080fd5b5061050a61069f366004614614565b6114bf565b61050a6106b2366004614614565b6116dd565b3480156106c357600080fd5b5061050a6106d236600461433b565b6117ca565b3480156106e357600080fd5b5061050a7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561071757600080fd5b5061072b6107263660046146a3565b611801565b6040516104ec91906146fb565b34801561074457600080fd5b5061050a61186d565b34801561075957600080fd5b5061050a61076836600461470e565b611878565b34801561077957600080fd5b5061078d61078836600461433b565b6118ee565b6040516104ec9190614772565b3480156107a657600080fd5b5061050a600e5481565b3480156107bc57600080fd5b5061050a600d5481565b3480156107d257600080fd5b5061050a6107e136600461433b565b600090815260166020908152604080832033845290915290205490565b34801561080a57600080fd5b506104e0610819366004614408565b60008281526007602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b34801561085457600080fd5b5061087861086336600461433b565b6000908152601b602052604090205460ff1690565b6040516104ec919061478c565b34801561089157600080fd5b506104b96108a03660046147a0565b6118f9565b3480156108b157600080fd5b506104e06108c036600461433b565b60196020526000908152604090205460ff1681565b3480156108e157600080fd5b5060105461050a565b3480156108f657600080fd5b5061092461090536600461433b565b6000908152600760205260409020805460018201546002909201549092565b604080519384526020840192909252908201526060016104ec565b34801561094b57600080fd5b506040805180820190915260018152603160f81b602082015261056d565b34801561097557600080fd5b5061050a6109843660046147e1565b611aee565b34801561099557600080fd5b5061050a6109a436600461433b565b60186020526000908152604090205481565b3480156109c257600080fd5b5061050a6109d136600461433b565b60136020526000908152604090205481565b3480156109ef57600080fd5b5061050a6109fe36600461480d565b611b17565b348015610a0f57600080fd5b5061050a610a1e36600461433b565b611b61565b348015610a2f57600080fd5b50610a43610a3e3660046143bf565b611bf7565b6040516104ec929190614890565b348015610a5d57600080fd5b506104e0610a6c3660046146a3565b601c6020526000908152604090205460ff1681565b348015610a8d57600080fd5b50610878610a9c36600461433b565b601b6020526000908152604090205460ff1681565b348015610abd57600080fd5b506104b9610acc36600461433b565b611c93565b348015610add57600080fd5b5061050a610aec3660046148ab565b611d1f565b348015610afd57600080fd5b506104b9611d50565b348015610b1257600080fd5b5061050a610b2136600461433b565b60176020526000908152604090205481565b348015610b3f57600080fd5b5061050a610b4e3660046148d7565b611d64565b348015610b5f57600080fd5b5061050a610b6e366004614930565b611db6565b348015610b7f57600080fd5b506104e0610b8e36600461433b565b60009081526011602052604090205460ff1690565b348015610baf57600080fd5b5061050a600f5481565b348015610bc557600080fd5b506104b9610bd436600461433b565b611dfb565b348015610be557600080fd5b5061066c610bf436600461433b565b601e602052600090815260409020546001600160a01b031681565b348015610c1b57600080fd5b50600c546001600160a01b031661066c565b348015610c3957600080fd5b5061056d610c4836600461433b565b611e49565b348015610c5957600080fd5b506104e0610c6836600461433b565b60116020526000908152604090205460ff1681565b348015610c8957600080fd5b5061050a60105481565b348015610c9f57600080fd5b50606461050a565b348015610cb357600080fd5b5061050a610cc23660046149d0565b611ee3565b348015610cd357600080fd5b5061050a611efa565b348015610ce857600080fd5b506104b9610cf73660046146a3565b611f16565b348015610d0857600080fd5b5061050a610d1736600461433b565b611fa2565b348015610d2857600080fd5b5061056d610d3736600461433b565b61204b565b348015610d4857600080fd5b5061050a6120e3565b348015610d5d57600080fd5b5061050a610d6c36600461433b565b60009081526018602052604090205490565b348015610d8a57600080fd5b5061050a610d9936600461433b565b60009081526017602052604090205490565b348015610db757600080fd5b5061061d610dc6366004614a28565b63bc197c8160e01b95945050505050565b348015610de357600080fd5b50600f5461050a565b348015610df857600080fd5b5061050a610e0736600461433b565b6120ee565b348015610e1857600080fd5b506104e0610e273660046146a3565b6001600160a01b03166000908152601c602052604090205460ff1690565b348015610e5157600080fd5b506104b9610e60366004614abb565b61211d565b348015610e7157600080fd5b5061050a610e80366004614614565b6121e9565b348015610e9157600080fd5b50600d5461050a565b6104b9610ea836600461433b565b612223565b348015610eb957600080fd5b5061050a610ec83660046143bf565b805160208183018101805160148252928201919093012091525481565b348015610ef157600080fd5b50600a546001600160a01b031661066c565b348015610f0f57600080fd5b5061050a610f1e366004614afe565b601260209081526000928352604080842090915290825290205481565b348015610f4757600080fd5b506040805180820190915260208082527f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e9082015261056d565b348015610f8d57600080fd5b5061050a7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610fc157600080fd5b506104e0610fd036600461433b565b60009081526019602052604090205460ff1690565b348015610ff157600080fd5b506104b9611000366004614b20565b6122d2565b34801561101157600080fd5b5061102561102036600461433b565b612467565b604080519283526020830191909152016104ec565b34801561104657600080fd5b506104b961105536600461433b565b6124ab565b34801561106657600080fd5b5061050a6110753660046148ab565b612537565b34801561108657600080fd5b506104b961109536600461433b565b612558565b3480156110a657600080fd5b5061061d6110b5366004614b73565b63f23a6e6160e01b95945050505050565b3480156110d257600080fd5b506104b96110e13660046146a3565b6125e4565b3480156110f257600080fd5b5061050a61110136600461433b565b61265a565b34801561111257600080fd5b5061066c7f000000000000000000000000000000000000000000000000000000000000000081565b6104b9612665565b6000611156600a546001600160a01b031690565b905090565b600061116682612942565b92915050565b600061115660055490565b60008061121b6112137fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c6040516111b3929190614bdb565b60405180910390208b805190602001206040516020016111f8959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120612967565b8686866129b5565b90506112618a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92506129d3915050565b9a9950505050505050505050565b611277611142565b6001600160a01b0316336001600160a01b0316146112b05760405162461bcd60e51b81526004016112a790614beb565b60405180910390fd5b306112b9611142565b6001600160a01b0316146112fb57600080366040516112d9929190614bdb565b604051809103902090505b806112ef6002612b35565b146112f9576112e4565b505b61130481612bb4565b50565b60606000805461131690614c22565b80601f016020809104026020016040519081016040528092919081815260200182805461134290614c22565b801561138f5780601f106113645761010080835404028352916020019161138f565b820191906000526020600020905b81548152906001019060200180831161137257829003601f168201915b5050505050905090565b60026000828152601b602052604090205460ff1660038111156113be576113be61475c565b141561147e57600081815260166020908152604080832033808552925280832080549084905590519092919083908381818185875af1925050503d8060008114611424576040519150601f19603f3d011682016040523d82523d6000602084013e611429565b606091505b505090508061144b576040516349b854a360e11b815260040160405180910390fd5b600d5460405133907f370c08173448a868859170331cf95622fc6b9ca192121cc9aae246cf05b3ab7c90600090a3505050565b604051633cb39c3760e01b815260040160405180910390fd5b60006014826040516114a99190614c5d565b9081526020016040518091039020549050919050565b6000806114ce868686866121e9565b905060046114db826118ee565b60078111156114ec576114ec61475c565b146115095760405162461bcd60e51b81526004016112a790614c79565b600a546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c92916004808301926020929190829003018186803b15801561154e57600080fd5b505afa158015611562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115869190614cba565b600a5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f427906115c0908a908a908a906000908b90600401614d61565b60206040518083038186803b1580156115d857600080fd5b505afa1580156115ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116109190614cba565b6000838152600b602052604080822092909255600a5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb09161165b918b918b918b91908b908990600401614daf565b600060405180830381600087803b15801561167557600080fd5b505af1158015611689573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426116bb9190614e1d565b6040805192835260208301919091520160405180910390a15095945050505050565b6000806116ec868686866121e9565b905060006116f9826118ee565b9050600481600781111561170f5761170f61475c565b148061172c5750600581600781111561172a5761172a61475c565b145b6117485760405162461bcd60e51b81526004016112a790614c79565b600082815260016020818152604092839020600201805460ff191690921790915590518381527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f910160405180910390a16117a68288888888612d01565b6117b38288888888612da3565b6117c08288888888612db0565b5095945050505050565b60008181526001602090815260408083208151928301909152546001600160401b0316908190525b6001600160401b031692915050565b6001600160a01b0381166000908152601d602090815260409182902080548351818402810184019094528084526060939283018282801561186157602002820191906000526020600020905b81548152602001906001019080831161184d575b50505050509050919050565b600061115660045490565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff8516606082015260009081906118c690611213906080016111f8565b90506118e387828860405180602001604052806000815250612de9565b979650505050505050565b600061116682612e0c565b600061191360405180602001604052806000815250611bf7565b509050806119345760405163110f380560e21b815260040160405180910390fd5b60006119408385614e35565b6000818152601160209081526040808320805460ff19908116909155601983528184208054909116905560188252808320546017909252909120549192501015611aa7576000818152601b60205260408120805460ff19166001179055600f546064906119ad9082614e53565b6000848152601760205260409020546119c69190614e6a565b6119d09190614e89565b6000838152601760209081526040808320839055601a90915280822054905192935090916001600160a01b039091169083908381818185875af1925050503d8060008114611a3a576040519150601f19603f3d011682016040523d82523d6000602084013e611a3f565b606091505b5050905080611a75576000838152601760205260409081902054905163265b39fb60e01b815260048101919091526024016112a7565b60405183907f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17290600090a25050611ae8565b6000818152601b6020526040808220805460ff191660021790555182917f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0391a25b50505050565b600080339050611b0f84828560405180602001604052806000815250612de9565b949350505050565b6000803390506118e387828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92506129d3915050565b60095460009080611b76575050600854919050565b60006009611b85600184614e53565b81548110611b9557611b95614eab565b60009182526020918290206040805180820190915291015463ffffffff81168083526401000000009091046001600160e01b03169282019290925291508410611bec57602001516001600160e01b03169392505050565b611b0f600985612f74565b6000606060015b600d548111611c8d5760008181526011602052604090205460ff1615611c7b5760008181526013602090815260408083205460128352818420818552909252822054611c4a9042614e53565b1190508093508315611c7957604080516020810184905201604051602081830303815290604052925050611c8d565b505b80611c8581614ec1565b915050611bfe565b50915091565b611c9b611142565b6001600160a01b0316336001600160a01b031614611ccb5760405162461bcd60e51b81526004016112a790614beb565b30611cd4611142565b6001600160a01b031614611d165760008036604051611cf4929190614bdb565b604051809103902090505b80611d0a6002612b35565b14611d1457611cff565b505b61130481613083565b601d6020528160005260406000208181548110611d3b57600080fd5b90600052602060002001600091509150505481565b611d586130c4565b611d62600061311e565b565b600080339050611dac86828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612de992505050565b9695505050505050565b336000908152601c602052604081205460ff16611de657604051634018425360e01b815260040160405180910390fd5b611df285858585613170565b95945050505050565b611e036130c4565b6000908152601960209081526040808320805460ff19908116909155600d8054855260118452828520805483169055548452601b90925290912080549091166003179055565b60156020526000908152604090208054611e6290614c22565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8e90614c22565b8015611edb5780601f10611eb057610100808354040283529160200191611edb565b820191906000526020600020905b815481529060010190602001808311611ebe57829003601f168201915b505050505081565b6000611ef0848484613433565b90505b9392505050565b60095460009015611f0f576111566009612881565b5060085490565b611f1e611142565b6001600160a01b0316336001600160a01b031614611f4e5760405162461bcd60e51b81526004016112a790614beb565b30611f57611142565b6001600160a01b031614611f995760008036604051611f77929190614bdb565b604051809103902090505b80611f8d6002612b35565b14611f9757611f82565b505b611304816134d8565b600a546000828152600b602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c44359060240160206040518083038186803b158015611ffa57600080fd5b505afa15801561200e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120329190614cba565b9050806001146120425780611ef3565b60009392505050565b600081815260156020526040902080546060919061206890614c22565b80601f016020809104026020016040519081016040528092919081815260200182805461209490614c22565b80156118615780601f106120b657610100808354040283529160200191611861565b820191906000526020600020905b8154815290600101906020018083116120c45750939695505050505050565b600061115660065490565b60008181526001602081815260408084208151928301909152909101546001600160401b0316908190526117f2565b612125611142565b6001600160a01b0316336001600160a01b0316146121555760405162461bcd60e51b81526004016112a790614beb565b3061215e611142565b6001600160a01b0316146121a0576000803660405161217e929190614bdb565b604051809103902090505b806121946002612b35565b1461219e57612189565b505b6121e28483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250889250613541915050565b5050505050565b6000848484846040516020016122029493929190614edc565b60408051601f19818403018152919052805160209091012095945050505050565b600081815260196020526040902054819060ff166122545760405163528d75ab60e01b815260040160405180910390fd5b60008281526016602090815260408083203384529091528120805434929061227d908490614e1d565b9091555050600082815260176020526040812080543492906122a0908490614e1d565b90915550506040805160208082018352848252336000908152601d909152919091206122cd916001614090565b505050565b6122da6130c4565b6000818152601e60209081526040808320546001600160a01b03168352601c90915290205460ff1661231f576040516305ed74eb60e01b815260040160405180910390fd5b600d80546000908152601260209081526040808320868452825280832042905583548352601b8252808320805460ff1916905583548352601382528083208690558354835260189091529081902085905590549051601490612382908790614c5d565b908152604080516020928190038301902092909255600d546000908152601582529190912085516123b5928701906140d7565b506000818152601e6020908152604080832054600d80548552601a845282852080546001600160a01b0319166001600160a01b03909316929092179091558054845260198352818420805460ff1990811660019081179092558254865260119094528285208054909416179092559054905190917f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d91a2600d805490600061245c83614ec1565b919050555050505050565b60008181526012602090815260408083206013835281842054845290915281205481906124949042614e53565b600093845260136020526040909320549293915050565b6124b3611142565b6001600160a01b0316336001600160a01b0316146124e35760405162461bcd60e51b81526004016112a790614beb565b306124ec611142565b6001600160a01b03161461252e576000803660405161250c929190614bdb565b604051809103902090505b806125226002612b35565b1461252c57612517565b505b61130481613567565b6000611ef3838361255360408051602081019091526000815290565b613433565b612560611142565b6001600160a01b0316336001600160a01b0316146125905760405162461bcd60e51b81526004016112a790614beb565b30612599611142565b6001600160a01b0316146125db57600080366040516125b9929190614bdb565b604051809103902090505b806125cf6002612b35565b146125d9576125c4565b505b61130481613608565b6125ec6130c4565b6001600160a01b0381166126515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016112a7565b6113048161311e565b600061116682613649565b601054341015612688576040516318f722c360e21b815260040160405180910390fd5b336000818152601c60209081526040808320805460ff19166001179055600d548352601e90915280822080546001600160a01b03191684179055517f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f9190a2565b60006001600160e01b038211156127525760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016112a7565b5090565b815460009081908161276786612881565b90506000821180156127a557504386612781600185614e53565b8154811061279157612791614eab565b60009182526020909120015463ffffffff16145b15612805576127b3856126e9565b866127bf600185614e53565b815481106127cf576127cf614eab565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550612873565b85600001604051806040016040528061281d436128dd565b63ffffffff168152602001612831886126e9565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b9250839150505b9250929050565b805460009080156128ca5782612898600183614e53565b815481106128a8576128a8614eab565b60009182526020909120015464010000000090046001600160e01b03166128cd565b60005b6001600160e01b03169392505050565b600063ffffffff8211156127525760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016112a7565b60006001600160e01b03198216636e665ced60e01b1480611166575061116682613702565b600061116661297461376d565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006129c687878787613894565b915091506117c081613981565b60008581526001602081905260408220906129ed886118ee565b60078111156129fe576129fe61475c565b14612a575760405162461bcd60e51b815260206004820152602360248201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460448201526269766560e81b60648201526084016112a7565b604080516020810190915281546001600160401b031690819052600090612a8090889086613433565b9050612a8f8888888488613b3c565b8351612ae157866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051612ad49493929190614f27565b60405180910390a26118e3565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612b22959493929190614f4f565b60405180910390a2979650505050505050565b6000612b508254600f81810b600160801b909204900b131590565b15612b6e57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b6064811115612c375760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a4016112a7565b6000612c41611efa565b90508015801590612c525750600954155b15612cb757604080518082019091526000815260099060208101612c75846126e9565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b612cc2600983612756565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b30612d0a611142565b6001600160a01b0316146121e25760005b8451811015612d9b57306001600160a01b0316858281518110612d4057612d40614eab565b60200260200101516001600160a01b03161415612d8b57612d8b838281518110612d6c57612d6c614eab565b6020026020010151805190602001206002613cbb90919063ffffffff16565b612d9481614ec1565b9050612d1b565b505050505050565b6121e28585858585613cf7565b30612db9611142565b6001600160a01b0316146121e257600254600f81810b600160801b909204900b13156121e25760006002556121e2565b6000611df285858585612e0760408051602081019091526000815290565b6129d3565b600080612e1883613d6b565b90506004816007811115612e2e57612e2e61475c565b14612e395792915050565b6000838152600b602052604090205480612e54575092915050565b600a54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f5299060240160206040518083038186803b158015612e9857600080fd5b505afa158015612eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed09190614f95565b15612edf575060079392505050565b600a54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e9060240160206040518083038186803b158015612f2357600080fd5b505afa158015612f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5b9190614f95565b15612f6a575060059392505050565b5060029392505050565b6000438210612fc55760405162461bcd60e51b815260206004820181905260248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e656460448201526064016112a7565b825460005b8181101561302a576000612fde8284613e77565b905084866000018281548110612ff657612ff6614eab565b60009182526020909120015463ffffffff16111561301657809250613024565b613021816001614e1d565b91505b50612fca565b811561306e578461303c600184614e53565b8154811061304c5761304c614eab565b60009182526020909120015464010000000090046001600160e01b0316613071565b60005b6001600160e01b031695945050505050565b60045460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600455565b600c546001600160a01b03163314611d625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016112a7565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061317a6120e3565b61318933611075600143614e53565b10156131f15760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f7720706044820152701c9bdc1bdcd85b081d1a1c995cda1bdb19607a1b60648201526084016112a7565b600061320686868686805190602001206121e9565b905084518651146132295760405162461bcd60e51b81526004016112a790614fb7565b835186511461324a5760405162461bcd60e51b81526004016112a790614fb7565b600086511161329b5760405162461bcd60e51b815260206004820152601860248201527f476f7665726e6f723a20656d7074792070726f706f73616c000000000000000060448201526064016112a7565b600081815260016020908152604091829020825191820190925281546001600160401b0316908190521561331b5760405162461bcd60e51b815260206004820152602160248201527f476f7665726e6f723a2070726f706f73616c20616c72656164792065786973746044820152607360f81b60648201526084016112a7565b600061332d61332861186d565b613e92565b61333643613e92565b6133409190614ff8565b9050600061334f61332861116c565b6133599083614ff8565b835467ffffffffffffffff19166001600160401b038416178455905060018301805467ffffffffffffffff19166001600160401b0383161790557f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084338b8b8d516001600160401b038111156133d1576133d16141e0565b60405190808252806020026020018201604052801561340457816020015b60608152602001906001900390816133ef5790505b508c88888e60405161341e99989796959493929190615023565b60405180910390a15091979650505050505050565b604051630748d63560e31b81526001600160a01b038481166004830152602482018490526000917f000000000000000000000000000000000000000000000000000000000000000090911690633a46b1a89060440160206040518083038186803b1580156134a057600080fd5b505afa1580156134b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef09190614cba565b600a54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6060611ef084848460405180606001604052806029815260200161511360299139613efa565b600081116135c75760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b60648201526084016112a7565b60055460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600555565b60065460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600655565b6000606461365683611b61565b604051632394e7a360e21b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638e539e8c9060240160206040518083038186803b1580156136b657600080fd5b505afa1580156136ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ee9190614cba565b6136f89190614e6a565b6111669190614e89565b60006001600160e01b0319821663bf26d89760e01b148061373357506001600160e01b031982166379dd796f60e01b145b8061374e57506001600160e01b03198216630271189760e51b145b8061116657506301ffc9a760e01b6001600160e01b0319831614611166565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156137c657507f000000000000000000000000000000000000000000000000000000000000000046145b156137f057507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156138cb5750600090506003613978565b8460ff16601b141580156138e357508460ff16601c14155b156138f45750600090506004613978565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613948573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661397157600060019250925050613978565b9150600090505b94509492505050565b60008160048111156139955761399561475c565b141561399e5750565b60018160048111156139b2576139b261475c565b1415613a005760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016112a7565b6002816004811115613a1457613a1461475c565b1415613a625760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016112a7565b6003816004811115613a7657613a7661475c565b1415613acf5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016112a7565b6004816004811115613ae357613ae361475c565b14156113045760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016112a7565b60008581526007602090815260408083206001600160a01b0388168452600381019092529091205460ff1615613bc45760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c726561604482015266191e4818d85cdd60ca1b60648201526084016112a7565b6001600160a01b03851660009081526003820160205260408120805460ff1916600117905560ff168460ff161415613c155782816000016000828254613c0a9190614e1d565b90915550612d9b9050565b60ff841660011415613c355782816001016000828254613c0a9190614e1d565b60ff841660021415613c555782816002016000828254613c0a9190614e1d565b60405162461bcd60e51b815260206004820152603560248201527f476f7665726e6f72566f74696e6753696d706c653a20696e76616c69642076616044820152746c756520666f7220656e756d20566f74655479706560581b60648201526084016112a7565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b600a5460405163e38335e560e01b81526001600160a01b039091169063e38335e5903490613d32908890889088906000908990600401614d61565b6000604051808303818588803b158015613d4b57600080fd5b505af1158015613d5f573d6000803e3d6000fd5b50505050505050505050565b6000818152600160205260408120600281015460ff1615613d8f5750600792915050565b6002810154610100900460ff1615613daa5750600292915050565b6000613db5846117ca565b905080613e045760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c20696400000060448201526064016112a7565b438110613e15575060009392505050565b6000613e20856120ee565b9050438110613e3457506001949350505050565b613e3d85614020565b8015613e5c575060008581526007602052604090208054600190910154115b15613e6c57506004949350505050565b506003949350505050565b6000613e866002848418614e89565b611ef390848416614e1d565b60006001600160401b038211156127525760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016112a7565b606082471015613f5b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112a7565b6001600160a01b0385163b613fb25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112a7565b600080866001600160a01b03168587604051613fce9190614c5d565b60006040518083038185875af1925050503d806000811461400b576040519150601f19603f3d011682016040523d82523d6000602084013e614010565b606091505b50915091506118e3828286614057565b6000818152600760205260408120600281015460018201546140429190614e1d565b61404e611101856117ca565b11159392505050565b60608315614066575081611ef3565b8251156140765782518084602001fd5b8160405162461bcd60e51b81526004016112a791906143ac565b8280548282559060005260206000209081019282156140cb579160200282015b828111156140cb5782518255916020019190600101906140b0565b5061275292915061414a565b8280546140e390614c22565b90600052602060002090601f01602090048101928261410557600085556140cb565b82601f1061411e57805160ff19168380011785556140cb565b828001600101855582156140cb57918201828111156140cb5782518255916020019190600101906140b0565b5b80821115612752576000815560010161414b565b60006020828403121561417157600080fd5b81356001600160e01b031981168114611ef357600080fd5b803560ff8116811461419a57600080fd5b919050565b60008083601f8401126141b157600080fd5b5081356001600160401b038111156141c857600080fd5b60208301915083602082850101111561287a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561421e5761421e6141e0565b604052919050565b600082601f83011261423757600080fd5b81356001600160401b03811115614250576142506141e0565b614263601f8201601f19166020016141f6565b81815284602083860101111561427857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b0312156142b157600080fd5b883597506142c160208a01614189565b965060408901356001600160401b03808211156142dd57600080fd5b6142e98c838d0161419f565b909850965060608b013591508082111561430257600080fd5b5061430f8b828c01614226565b94505061431e60808a01614189565b925060a0890135915060c089013590509295985092959890939650565b60006020828403121561434d57600080fd5b5035919050565b60005b8381101561436f578181015183820152602001614357565b83811115611ae85750506000910152565b60008151808452614398816020860160208601614354565b601f01601f19169290920160200192915050565b602081526000611ef36020830184614380565b6000602082840312156143d157600080fd5b81356001600160401b038111156143e757600080fd5b611b0f84828501614226565b6001600160a01b038116811461130457600080fd5b6000806040838503121561441b57600080fd5b82359150602083013561442d816143f3565b809150509250929050565b6000806000806080858703121561444e57600080fd5b8435614459816143f3565b93506020850135614469816143f3565b92506040850135915060608501356001600160401b0381111561448b57600080fd5b61449787828801614226565b91505092959194509250565b60006001600160401b038211156144bc576144bc6141e0565b5060051b60200190565b600082601f8301126144d757600080fd5b813560206144ec6144e7836144a3565b6141f6565b82815260059290921b8401810191818101908684111561450b57600080fd5b8286015b8481101561452f578035614522816143f3565b835291830191830161450f565b509695505050505050565b600082601f83011261454b57600080fd5b8135602061455b6144e7836144a3565b82815260059290921b8401810191818101908684111561457a57600080fd5b8286015b8481101561452f578035835291830191830161457e565b600082601f8301126145a657600080fd5b813560206145b66144e7836144a3565b82815260059290921b840181019181810190868411156145d557600080fd5b8286015b8481101561452f5780356001600160401b038111156145f85760008081fd5b6146068986838b0101614226565b8452509183019183016145d9565b6000806000806080858703121561462a57600080fd5b84356001600160401b038082111561464157600080fd5b61464d888389016144c6565b9550602087013591508082111561466357600080fd5b61466f8883890161453a565b9450604087013591508082111561468557600080fd5b5061469287828801614595565b949793965093946060013593505050565b6000602082840312156146b557600080fd5b8135611ef3816143f3565b600081518084526020808501945080840160005b838110156146f0578151875295820195908201906001016146d4565b509495945050505050565b602081526000611ef360208301846146c0565b600080600080600060a0868803121561472657600080fd5b8535945061473660208701614189565b935061474460408701614189565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106147865761478661475c565b91905290565b60208101600483106147865761478661475c565b600080602083850312156147b357600080fd5b82356001600160401b038111156147c957600080fd5b6147d58582860161419f565b90969095509350505050565b600080604083850312156147f457600080fd5b8235915061480460208401614189565b90509250929050565b60008060008060006080868803121561482557600080fd5b8535945061483560208701614189565b935060408601356001600160401b038082111561485157600080fd5b61485d89838a0161419f565b9095509350606088013591508082111561487657600080fd5b5061488388828901614226565b9150509295509295909350565b8215158152604060208201526000611ef06040830184614380565b600080604083850312156148be57600080fd5b82356148c9816143f3565b946020939093013593505050565b600080600080606085870312156148ed57600080fd5b843593506148fd60208601614189565b925060408501356001600160401b0381111561491857600080fd5b6149248782880161419f565b95989497509550505050565b6000806000806080858703121561494657600080fd5b84356001600160401b038082111561495d57600080fd5b614969888389016144c6565b9550602087013591508082111561497f57600080fd5b61498b8883890161453a565b945060408701359150808211156149a157600080fd5b6149ad88838901614595565b935060608701359150808211156149c357600080fd5b5061449787828801614226565b6000806000606084860312156149e557600080fd5b83356149f0816143f3565b92506020840135915060408401356001600160401b03811115614a1257600080fd5b614a1e86828701614226565b9150509250925092565b600080600080600060a08688031215614a4057600080fd5b8535614a4b816143f3565b94506020860135614a5b816143f3565b935060408601356001600160401b0380821115614a7757600080fd5b614a8389838a0161453a565b94506060880135915080821115614a9957600080fd5b614aa589838a0161453a565b9350608088013591508082111561487657600080fd5b60008060008060608587031215614ad157600080fd5b8435614adc816143f3565b93506020850135925060408501356001600160401b0381111561491857600080fd5b60008060408385031215614b1157600080fd5b50508035926020909101359150565b60008060008060808587031215614b3657600080fd5b84356001600160401b03811115614b4c57600080fd5b614b5887828801614226565b97602087013597506040870135966060013595509350505050565b600080600080600060a08688031215614b8b57600080fd5b8535614b96816143f3565b94506020860135614ba6816143f3565b9350604086013592506060860135915060808601356001600160401b03811115614bcf57600080fd5b61488388828901614226565b8183823760009101908152919050565b60208082526018908201527f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000604082015260600190565b600181811c90821680614c3657607f821691505b60208210811415614c5757634e487b7160e01b600052602260045260246000fd5b50919050565b60008251614c6f818460208701614354565b9190910192915050565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b600060208284031215614ccc57600080fd5b5051919050565b600081518084526020808501945080840160005b838110156146f05781516001600160a01b031687529582019590820190600101614ce7565b600081518084526020808501808196508360051b8101915082860160005b85811015614d54578284038952614d42848351614380565b98850198935090840190600101614d2a565b5091979650505050505050565b60a081526000614d7460a0830188614cd3565b8281036020840152614d8681886146c0565b90508281036040840152614d9a8187614d0c565b60608401959095525050608001529392505050565b60c081526000614dc260c0830189614cd3565b8281036020840152614dd481896146c0565b90508281036040840152614de88188614d0c565b60608401969096525050608081019290925260a0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115614e3057614e30614e07565b500190565b8035602083101561116657600019602084900360031b1b1692915050565b600082821015614e6557614e65614e07565b500390565b6000816000190483118215151615614e8457614e84614e07565b500290565b600082614ea657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614ed557614ed5614e07565b5060010190565b608081526000614eef6080830187614cd3565b8281036020840152614f0181876146c0565b90508281036040840152614f158186614d0c565b91505082606083015295945050505050565b84815260ff84166020820152826040820152608060608201526000611dac6080830184614380565b85815260ff8516602082015283604082015260a060608201526000614f7760a0830185614380565b8281036080840152614f898185614380565b98975050505050505050565b600060208284031215614fa757600080fd5b81518015158114611ef357600080fd5b60208082526021908201527f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e67746040820152600d60fb1b606082015260800190565b60006001600160401b0380831681851680830382111561501a5761501a614e07565b01949350505050565b60006101208b8352602060018060a01b038c168185015281604085015261504c8285018c614cd3565b91508382036060850152615060828b6146c0565b915083820360808501528189518084528284019150828160051b850101838c0160005b838110156150b157601f1987840301855261509f838351614380565b94860194925090850190600101615083565b505086810360a08801526150c5818c614d0c565b9450505050506150e060c08401876001600160401b03169052565b6001600160401b03851660e08401528281036101008401526151028185614380565b9c9b50505050505050505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212201c4f8843a7eff2d14bce1f29a6c5022f5d3cbcdaec71b1b24af686c441e1d02864736f6c63430008090033", + "deployedBytecode": "0x6080604052600436106104985760003560e01c80637d5e81e211610260578063c0d5532911610144578063e0c410cc116100c1578063ece40cc111610085578063ece40cc11461107a578063f23a6e611461109a578063f2fde38b146110c6578063f8ce560a146110e6578063fc0c546a14611106578063fea856a11461113a57600080fd5b8063e0c410cc14610fb5578063e59ca39e14610fe5578063e840580114611005578063ea0217cf1461103a578063eb9019d41461105a57600080fd5b8063cf68625911610108578063cf68625914610ead578063d33219b414610ee5578063dc73204b14610f03578063dd4e2ba514610f3b578063deaaa7cc14610f8157600080fd5b8063c0d5532914610e0c578063c28bc2fa14610e45578063c59057e414610e65578063c868ba9a14610e85578063ca1d209d14610e9a57600080fd5b80639a802a6d116101dd578063b58131b0116101a1578063b58131b014610d3c578063b59d18a014610d51578063bba9c21914610d7e578063bc197c8114610dab578063bd1c9e4914610dd7578063c01f9e3714610dec57600080fd5b80639a802a6d14610ca7578063a7713a7014610cc7578063a890c91014610cdc578063ab58fb8e14610cfc578063abe1aae614610d1c57600080fd5b80638da5cb5b116102245780638da5cb5b14610c0f5780638fb5548f14610c2d578063902bfa2414610c4d57806396aa167e14610c7d57806397c3d33414610c9357600080fd5b80637d5e81e214610b53578063809b268e14610b73578063868661cb14610ba357806387030f4d14610bb95780638bca74cf14610bd957600080fd5b80633fd1c809116103875780635ced7d401161030457806370084d7a116102c857806370084d7a14610a8157806370b0f66014610ab157806370c753f014610ad1578063715018a614610af1578063794d556014610b065780637b3c71d314610b3357600080fd5b80635ced7d40146109b65780635f398a14146109e357806360c4247f14610a035780636e04ff0d14610a235780636ee8e8ef14610a5157600080fd5b8063535bf50f1161034b578063535bf50f146108d5578063544ffc9c146108ea57806354fd4d501461093f57806356781388146109695780635b6b46521461098957600080fd5b80633fd1c809146107c657806343859632146107fe578063446a156f146108485780634585e33b146108855780634fac2bb7146108a557600080fd5b8063160cbed7116104155780633932abb1116103d95780633932abb1146107385780633bccf4fd1461074d5780633e4f49e61461076d5780633f3b3b271461079a5780633fafa127146107b057600080fd5b8063160cbed7146106845780632656227d146106a45780632d63f693146106b75780632fe3e261146106d757806335debf2d1461070b57600080fd5b80630cee17251161045c5780630cee17251461057a578063141a6c221461059a578063148038b0146105ba578063150b7a02146105f2578063156277be1461063657600080fd5b806301ffc9a7146104c057806302a251a3146104f5578063034201811461051857806306f3f9e61461053857806306fdde031461055857600080fd5b366104bb57306104a6611142565b6001600160a01b0316146104b957600080fd5b005b600080fd5b3480156104cc57600080fd5b506104e06104db36600461415f565b61115b565b60405190151581526020015b60405180910390f35b34801561050157600080fd5b5061050a61116c565b6040519081526020016104ec565b34801561052457600080fd5b5061050a610533366004614295565b611177565b34801561054457600080fd5b506104b961055336600461433b565b61126f565b34801561056457600080fd5b5061056d611307565b6040516104ec91906143ac565b34801561058657600080fd5b506104b961059536600461433b565b611399565b3480156105a657600080fd5b5061050a6105b53660046143bf565b611497565b3480156105c657600080fd5b5061050a6105d5366004614408565b601660209081526000928352604080842090915290825290205481565b3480156105fe57600080fd5b5061061d61060d366004614438565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016104ec565b34801561064257600080fd5b5061066c61065136600461433b565b601a602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016104ec565b34801561069057600080fd5b5061050a61069f366004614614565b6114bf565b61050a6106b2366004614614565b6116dd565b3480156106c357600080fd5b5061050a6106d236600461433b565b6117ca565b3480156106e357600080fd5b5061050a7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561071757600080fd5b5061072b6107263660046146a3565b611801565b6040516104ec91906146fb565b34801561074457600080fd5b5061050a61186d565b34801561075957600080fd5b5061050a61076836600461470e565b611878565b34801561077957600080fd5b5061078d61078836600461433b565b6118ee565b6040516104ec9190614772565b3480156107a657600080fd5b5061050a600e5481565b3480156107bc57600080fd5b5061050a600d5481565b3480156107d257600080fd5b5061050a6107e136600461433b565b600090815260166020908152604080832033845290915290205490565b34801561080a57600080fd5b506104e0610819366004614408565b60008281526007602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b34801561085457600080fd5b5061087861086336600461433b565b6000908152601b602052604090205460ff1690565b6040516104ec919061478c565b34801561089157600080fd5b506104b96108a03660046147a0565b6118f9565b3480156108b157600080fd5b506104e06108c036600461433b565b60196020526000908152604090205460ff1681565b3480156108e157600080fd5b5060105461050a565b3480156108f657600080fd5b5061092461090536600461433b565b6000908152600760205260409020805460018201546002909201549092565b604080519384526020840192909252908201526060016104ec565b34801561094b57600080fd5b506040805180820190915260018152603160f81b602082015261056d565b34801561097557600080fd5b5061050a6109843660046147e1565b611aee565b34801561099557600080fd5b5061050a6109a436600461433b565b60186020526000908152604090205481565b3480156109c257600080fd5b5061050a6109d136600461433b565b60136020526000908152604090205481565b3480156109ef57600080fd5b5061050a6109fe36600461480d565b611b17565b348015610a0f57600080fd5b5061050a610a1e36600461433b565b611b61565b348015610a2f57600080fd5b50610a43610a3e3660046143bf565b611bf7565b6040516104ec929190614890565b348015610a5d57600080fd5b506104e0610a6c3660046146a3565b601c6020526000908152604090205460ff1681565b348015610a8d57600080fd5b50610878610a9c36600461433b565b601b6020526000908152604090205460ff1681565b348015610abd57600080fd5b506104b9610acc36600461433b565b611c93565b348015610add57600080fd5b5061050a610aec3660046148ab565b611d1f565b348015610afd57600080fd5b506104b9611d50565b348015610b1257600080fd5b5061050a610b2136600461433b565b60176020526000908152604090205481565b348015610b3f57600080fd5b5061050a610b4e3660046148d7565b611d64565b348015610b5f57600080fd5b5061050a610b6e366004614930565b611db6565b348015610b7f57600080fd5b506104e0610b8e36600461433b565b60009081526011602052604090205460ff1690565b348015610baf57600080fd5b5061050a600f5481565b348015610bc557600080fd5b506104b9610bd436600461433b565b611dfb565b348015610be557600080fd5b5061066c610bf436600461433b565b601e602052600090815260409020546001600160a01b031681565b348015610c1b57600080fd5b50600c546001600160a01b031661066c565b348015610c3957600080fd5b5061056d610c4836600461433b565b611e49565b348015610c5957600080fd5b506104e0610c6836600461433b565b60116020526000908152604090205460ff1681565b348015610c8957600080fd5b5061050a60105481565b348015610c9f57600080fd5b50606461050a565b348015610cb357600080fd5b5061050a610cc23660046149d0565b611ee3565b348015610cd357600080fd5b5061050a611efa565b348015610ce857600080fd5b506104b9610cf73660046146a3565b611f16565b348015610d0857600080fd5b5061050a610d1736600461433b565b611fa2565b348015610d2857600080fd5b5061056d610d3736600461433b565b61204b565b348015610d4857600080fd5b5061050a6120e3565b348015610d5d57600080fd5b5061050a610d6c36600461433b565b60009081526018602052604090205490565b348015610d8a57600080fd5b5061050a610d9936600461433b565b60009081526017602052604090205490565b348015610db757600080fd5b5061061d610dc6366004614a28565b63bc197c8160e01b95945050505050565b348015610de357600080fd5b50600f5461050a565b348015610df857600080fd5b5061050a610e0736600461433b565b6120ee565b348015610e1857600080fd5b506104e0610e273660046146a3565b6001600160a01b03166000908152601c602052604090205460ff1690565b348015610e5157600080fd5b506104b9610e60366004614abb565b61211d565b348015610e7157600080fd5b5061050a610e80366004614614565b6121e9565b348015610e9157600080fd5b50600d5461050a565b6104b9610ea836600461433b565b612223565b348015610eb957600080fd5b5061050a610ec83660046143bf565b805160208183018101805160148252928201919093012091525481565b348015610ef157600080fd5b50600a546001600160a01b031661066c565b348015610f0f57600080fd5b5061050a610f1e366004614afe565b601260209081526000928352604080842090915290825290205481565b348015610f4757600080fd5b506040805180820190915260208082527f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e9082015261056d565b348015610f8d57600080fd5b5061050a7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610fc157600080fd5b506104e0610fd036600461433b565b60009081526019602052604090205460ff1690565b348015610ff157600080fd5b506104b9611000366004614b20565b6122d2565b34801561101157600080fd5b5061102561102036600461433b565b612467565b604080519283526020830191909152016104ec565b34801561104657600080fd5b506104b961105536600461433b565b6124ab565b34801561106657600080fd5b5061050a6110753660046148ab565b612537565b34801561108657600080fd5b506104b961109536600461433b565b612558565b3480156110a657600080fd5b5061061d6110b5366004614b73565b63f23a6e6160e01b95945050505050565b3480156110d257600080fd5b506104b96110e13660046146a3565b6125e4565b3480156110f257600080fd5b5061050a61110136600461433b565b61265a565b34801561111257600080fd5b5061066c7f000000000000000000000000000000000000000000000000000000000000000081565b6104b9612665565b6000611156600a546001600160a01b031690565b905090565b600061116682612942565b92915050565b600061115660055490565b60008061121b6112137fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c6040516111b3929190614bdb565b60405180910390208b805190602001206040516020016111f8959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120612967565b8686866129b5565b90506112618a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92506129d3915050565b9a9950505050505050505050565b611277611142565b6001600160a01b0316336001600160a01b0316146112b05760405162461bcd60e51b81526004016112a790614beb565b60405180910390fd5b306112b9611142565b6001600160a01b0316146112fb57600080366040516112d9929190614bdb565b604051809103902090505b806112ef6002612b35565b146112f9576112e4565b505b61130481612bb4565b50565b60606000805461131690614c22565b80601f016020809104026020016040519081016040528092919081815260200182805461134290614c22565b801561138f5780601f106113645761010080835404028352916020019161138f565b820191906000526020600020905b81548152906001019060200180831161137257829003601f168201915b5050505050905090565b60026000828152601b602052604090205460ff1660038111156113be576113be61475c565b141561147e57600081815260166020908152604080832033808552925280832080549084905590519092919083908381818185875af1925050503d8060008114611424576040519150601f19603f3d011682016040523d82523d6000602084013e611429565b606091505b505090508061144b576040516349b854a360e11b815260040160405180910390fd5b600d5460405133907f370c08173448a868859170331cf95622fc6b9ca192121cc9aae246cf05b3ab7c90600090a3505050565b604051633cb39c3760e01b815260040160405180910390fd5b60006014826040516114a99190614c5d565b9081526020016040518091039020549050919050565b6000806114ce868686866121e9565b905060046114db826118ee565b60078111156114ec576114ec61475c565b146115095760405162461bcd60e51b81526004016112a790614c79565b600a546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c92916004808301926020929190829003018186803b15801561154e57600080fd5b505afa158015611562573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115869190614cba565b600a5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f427906115c0908a908a908a906000908b90600401614d61565b60206040518083038186803b1580156115d857600080fd5b505afa1580156115ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116109190614cba565b6000838152600b602052604080822092909255600a5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb09161165b918b918b918b91908b908990600401614daf565b600060405180830381600087803b15801561167557600080fd5b505af1158015611689573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928282426116bb9190614e1d565b6040805192835260208301919091520160405180910390a15095945050505050565b6000806116ec868686866121e9565b905060006116f9826118ee565b9050600481600781111561170f5761170f61475c565b148061172c5750600581600781111561172a5761172a61475c565b145b6117485760405162461bcd60e51b81526004016112a790614c79565b600082815260016020818152604092839020600201805460ff191690921790915590518381527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f910160405180910390a16117a68288888888612d01565b6117b38288888888612da3565b6117c08288888888612db0565b5095945050505050565b60008181526001602090815260408083208151928301909152546001600160401b0316908190525b6001600160401b031692915050565b6001600160a01b0381166000908152601d602090815260409182902080548351818402810184019094528084526060939283018282801561186157602002820191906000526020600020905b81548152602001906001019080831161184d575b50505050509050919050565b600061115660045490565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff8516606082015260009081906118c690611213906080016111f8565b90506118e387828860405180602001604052806000815250612de9565b979650505050505050565b600061116682612e0c565b600061191360405180602001604052806000815250611bf7565b509050806119345760405163110f380560e21b815260040160405180910390fd5b60006119408385614e35565b6000818152601160209081526040808320805460ff19908116909155601983528184208054909116905560188252808320546017909252909120549192501015611aa7576000818152601b60205260408120805460ff19166001179055600f546064906119ad9082614e53565b6000848152601760205260409020546119c69190614e6a565b6119d09190614e89565b6000838152601760209081526040808320839055601a90915280822054905192935090916001600160a01b039091169083908381818185875af1925050503d8060008114611a3a576040519150601f19603f3d011682016040523d82523d6000602084013e611a3f565b606091505b5050905080611a75576000838152601760205260409081902054905163265b39fb60e01b815260048101919091526024016112a7565b60405183907f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17290600090a25050611ae8565b6000818152601b6020526040808220805460ff191660021790555182917f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0391a25b50505050565b600080339050611b0f84828560405180602001604052806000815250612de9565b949350505050565b6000803390506118e387828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92506129d3915050565b60095460009080611b76575050600854919050565b60006009611b85600184614e53565b81548110611b9557611b95614eab565b60009182526020918290206040805180820190915291015463ffffffff81168083526401000000009091046001600160e01b03169282019290925291508410611bec57602001516001600160e01b03169392505050565b611b0f600985612f74565b6000606060015b600d548111611c8d5760008181526011602052604090205460ff1615611c7b5760008181526013602090815260408083205460128352818420818552909252822054611c4a9042614e53565b1190508093508315611c7957604080516020810184905201604051602081830303815290604052925050611c8d565b505b80611c8581614ec1565b915050611bfe565b50915091565b611c9b611142565b6001600160a01b0316336001600160a01b031614611ccb5760405162461bcd60e51b81526004016112a790614beb565b30611cd4611142565b6001600160a01b031614611d165760008036604051611cf4929190614bdb565b604051809103902090505b80611d0a6002612b35565b14611d1457611cff565b505b61130481613083565b601d6020528160005260406000208181548110611d3b57600080fd5b90600052602060002001600091509150505481565b611d586130c4565b611d62600061311e565b565b600080339050611dac86828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612de992505050565b9695505050505050565b336000908152601c602052604081205460ff16611de657604051634018425360e01b815260040160405180910390fd5b611df285858585613170565b95945050505050565b611e036130c4565b6000908152601960209081526040808320805460ff19908116909155600d8054855260118452828520805483169055548452601b90925290912080549091166003179055565b60156020526000908152604090208054611e6290614c22565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8e90614c22565b8015611edb5780601f10611eb057610100808354040283529160200191611edb565b820191906000526020600020905b815481529060010190602001808311611ebe57829003601f168201915b505050505081565b6000611ef0848484613433565b90505b9392505050565b60095460009015611f0f576111566009612881565b5060085490565b611f1e611142565b6001600160a01b0316336001600160a01b031614611f4e5760405162461bcd60e51b81526004016112a790614beb565b30611f57611142565b6001600160a01b031614611f995760008036604051611f77929190614bdb565b604051809103902090505b80611f8d6002612b35565b14611f9757611f82565b505b611304816134d8565b600a546000828152600b602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c44359060240160206040518083038186803b158015611ffa57600080fd5b505afa15801561200e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120329190614cba565b9050806001146120425780611ef3565b60009392505050565b600081815260156020526040902080546060919061206890614c22565b80601f016020809104026020016040519081016040528092919081815260200182805461209490614c22565b80156118615780601f106120b657610100808354040283529160200191611861565b820191906000526020600020905b8154815290600101906020018083116120c45750939695505050505050565b600061115660065490565b60008181526001602081815260408084208151928301909152909101546001600160401b0316908190526117f2565b612125611142565b6001600160a01b0316336001600160a01b0316146121555760405162461bcd60e51b81526004016112a790614beb565b3061215e611142565b6001600160a01b0316146121a0576000803660405161217e929190614bdb565b604051809103902090505b806121946002612b35565b1461219e57612189565b505b6121e28483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250889250613541915050565b5050505050565b6000848484846040516020016122029493929190614edc565b60408051601f19818403018152919052805160209091012095945050505050565b600081815260196020526040902054819060ff166122545760405163528d75ab60e01b815260040160405180910390fd5b60008281526016602090815260408083203384529091528120805434929061227d908490614e1d565b9091555050600082815260176020526040812080543492906122a0908490614e1d565b90915550506040805160208082018352848252336000908152601d909152919091206122cd916001614090565b505050565b6122da6130c4565b6000818152601e60209081526040808320546001600160a01b03168352601c90915290205460ff1661231f576040516305ed74eb60e01b815260040160405180910390fd5b600d80546000908152601260209081526040808320868452825280832042905583548352601b8252808320805460ff1916905583548352601382528083208690558354835260189091529081902085905590549051601490612382908790614c5d565b908152604080516020928190038301902092909255600d546000908152601582529190912085516123b5928701906140d7565b506000818152601e6020908152604080832054600d80548552601a845282852080546001600160a01b0319166001600160a01b03909316929092179091558054845260198352818420805460ff1990811660019081179092558254865260119094528285208054909416179092559054905190917f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d91a2600d805490600061245c83614ec1565b919050555050505050565b60008181526012602090815260408083206013835281842054845290915281205481906124949042614e53565b600093845260136020526040909320549293915050565b6124b3611142565b6001600160a01b0316336001600160a01b0316146124e35760405162461bcd60e51b81526004016112a790614beb565b306124ec611142565b6001600160a01b03161461252e576000803660405161250c929190614bdb565b604051809103902090505b806125226002612b35565b1461252c57612517565b505b61130481613567565b6000611ef3838361255360408051602081019091526000815290565b613433565b612560611142565b6001600160a01b0316336001600160a01b0316146125905760405162461bcd60e51b81526004016112a790614beb565b30612599611142565b6001600160a01b0316146125db57600080366040516125b9929190614bdb565b604051809103902090505b806125cf6002612b35565b146125d9576125c4565b505b61130481613608565b6125ec6130c4565b6001600160a01b0381166126515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016112a7565b6113048161311e565b600061116682613649565b601054341015612688576040516318f722c360e21b815260040160405180910390fd5b336000818152601c60209081526040808320805460ff19166001179055600d548352601e90915280822080546001600160a01b03191684179055517f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f9190a2565b60006001600160e01b038211156127525760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016112a7565b5090565b815460009081908161276786612881565b90506000821180156127a557504386612781600185614e53565b8154811061279157612791614eab565b60009182526020909120015463ffffffff16145b15612805576127b3856126e9565b866127bf600185614e53565b815481106127cf576127cf614eab565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550612873565b85600001604051806040016040528061281d436128dd565b63ffffffff168152602001612831886126e9565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b9250839150505b9250929050565b805460009080156128ca5782612898600183614e53565b815481106128a8576128a8614eab565b60009182526020909120015464010000000090046001600160e01b03166128cd565b60005b6001600160e01b03169392505050565b600063ffffffff8211156127525760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016112a7565b60006001600160e01b03198216636e665ced60e01b1480611166575061116682613702565b600061116661297461376d565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006129c687878787613894565b915091506117c081613981565b60008581526001602081905260408220906129ed886118ee565b60078111156129fe576129fe61475c565b14612a575760405162461bcd60e51b815260206004820152602360248201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460448201526269766560e81b60648201526084016112a7565b604080516020810190915281546001600160401b031690819052600090612a8090889086613433565b9050612a8f8888888488613b3c565b8351612ae157866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051612ad49493929190614f27565b60405180910390a26118e3565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051612b22959493929190614f4f565b60405180910390a2979650505050505050565b6000612b508254600f81810b600160801b909204900b131590565b15612b6e57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b6064811115612c375760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a4016112a7565b6000612c41611efa565b90508015801590612c525750600954155b15612cb757604080518082019091526000815260099060208101612c75846126e9565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b612cc2600983612756565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b30612d0a611142565b6001600160a01b0316146121e25760005b8451811015612d9b57306001600160a01b0316858281518110612d4057612d40614eab565b60200260200101516001600160a01b03161415612d8b57612d8b838281518110612d6c57612d6c614eab565b6020026020010151805190602001206002613cbb90919063ffffffff16565b612d9481614ec1565b9050612d1b565b505050505050565b6121e28585858585613cf7565b30612db9611142565b6001600160a01b0316146121e257600254600f81810b600160801b909204900b13156121e25760006002556121e2565b6000611df285858585612e0760408051602081019091526000815290565b6129d3565b600080612e1883613d6b565b90506004816007811115612e2e57612e2e61475c565b14612e395792915050565b6000838152600b602052604090205480612e54575092915050565b600a54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f5299060240160206040518083038186803b158015612e9857600080fd5b505afa158015612eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed09190614f95565b15612edf575060079392505050565b600a54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e9060240160206040518083038186803b158015612f2357600080fd5b505afa158015612f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5b9190614f95565b15612f6a575060059392505050565b5060029392505050565b6000438210612fc55760405162461bcd60e51b815260206004820181905260248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e656460448201526064016112a7565b825460005b8181101561302a576000612fde8284613e77565b905084866000018281548110612ff657612ff6614eab565b60009182526020909120015463ffffffff16111561301657809250613024565b613021816001614e1d565b91505b50612fca565b811561306e578461303c600184614e53565b8154811061304c5761304c614eab565b60009182526020909120015464010000000090046001600160e01b0316613071565b60005b6001600160e01b031695945050505050565b60045460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600455565b600c546001600160a01b03163314611d625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016112a7565b600c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061317a6120e3565b61318933611075600143614e53565b10156131f15760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f7720706044820152701c9bdc1bdcd85b081d1a1c995cda1bdb19607a1b60648201526084016112a7565b600061320686868686805190602001206121e9565b905084518651146132295760405162461bcd60e51b81526004016112a790614fb7565b835186511461324a5760405162461bcd60e51b81526004016112a790614fb7565b600086511161329b5760405162461bcd60e51b815260206004820152601860248201527f476f7665726e6f723a20656d7074792070726f706f73616c000000000000000060448201526064016112a7565b600081815260016020908152604091829020825191820190925281546001600160401b0316908190521561331b5760405162461bcd60e51b815260206004820152602160248201527f476f7665726e6f723a2070726f706f73616c20616c72656164792065786973746044820152607360f81b60648201526084016112a7565b600061332d61332861186d565b613e92565b61333643613e92565b6133409190614ff8565b9050600061334f61332861116c565b6133599083614ff8565b835467ffffffffffffffff19166001600160401b038416178455905060018301805467ffffffffffffffff19166001600160401b0383161790557f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084338b8b8d516001600160401b038111156133d1576133d16141e0565b60405190808252806020026020018201604052801561340457816020015b60608152602001906001900390816133ef5790505b508c88888e60405161341e99989796959493929190615023565b60405180910390a15091979650505050505050565b604051630748d63560e31b81526001600160a01b038481166004830152602482018490526000917f000000000000000000000000000000000000000000000000000000000000000090911690633a46b1a89060440160206040518083038186803b1580156134a057600080fd5b505afa1580156134b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef09190614cba565b600a54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6060611ef084848460405180606001604052806029815260200161511360299139613efa565b600081116135c75760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b60648201526084016112a7565b60055460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600555565b60065460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600655565b6000606461365683611b61565b604051632394e7a360e21b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638e539e8c9060240160206040518083038186803b1580156136b657600080fd5b505afa1580156136ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ee9190614cba565b6136f89190614e6a565b6111669190614e89565b60006001600160e01b0319821663bf26d89760e01b148061373357506001600160e01b031982166379dd796f60e01b145b8061374e57506001600160e01b03198216630271189760e51b145b8061116657506301ffc9a760e01b6001600160e01b0319831614611166565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156137c657507f000000000000000000000000000000000000000000000000000000000000000046145b156137f057507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156138cb5750600090506003613978565b8460ff16601b141580156138e357508460ff16601c14155b156138f45750600090506004613978565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613948573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661397157600060019250925050613978565b9150600090505b94509492505050565b60008160048111156139955761399561475c565b141561399e5750565b60018160048111156139b2576139b261475c565b1415613a005760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016112a7565b6002816004811115613a1457613a1461475c565b1415613a625760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016112a7565b6003816004811115613a7657613a7661475c565b1415613acf5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016112a7565b6004816004811115613ae357613ae361475c565b14156113045760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016112a7565b60008581526007602090815260408083206001600160a01b0388168452600381019092529091205460ff1615613bc45760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c726561604482015266191e4818d85cdd60ca1b60648201526084016112a7565b6001600160a01b03851660009081526003820160205260408120805460ff1916600117905560ff168460ff161415613c155782816000016000828254613c0a9190614e1d565b90915550612d9b9050565b60ff841660011415613c355782816001016000828254613c0a9190614e1d565b60ff841660021415613c555782816002016000828254613c0a9190614e1d565b60405162461bcd60e51b815260206004820152603560248201527f476f7665726e6f72566f74696e6753696d706c653a20696e76616c69642076616044820152746c756520666f7220656e756d20566f74655479706560581b60648201526084016112a7565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b600a5460405163e38335e560e01b81526001600160a01b039091169063e38335e5903490613d32908890889088906000908990600401614d61565b6000604051808303818588803b158015613d4b57600080fd5b505af1158015613d5f573d6000803e3d6000fd5b50505050505050505050565b6000818152600160205260408120600281015460ff1615613d8f5750600792915050565b6002810154610100900460ff1615613daa5750600292915050565b6000613db5846117ca565b905080613e045760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c20696400000060448201526064016112a7565b438110613e15575060009392505050565b6000613e20856120ee565b9050438110613e3457506001949350505050565b613e3d85614020565b8015613e5c575060008581526007602052604090208054600190910154115b15613e6c57506004949350505050565b506003949350505050565b6000613e866002848418614e89565b611ef390848416614e1d565b60006001600160401b038211156127525760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016112a7565b606082471015613f5b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016112a7565b6001600160a01b0385163b613fb25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016112a7565b600080866001600160a01b03168587604051613fce9190614c5d565b60006040518083038185875af1925050503d806000811461400b576040519150601f19603f3d011682016040523d82523d6000602084013e614010565b606091505b50915091506118e3828286614057565b6000818152600760205260408120600281015460018201546140429190614e1d565b61404e611101856117ca565b11159392505050565b60608315614066575081611ef3565b8251156140765782518084602001fd5b8160405162461bcd60e51b81526004016112a791906143ac565b8280548282559060005260206000209081019282156140cb579160200282015b828111156140cb5782518255916020019190600101906140b0565b5061275292915061414a565b8280546140e390614c22565b90600052602060002090601f01602090048101928261410557600085556140cb565b82601f1061411e57805160ff19168380011785556140cb565b828001600101855582156140cb57918201828111156140cb5782518255916020019190600101906140b0565b5b80821115612752576000815560010161414b565b60006020828403121561417157600080fd5b81356001600160e01b031981168114611ef357600080fd5b803560ff8116811461419a57600080fd5b919050565b60008083601f8401126141b157600080fd5b5081356001600160401b038111156141c857600080fd5b60208301915083602082850101111561287a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561421e5761421e6141e0565b604052919050565b600082601f83011261423757600080fd5b81356001600160401b03811115614250576142506141e0565b614263601f8201601f19166020016141f6565b81815284602083860101111561427857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b0312156142b157600080fd5b883597506142c160208a01614189565b965060408901356001600160401b03808211156142dd57600080fd5b6142e98c838d0161419f565b909850965060608b013591508082111561430257600080fd5b5061430f8b828c01614226565b94505061431e60808a01614189565b925060a0890135915060c089013590509295985092959890939650565b60006020828403121561434d57600080fd5b5035919050565b60005b8381101561436f578181015183820152602001614357565b83811115611ae85750506000910152565b60008151808452614398816020860160208601614354565b601f01601f19169290920160200192915050565b602081526000611ef36020830184614380565b6000602082840312156143d157600080fd5b81356001600160401b038111156143e757600080fd5b611b0f84828501614226565b6001600160a01b038116811461130457600080fd5b6000806040838503121561441b57600080fd5b82359150602083013561442d816143f3565b809150509250929050565b6000806000806080858703121561444e57600080fd5b8435614459816143f3565b93506020850135614469816143f3565b92506040850135915060608501356001600160401b0381111561448b57600080fd5b61449787828801614226565b91505092959194509250565b60006001600160401b038211156144bc576144bc6141e0565b5060051b60200190565b600082601f8301126144d757600080fd5b813560206144ec6144e7836144a3565b6141f6565b82815260059290921b8401810191818101908684111561450b57600080fd5b8286015b8481101561452f578035614522816143f3565b835291830191830161450f565b509695505050505050565b600082601f83011261454b57600080fd5b8135602061455b6144e7836144a3565b82815260059290921b8401810191818101908684111561457a57600080fd5b8286015b8481101561452f578035835291830191830161457e565b600082601f8301126145a657600080fd5b813560206145b66144e7836144a3565b82815260059290921b840181019181810190868411156145d557600080fd5b8286015b8481101561452f5780356001600160401b038111156145f85760008081fd5b6146068986838b0101614226565b8452509183019183016145d9565b6000806000806080858703121561462a57600080fd5b84356001600160401b038082111561464157600080fd5b61464d888389016144c6565b9550602087013591508082111561466357600080fd5b61466f8883890161453a565b9450604087013591508082111561468557600080fd5b5061469287828801614595565b949793965093946060013593505050565b6000602082840312156146b557600080fd5b8135611ef3816143f3565b600081518084526020808501945080840160005b838110156146f0578151875295820195908201906001016146d4565b509495945050505050565b602081526000611ef360208301846146c0565b600080600080600060a0868803121561472657600080fd5b8535945061473660208701614189565b935061474460408701614189565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106147865761478661475c565b91905290565b60208101600483106147865761478661475c565b600080602083850312156147b357600080fd5b82356001600160401b038111156147c957600080fd5b6147d58582860161419f565b90969095509350505050565b600080604083850312156147f457600080fd5b8235915061480460208401614189565b90509250929050565b60008060008060006080868803121561482557600080fd5b8535945061483560208701614189565b935060408601356001600160401b038082111561485157600080fd5b61485d89838a0161419f565b9095509350606088013591508082111561487657600080fd5b5061488388828901614226565b9150509295509295909350565b8215158152604060208201526000611ef06040830184614380565b600080604083850312156148be57600080fd5b82356148c9816143f3565b946020939093013593505050565b600080600080606085870312156148ed57600080fd5b843593506148fd60208601614189565b925060408501356001600160401b0381111561491857600080fd5b6149248782880161419f565b95989497509550505050565b6000806000806080858703121561494657600080fd5b84356001600160401b038082111561495d57600080fd5b614969888389016144c6565b9550602087013591508082111561497f57600080fd5b61498b8883890161453a565b945060408701359150808211156149a157600080fd5b6149ad88838901614595565b935060608701359150808211156149c357600080fd5b5061449787828801614226565b6000806000606084860312156149e557600080fd5b83356149f0816143f3565b92506020840135915060408401356001600160401b03811115614a1257600080fd5b614a1e86828701614226565b9150509250925092565b600080600080600060a08688031215614a4057600080fd5b8535614a4b816143f3565b94506020860135614a5b816143f3565b935060408601356001600160401b0380821115614a7757600080fd5b614a8389838a0161453a565b94506060880135915080821115614a9957600080fd5b614aa589838a0161453a565b9350608088013591508082111561487657600080fd5b60008060008060608587031215614ad157600080fd5b8435614adc816143f3565b93506020850135925060408501356001600160401b0381111561491857600080fd5b60008060408385031215614b1157600080fd5b50508035926020909101359150565b60008060008060808587031215614b3657600080fd5b84356001600160401b03811115614b4c57600080fd5b614b5887828801614226565b97602087013597506040870135966060013595509350505050565b600080600080600060a08688031215614b8b57600080fd5b8535614b96816143f3565b94506020860135614ba6816143f3565b9350604086013592506060860135915060808601356001600160401b03811115614bcf57600080fd5b61488388828901614226565b8183823760009101908152919050565b60208082526018908201527f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000604082015260600190565b600181811c90821680614c3657607f821691505b60208210811415614c5757634e487b7160e01b600052602260045260246000fd5b50919050565b60008251614c6f818460208701614354565b9190910192915050565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b600060208284031215614ccc57600080fd5b5051919050565b600081518084526020808501945080840160005b838110156146f05781516001600160a01b031687529582019590820190600101614ce7565b600081518084526020808501808196508360051b8101915082860160005b85811015614d54578284038952614d42848351614380565b98850198935090840190600101614d2a565b5091979650505050505050565b60a081526000614d7460a0830188614cd3565b8281036020840152614d8681886146c0565b90508281036040840152614d9a8187614d0c565b60608401959095525050608001529392505050565b60c081526000614dc260c0830189614cd3565b8281036020840152614dd481896146c0565b90508281036040840152614de88188614d0c565b60608401969096525050608081019290925260a0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115614e3057614e30614e07565b500190565b8035602083101561116657600019602084900360031b1b1692915050565b600082821015614e6557614e65614e07565b500390565b6000816000190483118215151615614e8457614e84614e07565b500290565b600082614ea657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614ed557614ed5614e07565b5060010190565b608081526000614eef6080830187614cd3565b8281036020840152614f0181876146c0565b90508281036040840152614f158186614d0c565b91505082606083015295945050505050565b84815260ff84166020820152826040820152608060608201526000611dac6080830184614380565b85815260ff8516602082015283604082015260a060608201526000614f7760a0830185614380565b8281036080840152614f898185614380565b98975050505050505050565b600060208284031215614fa757600080fd5b81518015158114611ef357600080fd5b60208082526021908201527f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e67746040820152600d60fb1b606082015260800190565b60006001600160401b0380831681851680830382111561501a5761501a614e07565b01949350505050565b60006101208b8352602060018060a01b038c168185015281604085015261504c8285018c614cd3565b91508382036060850152615060828b6146c0565b915083820360808501528189518084528284019150828160051b850101838c0160005b838110156150b157601f1987840301855261509f838351614380565b94860194925090850190600101615083565b505086810360a08801526150c5818c614d0c565b9450505050506150e060c08401876001600160401b03169052565b6001600160401b03851660e08401528281036101008401526151028185614380565b9c9b50505050505050505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212201c4f8843a7eff2d14bce1f29a6c5022f5d3cbcdaec71b1b24af686c441e1d02864736f6c63430008090033", "devdoc": { "errors": { "Empty()": [ @@ -2541,6 +2573,14 @@ "offset": 0, "slot": "29", "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)" + }, + { + "astId": 10240, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "projectOwnerAddressIndex", + "offset": 0, + "slot": "30", + "type": "t_mapping(t_uint256,t_address)" } ], "types": { diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json index 1fbd716..1543574 100644 --- a/deployments/localhost/TimeLock.json +++ b/deployments/localhost/TimeLock.json @@ -867,21 +867,21 @@ "type": "receive" } ], - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "transactionIndex": 0, - "gasUsed": "3021451", + "gasUsed": "1868529", "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000000000001000000000000000000000200000010200000000000000000000000000010000000000000000000000000000000000001000000000040020000400000000100800800000004000000000000020000000000000000000000000000000000000000000000000000000000080000000200000000000000000020000000000000000000000000000000000000001000000000000000000040000000204000000000000000000200002008000100000100200020000000000000001000000000000000000000000000000000000000000000000000", - "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a", - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "blockHash": "0xcd361b07aab2c666cdd59430b644edb4530e58786bb11e05b80af4876deabba8", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "logs": [ { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", @@ -891,12 +891,12 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" + "blockHash": "0xcd361b07aab2c666cdd59430b644edb4530e58786bb11e05b80af4876deabba8" }, { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", @@ -906,12 +906,12 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" + "blockHash": "0xcd361b07aab2c666cdd59430b644edb4530e58786bb11e05b80af4876deabba8" }, { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", @@ -921,12 +921,12 @@ ], "data": "0x", "logIndex": 2, - "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" + "blockHash": "0xcd361b07aab2c666cdd59430b644edb4530e58786bb11e05b80af4876deabba8" }, { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff", @@ -936,12 +936,12 @@ ], "data": "0x", "logIndex": 3, - "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" + "blockHash": "0xcd361b07aab2c666cdd59430b644edb4530e58786bb11e05b80af4876deabba8" }, { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", @@ -951,12 +951,12 @@ ], "data": "0x", "logIndex": 4, - "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" + "blockHash": "0xcd361b07aab2c666cdd59430b644edb4530e58786bb11e05b80af4876deabba8" }, { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", @@ -966,23 +966,23 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" + "blockHash": "0xcd361b07aab2c666cdd59430b644edb4530e58786bb11e05b80af4876deabba8" }, { "transactionIndex": 0, "blockNumber": 1, - "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", + "transactionHash": "0xcf8b1935a10425f291d9c60c26ae5adca12c0ecd4d8cac870fc628d08eefec16", "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "topics": [ "0x11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 6, - "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" + "blockHash": "0xcd361b07aab2c666cdd59430b644edb4530e58786bb11e05b80af4876deabba8" } ], "blockNumber": 1, - "cumulativeGasUsed": "3021451", + "cumulativeGasUsed": "1868529", "status": 1, "byzantium": true }, @@ -992,10 +992,10 @@ [] ], "numDeployments": 1, - "solcInputHash": "9bb96e2ab1a2d14e7d6f1254972fa73c", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minDelay\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"executers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"CallScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"Cancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDuration\",\"type\":\"uint256\"}],\"name\":\"MinDelayChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCELLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXECUTOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMELOCK_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"cancel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperationBatch\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationDone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationPending\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ready\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"schedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"scheduleBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDelay\",\"type\":\"uint256\"}],\"name\":\"updateDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancel(bytes32)\":{\"details\":\"Cancel an operation. Requirements: - the caller must have the 'canceller' role.\"},\"execute(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role.\"},\"executeBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role.\"},\"getMinDelay()\":{\"details\":\"Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations).\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hashOperation(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a single transaction.\"},\"hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a batch of transactions.\"},\"isOperation(bytes32)\":{\"details\":\"Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations.\"},\"isOperationDone(bytes32)\":{\"details\":\"Returns whether an operation is done or not.\"},\"isOperationPending(bytes32)\":{\"details\":\"Returns whether an operation is pending or not.\"},\"isOperationReady(bytes32)\":{\"details\":\"Returns whether an operation is ready or not.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"schedule(address,uint256,bytes,bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role.\"},\"scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"updateDelay(uint256)\":{\"details\":\"Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLock.sol\":\"TimeLock\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/TimeLock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/TimelockController.sol\\\";\\n\\ncontract TimeLock is TimelockController {\\n // minDelay: How long you have to wait before executing\\n // proposers is the list of addresses that can purpose\\n // executers: Who can execute when proposal passes\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executers\\n ) TimelockController(minDelay, proposers, executers) {}\\n}\\n\",\"keccak256\":\"0x6e48ab9ddd3998d94cdd53158d3d0d16984ac638fb4f685fae7fd734254e3c11\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162003bd838038062003bd8833981810160405281019062000037919062000779565b8282826200006c7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5806200035560201b60201c565b620000be7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc17f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001107fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e637f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7837f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001a37f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca562000197620003b860201b60201c565b620003c060201b60201c565b620001d57f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca530620003c060201b60201c565b60005b82518110156200029457620002317fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc18483815181106200021d576200021c62000813565b5b6020026020010151620003c060201b60201c565b620002807ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7838483815181106200026c576200026b62000813565b5b6020026020010151620003c060201b60201c565b806200028c9062000871565b9050620001d8565b5060005b81518110156200030557620002f17fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63838381518110620002dd57620002dc62000813565b5b6020026020010151620003c060201b60201c565b80620002fd9062000871565b905062000298565b50826002819055507f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5600084604051620003419291906200091c565b60405180910390a150505050505062000949565b60006200036883620003d660201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b620003d28282620003f560201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b620004078282620004e660201b60201c565b620004e257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000487620003b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620005798162000564565b81146200058557600080fd5b50565b60008151905062000599816200056e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005ef82620005a4565b810181811067ffffffffffffffff82111715620006115762000610620005b5565b5b80604052505050565b60006200062662000550565b9050620006348282620005e4565b919050565b600067ffffffffffffffff821115620006575762000656620005b5565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200069a826200066d565b9050919050565b620006ac816200068d565b8114620006b857600080fd5b50565b600081519050620006cc81620006a1565b92915050565b6000620006e9620006e38462000639565b6200061a565b905080838252602082019050602084028301858111156200070f576200070e62000668565b5b835b818110156200073c5780620007278882620006bb565b84526020840193505060208101905062000711565b5050509392505050565b600082601f8301126200075e576200075d6200059f565b5b815162000770848260208601620006d2565b91505092915050565b6000806000606084860312156200079557620007946200055a565b5b6000620007a58682870162000588565b935050602084015167ffffffffffffffff811115620007c957620007c86200055f565b5b620007d78682870162000746565b925050604084015167ffffffffffffffff811115620007fb57620007fa6200055f565b5b620008098682870162000746565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200087e8262000564565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620008b357620008b262000842565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000620008f3620008ed620008e784620008be565b620008c8565b62000564565b9050919050565b6200090581620008d2565b82525050565b620009168162000564565b82525050565b6000604082019050620009336000830185620008fa565b6200094260208301846200090b565b9392505050565b61327f80620009596000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", + "solcInputHash": "a1407720c5f6b2a7e45e84dbad9d7fc2", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minDelay\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"executers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"CallScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"Cancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDuration\",\"type\":\"uint256\"}],\"name\":\"MinDelayChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCELLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXECUTOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMELOCK_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"cancel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperationBatch\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationDone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationPending\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ready\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"schedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"scheduleBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDelay\",\"type\":\"uint256\"}],\"name\":\"updateDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancel(bytes32)\":{\"details\":\"Cancel an operation. Requirements: - the caller must have the 'canceller' role.\"},\"execute(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role.\"},\"executeBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role.\"},\"getMinDelay()\":{\"details\":\"Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations).\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hashOperation(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a single transaction.\"},\"hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a batch of transactions.\"},\"isOperation(bytes32)\":{\"details\":\"Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations.\"},\"isOperationDone(bytes32)\":{\"details\":\"Returns whether an operation is done or not.\"},\"isOperationPending(bytes32)\":{\"details\":\"Returns whether an operation is pending or not.\"},\"isOperationReady(bytes32)\":{\"details\":\"Returns whether an operation is ready or not.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"schedule(address,uint256,bytes,bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role.\"},\"scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"updateDelay(uint256)\":{\"details\":\"Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLock.sol\":\"TimeLock\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/TimeLock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/TimelockController.sol\\\";\\n\\ncontract TimeLock is TimelockController {\\n // minDelay: How long you have to wait before executing\\n // proposers is the list of addresses that can purpose\\n // executers: Who can execute when proposal passes\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executers\\n ) TimelockController(minDelay, proposers, executers) {}\\n}\\n\",\"keccak256\":\"0x6e48ab9ddd3998d94cdd53158d3d0d16984ac638fb4f685fae7fd734254e3c11\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162002301380380620023018339810160408190526200003491620003fd565b82828262000052600080516020620022818339815191528062000222565b6200007c600080516020620022a18339815191526000805160206200228183398151915262000222565b620000a6600080516020620022c18339815191526000805160206200228183398151915262000222565b620000d0600080516020620022e18339815191526000805160206200228183398151915262000222565b620000eb60008051602062002281833981519152336200026d565b6200010660008051602062002281833981519152306200026d565b60005b82518110156200018c5762000150600080516020620022a18339815191528483815181106200013c576200013c62000471565b60200260200101516200026d60201b60201c565b62000179600080516020620022e18339815191528483815181106200013c576200013c62000471565b620001848162000487565b905062000109565b5060005b8151811015620001d657620001c3600080516020620022c18339815191528383815181106200013c576200013c62000471565b620001ce8162000487565b905062000190565b5060028390556040805160008152602081018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050505050620004b1565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200027982826200027d565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000279576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002d93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200034b57600080fd5b919050565b600082601f8301126200036257600080fd5b815160206001600160401b03808311156200038157620003816200031d565b8260051b604051601f19603f83011681018181108482111715620003a957620003a96200031d565b604052938452858101830193838101925087851115620003c857600080fd5b83870191505b84821015620003f257620003e28262000333565b83529183019190830190620003ce565b979650505050505050565b6000806000606084860312156200041357600080fd5b835160208501519093506001600160401b03808211156200043357600080fd5b620004418783880162000350565b935060408601519150808211156200045857600080fd5b50620004678682870162000350565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620004aa57634e487b7160e01b600052601160045260246000fd5b5060010190565b611dc080620004c16000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f14610582578063e38335e5146105a2578063f23a6e61146105b5578063f27a0c92146105e157600080fd5b8063bc197c8114610509578063c4d252f514610535578063d45c44351461055557600080fd5b806391d14854116100c657806391d1485414610480578063a217fddf146104a0578063b08e51c0146104b5578063b1c5f427146104e957600080fd5b80638065657f1461040c5780638f2a0bb01461042c5780638f61f4f51461044c57600080fd5b8063248a9ca31161015957806331d507501161013357806331d507501461038c57806336568abe146103ac578063584b153e146103cc57806364d62353146103ec57600080fd5b8063248a9ca31461030b5780632ab0f5291461033b5780632f2ff15d1461036c57600080fd5b80630d3cf6fc116101955780630d3cf6fc14610260578063134008d31461029457806313bc9f20146102a7578063150b7a02146102c757600080fd5b806301d5062a146101c757806301ffc9a7146101e957806307bd02651461021e57600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101e76101e23660046113b9565b6105f6565b005b3480156101f557600080fd5b5061020961020436600461142d565b61068b565b60405190151581526020015b60405180910390f35b34801561022a57600080fd5b506102527fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610215565b34801561026c57600080fd5b506102527f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e76102a2366004611457565b6106b6565b3480156102b357600080fd5b506102096102c23660046114c2565b61076b565b3480156102d357600080fd5b506102f26102e2366004611590565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610215565b34801561031757600080fd5b506102526103263660046114c2565b60009081526020819052604090206001015490565b34801561034757600080fd5b506102096103563660046114c2565b6000908152600160208190526040909120541490565b34801561037857600080fd5b506101e76103873660046115f7565b610791565b34801561039857600080fd5b506102096103a73660046114c2565b6107bb565b3480156103b857600080fd5b506101e76103c73660046115f7565b6107d4565b3480156103d857600080fd5b506102096103e73660046114c2565b610857565b3480156103f857600080fd5b506101e76104073660046114c2565b61086d565b34801561041857600080fd5b50610252610427366004611457565b610911565b34801561043857600080fd5b506101e7610447366004611667565b610950565b34801561045857600080fd5b506102527fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561048c57600080fd5b5061020961049b3660046115f7565b610aa2565b3480156104ac57600080fd5b50610252600081565b3480156104c157600080fd5b506102527ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156104f557600080fd5b50610252610504366004611718565b610acb565b34801561051557600080fd5b506102f261052436600461183f565b63bc197c8160e01b95945050505050565b34801561054157600080fd5b506101e76105503660046114c2565b610b10565b34801561056157600080fd5b506102526105703660046114c2565b60009081526001602052604090205490565b34801561058e57600080fd5b506101e761059d3660046115f7565b610be5565b6101e76105b0366004611718565b610c0a565b3480156105c157600080fd5b506102f26105d03660046118e8565b63f23a6e6160e01b95945050505050565b3480156105ed57600080fd5b50600254610252565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161062081610d94565b6000610630898989898989610911565b905061063c8184610da1565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161067896959493929190611975565b60405180910390a3505050505050505050565b60006001600160e01b03198216630271189760e51b14806106b057506106b082610e90565b92915050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636106e2816000610aa2565b6106f0576106f08133610ec5565b6000610700888888888888610911565b905061070c8185610f29565b61071888888888610fc5565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161075094939291906119b2565b60405180910390a361076181611098565b5050505050505050565b60008181526001602052604081205460018111801561078a5750428111155b9392505050565b6000828152602081905260409020600101546107ac81610d94565b6107b683836110d1565b505050565b60008181526001602052604081205481905b1192915050565b6001600160a01b03811633146108495760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108538282611155565b5050565b60008181526001602081905260408220546107cd565b3330146108d05760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610840565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b600086868686868660405160200161092e96959493929190611975565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161097a81610d94565b8887146109995760405162461bcd60e51b8152600401610840906119e4565b8885146109b85760405162461bcd60e51b8152600401610840906119e4565b60006109ca8b8b8b8b8b8b8b8b610acb565b90506109d68184610da1565b60005b8a811015610a945780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a1657610a16611a27565b9050602002016020810190610a2b9190611a3d565b8d8d86818110610a3d57610a3d611a27565b905060200201358c8c87818110610a5657610a56611a27565b9050602002810190610a689190611a58565b8c8b604051610a7c96959493929190611975565b60405180910390a3610a8d81611ab4565b90506109d9565b505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610aec989796959493929190611b5f565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610b3a81610d94565b610b4382610857565b610ba95760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610840565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610c0081610d94565b6107b68383611155565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610c36816000610aa2565b610c4457610c448133610ec5565b878614610c635760405162461bcd60e51b8152600401610840906119e4565b878414610c825760405162461bcd60e51b8152600401610840906119e4565b6000610c948a8a8a8a8a8a8a8a610acb565b9050610ca08185610f29565b60005b89811015610d7e5760008b8b83818110610cbf57610cbf611a27565b9050602002016020810190610cd49190611a3d565b905060008a8a84818110610cea57610cea611a27565b9050602002013590503660008a8a86818110610d0857610d08611a27565b9050602002810190610d1a9190611a58565b91509150610d2a84848484610fc5565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610d6194939291906119b2565b60405180910390a35050505080610d7790611ab4565b9050610ca3565b50610d8881611098565b50505050505050505050565b610d9e8133610ec5565b50565b610daa826107bb565b15610e0f5760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610840565b600254811015610e705760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610840565b610e7a8142611c0a565b6000928352600160205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b14806106b057506301ffc9a760e01b6001600160e01b03198316146106b0565b610ecf8282610aa2565b61085357610ee7816001600160a01b031660146111ba565b610ef28360206111ba565b604051602001610f03929190611c52565b60408051601f198184030181529082905262461bcd60e51b825261084091600401611cc7565b610f328261076b565b610f4e5760405162461bcd60e51b815260040161084090611cfa565b801580610f6a5750600081815260016020819052604090912054145b6108535760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610840565b6000846001600160a01b0316848484604051610fe2929190611d44565b60006040518083038185875af1925050503d806000811461101f576040519150601f19603f3d011682016040523d82523d6000602084013e611024565b606091505b50509050806110915760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610840565b5050505050565b6110a18161076b565b6110bd5760405162461bcd60e51b815260040161084090611cfa565b600090815260016020819052604090912055565b6110db8282610aa2565b610853576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556111113390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61115f8282610aa2565b15610853576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606060006111c9836002611d54565b6111d4906002611c0a565b6001600160401b038111156111eb576111eb6114db565b6040519080825280601f01601f191660200182016040528015611215576020820181803683370190505b509050600360fc1b8160008151811061123057611230611a27565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061125f5761125f611a27565b60200101906001600160f81b031916908160001a9053506000611283846002611d54565b61128e906001611c0a565b90505b6001811115611306576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106112c2576112c2611a27565b1a60f81b8282815181106112d8576112d8611a27565b60200101906001600160f81b031916908160001a90535060049490941c936112ff81611d73565b9050611291565b50831561078a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610840565b80356001600160a01b038116811461136c57600080fd5b919050565b60008083601f84011261138357600080fd5b5081356001600160401b0381111561139a57600080fd5b6020830191508360208285010111156113b257600080fd5b9250929050565b600080600080600080600060c0888a0312156113d457600080fd5b6113dd88611355565b96506020880135955060408801356001600160401b038111156113ff57600080fd5b61140b8a828b01611371565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561143f57600080fd5b81356001600160e01b03198116811461078a57600080fd5b60008060008060008060a0878903121561147057600080fd5b61147987611355565b95506020870135945060408701356001600160401b0381111561149b57600080fd5b6114a789828a01611371565b979a9699509760608101359660809091013595509350505050565b6000602082840312156114d457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611519576115196114db565b604052919050565b600082601f83011261153257600080fd5b81356001600160401b0381111561154b5761154b6114db565b61155e601f8201601f19166020016114f1565b81815284602083860101111561157357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156115a657600080fd5b6115af85611355565b93506115bd60208601611355565b92506040850135915060608501356001600160401b038111156115df57600080fd5b6115eb87828801611521565b91505092959194509250565b6000806040838503121561160a57600080fd5b8235915061161a60208401611355565b90509250929050565b60008083601f84011261163557600080fd5b5081356001600160401b0381111561164c57600080fd5b6020830191508360208260051b85010111156113b257600080fd5b600080600080600080600080600060c08a8c03121561168557600080fd5b89356001600160401b038082111561169c57600080fd5b6116a88d838e01611623565b909b50995060208c01359150808211156116c157600080fd5b6116cd8d838e01611623565b909950975060408c01359150808211156116e657600080fd5b506116f38c828d01611623565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561173457600080fd5b88356001600160401b038082111561174b57600080fd5b6117578c838d01611623565b909a50985060208b013591508082111561177057600080fd5b61177c8c838d01611623565b909850965060408b013591508082111561179557600080fd5b506117a28b828c01611623565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126117d157600080fd5b813560206001600160401b038211156117ec576117ec6114db565b8160051b6117fb8282016114f1565b928352848101820192828101908785111561181557600080fd5b83870192505b848310156118345782358252918301919083019061181b565b979650505050505050565b600080600080600060a0868803121561185757600080fd5b61186086611355565b945061186e60208701611355565b935060408601356001600160401b038082111561188a57600080fd5b61189689838a016117c0565b945060608801359150808211156118ac57600080fd5b6118b889838a016117c0565b935060808801359150808211156118ce57600080fd5b506118db88828901611521565b9150509295509295909350565b600080600080600060a0868803121561190057600080fd5b61190986611355565b945061191760208701611355565b9350604086013592506060860135915060808601356001600160401b0381111561194057600080fd5b6118db88828901611521565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a06040820152600061199d60a08301868861194c565b60608301949094525060800152949350505050565b60018060a01b03851681528360208201526060604082015260006119da60608301848661194c565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a4f57600080fd5b61078a82611355565b6000808335601e19843603018112611a6f57600080fd5b8301803591506001600160401b03821115611a8957600080fd5b6020019150368190038213156113b257600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611ac857611ac8611a9e565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015611b525782840389528135601e19883603018112611b0a57600080fd5b870180356001600160401b03811115611b2257600080fd5b803603891315611b3157600080fd5b611b3e868289850161194c565b9a87019a9550505090840190600101611ae9565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015611ba0576001600160a01b03611b8b84611355565b16825260209283019290910190600101611b72565b5083810360208501528881526001600160fb1b03891115611bc057600080fd5b8860051b9150818a602083013781810191505060208101600081526020848303016040850152611bf181888a611acf565b6060850196909652505050608001529695505050505050565b60008219821115611c1d57611c1d611a9e565b500190565b60005b83811015611c3d578181015183820152602001611c25565b83811115611c4c576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611c8a816017850160208801611c22565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611cbb816028840160208801611c22565b01602801949350505050565b6020815260008251806020840152611ce6816040850160208701611c22565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b6000816000190483118215151615611d6e57611d6e611a9e565b500290565b600081611d8257611d82611a9e565b50600019019056fea26469706673582212207758f0ecbf76d35fbf58ef7c75e331ff7a49906cb91cf79e298e13041421a89364736f6c634300080900335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783", + "deployedBytecode": "0x6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f14610582578063e38335e5146105a2578063f23a6e61146105b5578063f27a0c92146105e157600080fd5b8063bc197c8114610509578063c4d252f514610535578063d45c44351461055557600080fd5b806391d14854116100c657806391d1485414610480578063a217fddf146104a0578063b08e51c0146104b5578063b1c5f427146104e957600080fd5b80638065657f1461040c5780638f2a0bb01461042c5780638f61f4f51461044c57600080fd5b8063248a9ca31161015957806331d507501161013357806331d507501461038c57806336568abe146103ac578063584b153e146103cc57806364d62353146103ec57600080fd5b8063248a9ca31461030b5780632ab0f5291461033b5780632f2ff15d1461036c57600080fd5b80630d3cf6fc116101955780630d3cf6fc14610260578063134008d31461029457806313bc9f20146102a7578063150b7a02146102c757600080fd5b806301d5062a146101c757806301ffc9a7146101e957806307bd02651461021e57600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101e76101e23660046113b9565b6105f6565b005b3480156101f557600080fd5b5061020961020436600461142d565b61068b565b60405190151581526020015b60405180910390f35b34801561022a57600080fd5b506102527fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610215565b34801561026c57600080fd5b506102527f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e76102a2366004611457565b6106b6565b3480156102b357600080fd5b506102096102c23660046114c2565b61076b565b3480156102d357600080fd5b506102f26102e2366004611590565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610215565b34801561031757600080fd5b506102526103263660046114c2565b60009081526020819052604090206001015490565b34801561034757600080fd5b506102096103563660046114c2565b6000908152600160208190526040909120541490565b34801561037857600080fd5b506101e76103873660046115f7565b610791565b34801561039857600080fd5b506102096103a73660046114c2565b6107bb565b3480156103b857600080fd5b506101e76103c73660046115f7565b6107d4565b3480156103d857600080fd5b506102096103e73660046114c2565b610857565b3480156103f857600080fd5b506101e76104073660046114c2565b61086d565b34801561041857600080fd5b50610252610427366004611457565b610911565b34801561043857600080fd5b506101e7610447366004611667565b610950565b34801561045857600080fd5b506102527fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561048c57600080fd5b5061020961049b3660046115f7565b610aa2565b3480156104ac57600080fd5b50610252600081565b3480156104c157600080fd5b506102527ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156104f557600080fd5b50610252610504366004611718565b610acb565b34801561051557600080fd5b506102f261052436600461183f565b63bc197c8160e01b95945050505050565b34801561054157600080fd5b506101e76105503660046114c2565b610b10565b34801561056157600080fd5b506102526105703660046114c2565b60009081526001602052604090205490565b34801561058e57600080fd5b506101e761059d3660046115f7565b610be5565b6101e76105b0366004611718565b610c0a565b3480156105c157600080fd5b506102f26105d03660046118e8565b63f23a6e6160e01b95945050505050565b3480156105ed57600080fd5b50600254610252565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161062081610d94565b6000610630898989898989610911565b905061063c8184610da1565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161067896959493929190611975565b60405180910390a3505050505050505050565b60006001600160e01b03198216630271189760e51b14806106b057506106b082610e90565b92915050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636106e2816000610aa2565b6106f0576106f08133610ec5565b6000610700888888888888610911565b905061070c8185610f29565b61071888888888610fc5565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161075094939291906119b2565b60405180910390a361076181611098565b5050505050505050565b60008181526001602052604081205460018111801561078a5750428111155b9392505050565b6000828152602081905260409020600101546107ac81610d94565b6107b683836110d1565b505050565b60008181526001602052604081205481905b1192915050565b6001600160a01b03811633146108495760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108538282611155565b5050565b60008181526001602081905260408220546107cd565b3330146108d05760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b6064820152608401610840565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b600086868686868660405160200161092e96959493929190611975565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161097a81610d94565b8887146109995760405162461bcd60e51b8152600401610840906119e4565b8885146109b85760405162461bcd60e51b8152600401610840906119e4565b60006109ca8b8b8b8b8b8b8b8b610acb565b90506109d68184610da1565b60005b8a811015610a945780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a1657610a16611a27565b9050602002016020810190610a2b9190611a3d565b8d8d86818110610a3d57610a3d611a27565b905060200201358c8c87818110610a5657610a56611a27565b9050602002810190610a689190611a58565b8c8b604051610a7c96959493929190611975565b60405180910390a3610a8d81611ab4565b90506109d9565b505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610aec989796959493929190611b5f565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610b3a81610d94565b610b4382610857565b610ba95760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b6064820152608401610840565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610c0081610d94565b6107b68383611155565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610c36816000610aa2565b610c4457610c448133610ec5565b878614610c635760405162461bcd60e51b8152600401610840906119e4565b878414610c825760405162461bcd60e51b8152600401610840906119e4565b6000610c948a8a8a8a8a8a8a8a610acb565b9050610ca08185610f29565b60005b89811015610d7e5760008b8b83818110610cbf57610cbf611a27565b9050602002016020810190610cd49190611a3d565b905060008a8a84818110610cea57610cea611a27565b9050602002013590503660008a8a86818110610d0857610d08611a27565b9050602002810190610d1a9190611a58565b91509150610d2a84848484610fc5565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610d6194939291906119b2565b60405180910390a35050505080610d7790611ab4565b9050610ca3565b50610d8881611098565b50505050505050505050565b610d9e8133610ec5565b50565b610daa826107bb565b15610e0f5760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b6064820152608401610840565b600254811015610e705760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b6064820152608401610840565b610e7a8142611c0a565b6000928352600160205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b14806106b057506301ffc9a760e01b6001600160e01b03198316146106b0565b610ecf8282610aa2565b61085357610ee7816001600160a01b031660146111ba565b610ef28360206111ba565b604051602001610f03929190611c52565b60408051601f198184030181529082905262461bcd60e51b825261084091600401611cc7565b610f328261076b565b610f4e5760405162461bcd60e51b815260040161084090611cfa565b801580610f6a5750600081815260016020819052604090912054145b6108535760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b6064820152608401610840565b6000846001600160a01b0316848484604051610fe2929190611d44565b60006040518083038185875af1925050503d806000811461101f576040519150601f19603f3d011682016040523d82523d6000602084013e611024565b606091505b50509050806110915760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b6064820152608401610840565b5050505050565b6110a18161076b565b6110bd5760405162461bcd60e51b815260040161084090611cfa565b600090815260016020819052604090912055565b6110db8282610aa2565b610853576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556111113390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61115f8282610aa2565b15610853576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b606060006111c9836002611d54565b6111d4906002611c0a565b6001600160401b038111156111eb576111eb6114db565b6040519080825280601f01601f191660200182016040528015611215576020820181803683370190505b509050600360fc1b8160008151811061123057611230611a27565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061125f5761125f611a27565b60200101906001600160f81b031916908160001a9053506000611283846002611d54565b61128e906001611c0a565b90505b6001811115611306576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106112c2576112c2611a27565b1a60f81b8282815181106112d8576112d8611a27565b60200101906001600160f81b031916908160001a90535060049490941c936112ff81611d73565b9050611291565b50831561078a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610840565b80356001600160a01b038116811461136c57600080fd5b919050565b60008083601f84011261138357600080fd5b5081356001600160401b0381111561139a57600080fd5b6020830191508360208285010111156113b257600080fd5b9250929050565b600080600080600080600060c0888a0312156113d457600080fd5b6113dd88611355565b96506020880135955060408801356001600160401b038111156113ff57600080fd5b61140b8a828b01611371565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561143f57600080fd5b81356001600160e01b03198116811461078a57600080fd5b60008060008060008060a0878903121561147057600080fd5b61147987611355565b95506020870135945060408701356001600160401b0381111561149b57600080fd5b6114a789828a01611371565b979a9699509760608101359660809091013595509350505050565b6000602082840312156114d457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611519576115196114db565b604052919050565b600082601f83011261153257600080fd5b81356001600160401b0381111561154b5761154b6114db565b61155e601f8201601f19166020016114f1565b81815284602083860101111561157357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156115a657600080fd5b6115af85611355565b93506115bd60208601611355565b92506040850135915060608501356001600160401b038111156115df57600080fd5b6115eb87828801611521565b91505092959194509250565b6000806040838503121561160a57600080fd5b8235915061161a60208401611355565b90509250929050565b60008083601f84011261163557600080fd5b5081356001600160401b0381111561164c57600080fd5b6020830191508360208260051b85010111156113b257600080fd5b600080600080600080600080600060c08a8c03121561168557600080fd5b89356001600160401b038082111561169c57600080fd5b6116a88d838e01611623565b909b50995060208c01359150808211156116c157600080fd5b6116cd8d838e01611623565b909950975060408c01359150808211156116e657600080fd5b506116f38c828d01611623565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561173457600080fd5b88356001600160401b038082111561174b57600080fd5b6117578c838d01611623565b909a50985060208b013591508082111561177057600080fd5b61177c8c838d01611623565b909850965060408b013591508082111561179557600080fd5b506117a28b828c01611623565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126117d157600080fd5b813560206001600160401b038211156117ec576117ec6114db565b8160051b6117fb8282016114f1565b928352848101820192828101908785111561181557600080fd5b83870192505b848310156118345782358252918301919083019061181b565b979650505050505050565b600080600080600060a0868803121561185757600080fd5b61186086611355565b945061186e60208701611355565b935060408601356001600160401b038082111561188a57600080fd5b61189689838a016117c0565b945060608801359150808211156118ac57600080fd5b6118b889838a016117c0565b935060808801359150808211156118ce57600080fd5b506118db88828901611521565b9150509295509295909350565b600080600080600060a0868803121561190057600080fd5b61190986611355565b945061191760208701611355565b9350604086013592506060860135915060808601356001600160401b0381111561194057600080fd5b6118db88828901611521565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a06040820152600061199d60a08301868861194c565b60608301949094525060800152949350505050565b60018060a01b03851681528360208201526060604082015260006119da60608301848661194c565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a4f57600080fd5b61078a82611355565b6000808335601e19843603018112611a6f57600080fd5b8301803591506001600160401b03821115611a8957600080fd5b6020019150368190038213156113b257600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611ac857611ac8611a9e565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015611b525782840389528135601e19883603018112611b0a57600080fd5b870180356001600160401b03811115611b2257600080fd5b803603891315611b3157600080fd5b611b3e868289850161194c565b9a87019a9550505090840190600101611ae9565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015611ba0576001600160a01b03611b8b84611355565b16825260209283019290910190600101611b72565b5083810360208501528881526001600160fb1b03891115611bc057600080fd5b8860051b9150818a602083013781810191505060208101600081526020848303016040850152611bf181888a611acf565b6060850196909652505050608001529695505050505050565b60008219821115611c1d57611c1d611a9e565b500190565b60005b83811015611c3d578181015183820152602001611c25565b83811115611c4c576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611c8a816017850160208801611c22565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611cbb816028840160208801611c22565b01602801949350505050565b6020815260008251806020840152611ce6816040850160208701611c22565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b6000816000190483118215151615611d6e57611d6e611a9e565b500290565b600081611d8257611d82611a9e565b50600019019056fea26469706673582212207758f0ecbf76d35fbf58ef7c75e331ff7a49906cb91cf79e298e13041421a89364736f6c63430008090033", "devdoc": { "kind": "dev", "methods": { diff --git a/deployments/localhost/solcInputs/9bb96e2ab1a2d14e7d6f1254972fa73c.json b/deployments/localhost/solcInputs/9bb96e2ab1a2d14e7d6f1254972fa73c.json deleted file mode 100644 index 62d8d87..0000000 --- a/deployments/localhost/solcInputs/9bb96e2ab1a2d14e7d6f1254972fa73c.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/FundProject.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\nimport \"hardhat/console.sol\";\n\nerror FundProject__NotApporovedByDao();\nerror FundProject__UpkeepNeeded();\nerror FundProject__TransferFailed(uint256 _projectId);\nerror FundProject__NotEnoughPayment();\nerror FundProject__withdrawFund();\nerror FundProject__WithdrawTransferFailed();\nerror FundProject__EnteranceFeeNeeded();\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders; // projectId => funderAddress => funderBalance\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n mapping(address => bool) public _isEnteranceFeePaid;\n mapping(address => uint256[]) public investedProjects; // investor address => investedProjects\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n event enteranceFeePaid(address indexed _projectOwner);\n event projectGoesToFunding(uint256 indexed _projectId);\n event withdrawFundSuccessfully(\n address indexed __investor,\n uint256 indexed __projectId\n );\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n investedProjects[msg.sender] = [_projecID]; // need testing\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call it\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\n revert FundProject__EnteranceFeeNeeded();\n } else {\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n emit projectGoesToFunding(projectId);\n projectId++;\n }\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call it\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (bool upkeepNeeded, bytes memory performData)\n {\n for (uint i = 1; i <= projectId; i++) {\n bool isFunded = _isFunding[i];\n bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) >\n time[i];\n upkeepNeeded = (isFunded && timePassed);\n if (upkeepNeeded) {\n performData = abi.encodePacked(i);\n break;\n }\n }\n }\n\n function performUpkeep(bytes calldata performData) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n\n uint256 ProjectId = uint256(bytes32(performData));\n _isFunding[ProjectId] = false;\n _isApporovedByDao[ProjectId] = false;\n\n if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) {\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) /\n 100;\n projectFunds[ProjectId] = 0;\n (bool success, ) = (projectOwnerAddress[ProjectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[ProjectId]);\n }\n\n emit projectSuccessfullyFunded(ProjectId);\n } else {\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(ProjectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value < enteranceFee) {\n revert FundProject__NotEnoughPayment();\n } else {\n _isEnteranceFeePaid[msg.sender] = true;\n emit enteranceFeePaid(msg.sender);\n }\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n funders[_projectID][msg.sender] = 0;\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n emit withdrawFundSuccessfully(msg.sender, projectId);\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n\n function isEnteranceFeePaid(address account) public view returns (bool) {\n return _isEnteranceFeePaid[account];\n }\n\n function getFunderBalance(uint256 _projectID)\n public\n view\n returns (uint256)\n {\n return funders[_projectID][msg.sender];\n }\n\n function getInvestedProjects(address investor)\n public\n view\n returns (uint256[] memory)\n {\n return investedProjects[investor]; // need testing\n }\n\n function getDaoPercentage() public view returns (uint256) {\n return daoPercentage;\n }\n\n function getTimeleft(uint256 _projectID)\n public\n view\n returns (uint256 a, uint256 b)\n {\n a = block.timestamp - projectToTime[_projectID][time[_projectID]];\n b = time[_projectID];\n }\n}\n" - }, - "hardhat/console.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.22 <0.9.0;\n\nlibrary console {\n\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n\tfunction _sendLogPayload(bytes memory payload) private view {\n\t\tuint256 payloadLength = payload.length;\n\t\taddress consoleAddress = CONSOLE_ADDRESS;\n\t\tassembly {\n\t\t\tlet payloadStart := add(payload, 32)\n\t\t\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n\t\t}\n\t}\n\n\tfunction log() internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log()\"));\n\t}\n\n\tfunction logInt(int256 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(int256)\", p0));\n\t}\n\n\tfunction logUint(uint256 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n\t}\n\n\tfunction logString(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction logBool(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction logAddress(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction logBytes(bytes memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n\t}\n\n\tfunction logBytes1(bytes1 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n\t}\n\n\tfunction logBytes2(bytes2 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n\t}\n\n\tfunction logBytes3(bytes3 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n\t}\n\n\tfunction logBytes4(bytes4 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n\t}\n\n\tfunction logBytes5(bytes5 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n\t}\n\n\tfunction logBytes6(bytes6 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n\t}\n\n\tfunction logBytes7(bytes7 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n\t}\n\n\tfunction logBytes8(bytes8 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n\t}\n\n\tfunction logBytes9(bytes9 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n\t}\n\n\tfunction logBytes10(bytes10 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n\t}\n\n\tfunction logBytes11(bytes11 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n\t}\n\n\tfunction logBytes12(bytes12 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n\t}\n\n\tfunction logBytes13(bytes13 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n\t}\n\n\tfunction logBytes14(bytes14 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n\t}\n\n\tfunction logBytes15(bytes15 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n\t}\n\n\tfunction logBytes16(bytes16 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n\t}\n\n\tfunction logBytes17(bytes17 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n\t}\n\n\tfunction logBytes18(bytes18 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n\t}\n\n\tfunction logBytes19(bytes19 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n\t}\n\n\tfunction logBytes20(bytes20 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n\t}\n\n\tfunction logBytes21(bytes21 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n\t}\n\n\tfunction logBytes22(bytes22 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n\t}\n\n\tfunction logBytes23(bytes23 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n\t}\n\n\tfunction logBytes24(bytes24 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n\t}\n\n\tfunction logBytes25(bytes25 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n\t}\n\n\tfunction logBytes26(bytes26 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n\t}\n\n\tfunction logBytes27(bytes27 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n\t}\n\n\tfunction logBytes28(bytes28 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n\t}\n\n\tfunction logBytes29(bytes29 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n\t}\n\n\tfunction logBytes30(bytes30 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n\t}\n\n\tfunction logBytes31(bytes31 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n\t}\n\n\tfunction logBytes32(bytes32 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n\t}\n\n\tfunction log(uint256 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n\t}\n\n\tfunction log(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction log(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction log(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256)\", p0, p1));\n\t}\n\n\tfunction log(uint256 p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string)\", p0, p1));\n\t}\n\n\tfunction log(uint256 p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool)\", p0, p1));\n\t}\n\n\tfunction log(uint256 p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, uint256 p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, uint256 p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n\t}\n\n\tfunction log(address p0, uint256 p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256)\", p0, p1));\n\t}\n\n\tfunction log(address p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n\t}\n\n\tfunction log(address p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n\t}\n\n\tfunction log(address p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n}\n" - }, - "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" - }, - "@chainlink/contracts/src/v0.8/AutomationCompatible.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./AutomationBase.sol\";\nimport \"./interfaces/AutomationCompatibleInterface.sol\";\n\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" - }, - "@chainlink/contracts/src/v0.8/AutomationBase.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract AutomationBase {\n error OnlySimulatedBackend();\n\n /**\n * @notice method that allows it to be simulated via eth_call by checking that\n * the sender is the zero address.\n */\n function preventExecution() internal view {\n if (tx.origin != address(0)) {\n revert OnlySimulatedBackend();\n }\n }\n\n /**\n * @notice modifier that allows it to be simulated via eth_call by checking\n * that the sender is the zero address.\n */\n modifier cannotExecute() {\n preventExecution();\n _;\n }\n}\n" - }, - "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AutomationCompatibleInterface {\n /**\n * @notice method that is simulated by the keepers to see if any work actually\n * needs to be performed. This method does does not actually need to be\n * executable, and since it is only ever simulated it can consume lots of gas.\n * @dev To ensure that it is never called, you may want to add the\n * cannotExecute modifier from KeeperBase to your implementation of this\n * method.\n * @param checkData specified in the upkeep registration so it is always the\n * same for a registered upkeep. This can easily be broken down into specific\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\n * same contract and easily differentiated by the contract.\n * @return upkeepNeeded boolean to indicate whether the keeper should call\n * performUpkeep or not.\n * @return performData bytes that the keeper should call performUpkeep with, if\n * upkeep is needed. If you would like to encode data to decode later, try\n * `abi.encode`.\n */\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\n\n /**\n * @notice method that is actually executed by the keepers, via the registry.\n * The data returned by the checkUpkeep simulation will be passed into\n * this method to actually be executed.\n * @dev The input to this method should not be trusted, and the caller of the\n * method should not even be restricted to any single registry. Anyone should\n * be able call it, and the input should be validated, there is no guarantee\n * that the data passed in is the performData returned from checkUpkeep. This\n * could happen due to malicious keepers, racing keepers, or simply a state\n * change while the performUpkeep transaction is waiting for confirmation.\n * Always validate the data passed in.\n * @param performData is the data which was passed back from the checkData\n * simulation. If it is encoded, it can easily be decoded into other types by\n * calling `abi.decode`. This data should not be trusted, and should be\n * validated against the contract's current state.\n */\n function performUpkeep(bytes calldata performData) external;\n}\n" - }, - "contracts/GovernerContract.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\nimport \"./FundProject.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl,\n FundProject\n{\n error GovernerContract__NeedEnteranceFee();\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage,\n uint256 _enteranceFee,\n uint256 _daoPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n FundProject(_enteranceFee, _daoPercentage)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n if (!_isEnteranceFeePaid[msg.sender]) {\n revert GovernerContract__NeedEnteranceFee();\n }\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/Governor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" - }, - "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" - }, - "@openzeppelin/contracts/utils/Timers.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/math/SafeCast.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/utils/Strings.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 Strings {\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" - }, - "@openzeppelin/contracts/governance/TimelockController.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IGovernor.sol\";\n\n/**\n * @dev Extension of the {IGovernor} for timelock supporting modules.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernorTimelock is IGovernor {\n event ProposalQueued(uint256 proposalId, uint256 eta);\n\n function timelock() public view virtual returns (address);\n\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\n\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual returns (uint256 proposalId);\n}\n" - }, - "@openzeppelin/contracts/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" - }, - "@openzeppelin/contracts/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" - }, - "@openzeppelin/contracts/utils/Checkpoints.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Counters.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" - }, - "contracts/TimeLock.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/TimelockController.sol\";\n\ncontract TimeLock is TimelockController {\n // minDelay: How long you have to wait before executing\n // proposers is the list of addresses that can purpose\n // executers: Who can execute when proposal passes\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executers\n ) TimelockController(minDelay, proposers, executers) {}\n}\n" - }, - "contracts/GovernanceToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract GovernanceToken is ERC20Votes, Ownable {\n uint256 public s_initialSupply = 1000000e18;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/gas-report-ethMainnet.txt b/gas-report-ethMainnet.txt new file mode 100644 index 0000000..cb5a434 --- /dev/null +++ b/gas-report-ethMainnet.txt @@ -0,0 +1,47 @@ +·------------------------------------------|---------------------------|-------------|-----------------------------· +| Solc version: 0.8.9 · Optimizer enabled: true · Runs: 200 · Block limit: 30000000 gas │ +···········································|···························|·············|······························ +| Methods · 13 gwei/gas · 1199.59 usd/eth │ +·····················|·····················|·············|·············|·············|···············|·············· +| Contract · Method · Min · Max · Avg · # calls · usd (avg) │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · approve · - · - · 46303 · 4 · 0.72 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · burnToken · - · - · 103928 · 2 · 1.62 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · delegate · 95166 · 95178 · 95176 · 42 · 1.48 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · transfer · 90513 · 90537 · 90532 · 35 · 1.41 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · transferFrom · - · - · 93614 · 1 · 1.46 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · castVote · 69370 · 86514 · 82647 · 40 · 1.29 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · execute · - · - · 371792 · 20 · 5.80 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · fund · - · - · 112983 · 6 · 1.76 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · paySubmitFee · - · - · 71125 · 16 · 1.11 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · performUpkeep · 57432 · 69738 · 63530 · 5 · 0.99 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · propose · 101505 · 107150 · 102211 · 16 · 1.59 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · queue · - · - · 128842 · 14 · 2.01 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · transferOwnership · - · - · 28672 · 2 · 0.45 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · withdrawFund · - · - · 34620 · 2 · 0.54 │ +·····················|·····················|·············|·············|·············|···············|·············· +| TimeLock · grantRole · 51269 · 51509 · 51389 · 4 · 0.80 │ +·····················|·····················|·············|·············|·············|···············|·············· +| TimeLock · revokeRole · - · - · 27500 · 2 · 0.43 │ +·····················|·····················|·············|·············|·············|···············|·············· +| Deployments · · % of limit · │ +···········································|·············|·············|·············|···············|·············· +| GovernanceToken · - · - · 2040347 · 6.8 % · 31.82 │ +···········································|·············|·············|·············|···············|·············· +| GovernerContract · - · - · 4829697 · 16.1 % · 75.32 │ +···········································|·············|·············|·············|···············|·············· +| TimeLock · - · - · 1868529 · 6.2 % · 29.14 │ +·------------------------------------------|-------------|-------------|-------------|---------------|-------------· \ No newline at end of file diff --git a/gas-report-matic.txt b/gas-report-matic.txt new file mode 100644 index 0000000..5e42660 --- /dev/null +++ b/gas-report-matic.txt @@ -0,0 +1,47 @@ +·------------------------------------------|---------------------------|-------------|-----------------------------· +| Solc version: 0.8.9 · Optimizer enabled: true · Runs: 200 · Block limit: 30000000 gas │ +···········································|···························|·············|······························ +| Methods · 11 gwei/gas · 0.88 usd/matic │ +·····················|·····················|·············|·············|·············|···············|·············· +| Contract · Method · Min · Max · Avg · # calls · usd (avg) │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · approve · - · - · 46303 · 4 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · burnToken · - · - · 103928 · 2 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · delegate · 95166 · 95178 · 95176 · 42 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · transfer · 90513 · 90537 · 90532 · 35 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernanceToken · transferFrom · - · - · 93614 · 1 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · castVote · 69370 · 86514 · 82647 · 40 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · execute · - · - · 371792 · 20 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · fund · - · - · 112983 · 6 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · paySubmitFee · - · - · 71125 · 16 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · performUpkeep · 57432 · 69738 · 63530 · 5 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · propose · 101505 · 107150 · 102211 · 16 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · queue · - · - · 128842 · 14 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · transferOwnership · - · - · 28672 · 2 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| GovernerContract · withdrawFund · - · - · 34620 · 2 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| TimeLock · grantRole · 51269 · 51509 · 51389 · 4 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| TimeLock · revokeRole · - · - · 27500 · 2 · 0.00 │ +·····················|·····················|·············|·············|·············|···············|·············· +| Deployments · · % of limit · │ +···········································|·············|·············|·············|···············|·············· +| GovernanceToken · - · - · 2040347 · 6.8 % · 0.02 │ +···········································|·············|·············|·············|···············|·············· +| GovernerContract · - · - · 4829697 · 16.1 % · 0.05 │ +···········································|·············|·············|·············|···············|·············· +| TimeLock · - · - · 1868529 · 6.2 % · 0.02 │ +·------------------------------------------|-------------|-------------|-------------|---------------|-------------· \ No newline at end of file diff --git a/hardhat.config.js b/hardhat.config.js index 99012b6..4350cf1 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -6,6 +6,7 @@ require("hardhat-gas-reporter"); require("dotenv").config(); const GOERLI_RPC_URL = process.env.GOERLI_RPC_URL; +const MUMBAI_RPC_URL = process.env.MUMBAI_RPC_URL; const PRIVATE_KEY = process.env.PRIVATE_KEY; const PRIVATE_KEY_PROJECT_OWNER = process.env.PRIVATE_KEY_PROJECT_OWNER; const PRIVATE_KEY_PROJECT_ACCOUNT2 = process.env.PRIVATE_KEY_PROJECT_ACCOUNT2; @@ -36,6 +37,18 @@ module.exports = { chainId: 5, blockConfirmations: 6, }, + + mumbai: { + url: MUMBAI_RPC_URL, + accounts: [ + PRIVATE_KEY, + PRIVATE_KEY_PROJECT_OWNER, + PRIVATE_KEY_PROJECT_ACCOUNT2, + PRIVATE_KEY_PROJECT_ACCOUNT3, + ], + chainId: 80001, + blockConfirmations: 6, + }, }, solidity: { version: "0.8.9", @@ -62,7 +75,8 @@ module.exports = { currency: "USD", outputFile: "gas-report.txt", noColors: true, - // coinmarketcap: COINMARKETCAP_API_KEY, + coinmarketcap: COINMARKETCAP_API_KEY, + //token: "MATIC", }, mocha: { timeout: 400000, // 400 seconds diff --git a/helper-config.js b/helper-config.js index fb35e31..cb9da8d 100644 --- a/helper-config.js +++ b/helper-config.js @@ -6,6 +6,11 @@ const networkConfig = { enteranceFee: ethers.utils.parseEther("0.01"), daoPercentage: "10", }, + 80001: { + name: "mumbai", + enteranceFee: ethers.utils.parseEther("0.01"), + daoPercentage: "10", + }, 31337: { name: "hardhat", enteranceFee: ethers.utils.parseEther("0.01"), diff --git a/test/staging/dao.staging.test.js b/test/staging/dao.staging.test.js index 2f21c42..28317b8 100644 --- a/test/staging/dao.staging.test.js +++ b/test/staging/dao.staging.test.js @@ -56,7 +56,7 @@ developmentChains.includes(network.name) }); describe("submit a project", () => { it("submitting", async () => { - const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMAQ"; + const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVLLQ"; const projectOwnerConnectContract = await governor.connect( projectOwner ); @@ -90,21 +90,21 @@ developmentChains.includes(network.name) it("Make the vote!", async () => { const voter2ConnectTokenContract = governor.connect(voter2); let txCastVote = await voter2ConnectTokenContract.castVote( - "14094970548360658432981678952890731821083177440208283154284427752347616310142", + "56356127963133137284153767860446917474770664449431303765214938038603641261463", 1 ); await txCastVote.wait(1); const voter3ConnectTokenContract = governor.connect(voter3); txCastVote = await voter3ConnectTokenContract.castVote( - "14094970548360658432981678952890731821083177440208283154284427752347616310142", + "56356127963133137284153767860446917474770664449431303765214938038603641261463", 0 ); await txCastVote.wait(1); const deployerConnectTokenContract = governor.connect(deployer); txCastVote = await deployerConnectTokenContract.castVote( - "14094970548360658432981678952890731821083177440208283154284427752347616310142", + "56356127963133137284153767860446917474770664449431303765214938038603641261463", 1 ); await txCastVote.wait(1); @@ -116,7 +116,7 @@ developmentChains.includes(network.name) projectOwnerIndex = await projectOwnerConnectContract.getCurrentProjectId(); - const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVMAQ"; + const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVLLQ"; const descriptionHash = ethers.utils.keccak256( ethers.utils.toUtf8Bytes(args) ); @@ -151,7 +151,7 @@ developmentChains.includes(network.name) }); it("Lets fund!", async () => { - const invest = ethers.utils.parseUnits("0.1", "ether"); + const invest = ethers.utils.parseUnits("0.05", "ether"); const investorConnectContract = await governor.connect(deployer); console.log( ` investorBalanceBefore = ${ethers.utils @@ -163,7 +163,7 @@ developmentChains.includes(network.name) .toString()}` ); - const invTx = await investorConnectContract.fund(2, { + const invTx = await investorConnectContract.fund(1, { value: invest, }); await invTx.wait(1); @@ -179,7 +179,7 @@ developmentChains.includes(network.name) }); }); - /* describe("setup other accounts onlyones", () => { + /* describe("setup other accounts onlyones", () => { it("transfer and delegate", async () => { gtToken = await ethers.getContract("GovernanceToken", deployer); let tx1 = await gtToken.transfer( diff --git a/test/unit/dao.unit.test.js b/test/unit/dao.unit.test.js index 54a9a51..6122528 100644 --- a/test/unit/dao.unit.test.js +++ b/test/unit/dao.unit.test.js @@ -495,11 +495,11 @@ const fs = require("fs"); }); it("Name is correct", async () => { const tokenName = (await gtToken.name()).toString(); - assert.equal(tokenName, "GovernanceToken"); + assert.equal(tokenName, "QuickfundDAOToken"); }); it("Symbol is correct", async () => { const tokenSymbol = (await gtToken.symbol()).toString(); - assert.equal(tokenSymbol, "GT"); + assert.equal(tokenSymbol, "QFD"); }); }); describe("tranfers", async () => { From 505a2f958cd6e03325158c2ca27e2aaca23157a9 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 18 Nov 2022 00:22:42 +0300 Subject: [PATCH 26/28] deployed mumbai testnet v2 --- .gitignore | 4 ++- helper-config.js | 2 +- scripts/del.js | 52 -------------------------------- test/staging/dao.staging.test.js | 45 +++++++++++---------------- 4 files changed, 22 insertions(+), 81 deletions(-) delete mode 100644 scripts/del.js diff --git a/.gitignore b/.gitignore index 0cba3b1..51ada2e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ submit.js 05-deploy-fundProject.js readOnlyMe.md coverage -deployments \ No newline at end of file +deployments +queue-and-execute.js +propose.js \ No newline at end of file diff --git a/helper-config.js b/helper-config.js index cb9da8d..f1e5af0 100644 --- a/helper-config.js +++ b/helper-config.js @@ -40,7 +40,7 @@ const s_video = const s_fundRaisingGoalAmount = 10000; // in wei const s_roadMap = "Just click the video"; const s_otherSources = "You dont need anything else"; -const s_fundingTime = 120; // 10 sec. +const s_fundingTime = 86400; // 10 sec. module.exports = { developmentChains, diff --git a/scripts/del.js b/scripts/del.js deleted file mode 100644 index fbc5608..0000000 --- a/scripts/del.js +++ /dev/null @@ -1,52 +0,0 @@ -const { ethers, network } = require("hardhat"); -const { - developmentChains, - VOTING_PERIOD, - s_fundingTime, -} = require("../helper-config"); -const { moveBlocks } = require("../utils/move-blocks"); -const { moveTime } = require("../utils/move-time"); - -async function vote() { - const provider = hre.ethers.provider; - const governor = await ethers.getContract("GovernerContract"); - const projectId = await governor._getProjectId( - "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu" - ); - const invest = ethers.utils.parseUnits("1", "ether"); - const investor = "0x90F79bf6EB2c4f870365E785982E1f101E93b906"; // node account3 - const account2node = "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"; - - console.log((await governor.getFunderBalance(investor)).toString()); - - await ethers.getContract("GovernerContract", investor); - - const invTx = await governor.fund(projectId, { value: invest }); - await invTx.wait(1); - console.log((await governor.getFunderBalance(investor)).toString()); - console.log((await governor._getBalanceOfProject(projectId)).toString()); - await moveTime(s_fundingTime + 1); - await moveBlocks(1); - - const tx = await governor.performUpkeep( - ethers.utils.hexZeroPad(ethers.utils.hexlify(projectId), 32) - ); - - console.log( - ` Project status: ${await governor._getProjectStatus(projectId)}` - ); - console.log( - `Balance of project: ${( - await governor._getBalanceOfProject(projectId) - ).toString()}` - ); - - console.log((await provider.getBalance(account2node)).toString()); -} - -vote() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/test/staging/dao.staging.test.js b/test/staging/dao.staging.test.js index 28317b8..2475275 100644 --- a/test/staging/dao.staging.test.js +++ b/test/staging/dao.staging.test.js @@ -38,35 +38,20 @@ developmentChains.includes(network.name) }); describe("make a propose to fund a project", () => { it("works with live chainlink keepers get to proposal to fund the project", async () => { - await new Promise(async (resolve, reject) => { - // listen for WinnerPicked event - governor.once("projectGoesToFunding", async () => { - console.log("projectGoesToFunding event fired!"); - try { - // put assert here - - resolve(); - } catch (error) { - console.log(error); - reject(error); - } - }); - }); - }); - }); - describe("submit a project", () => { - it("submitting", async () => { - const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVLLQ"; + console.log("Submitting..."); + const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq82qAAALLW"; + const projectOwnerConnectContract = await governor.connect( projectOwner ); - + console.log("Paying submit fee..."); const enteranceFee = await projectOwnerConnectContract.getEnteranceFee(); const payFee = await projectOwnerConnectContract.paySubmitFee({ value: enteranceFee, }); await payFee.wait(1); + console.log("Submit fee paid!"); projectOwnerIndex = await projectOwnerConnectContract.getCurrentProjectId(); @@ -75,7 +60,7 @@ developmentChains.includes(network.name) FUNC_FUND, [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwnerIndex] ); - + console.log("Proposing..."); const proposalTx = await projectOwnerConnectContract.propose( [governor.address], [0], @@ -84,27 +69,32 @@ developmentChains.includes(network.name) ); const proposeReceipt = await proposalTx.wait(1); const proposalId = proposeReceipt.events[0].args.proposalId; - console.log(proposalId.toString()); - }); + console.log("Proposed!"); + console.log(`Propoasal Id: ${proposalId.toString()}`); + const proposalDeadLine = await governor.proposalDeadline(proposalId); + console.log(`proposalDeadLine Id: ${proposalDeadLine.toString()}`); + }); + }); + describe("make vote,queue and execute", () => { it("Make the vote!", async () => { const voter2ConnectTokenContract = governor.connect(voter2); let txCastVote = await voter2ConnectTokenContract.castVote( - "56356127963133137284153767860446917474770664449431303765214938038603641261463", + "25642064417695780697194357454208262799831375866508686635461989984084662075539", 1 ); await txCastVote.wait(1); const voter3ConnectTokenContract = governor.connect(voter3); txCastVote = await voter3ConnectTokenContract.castVote( - "56356127963133137284153767860446917474770664449431303765214938038603641261463", + "25642064417695780697194357454208262799831375866508686635461989984084662075539", 0 ); await txCastVote.wait(1); const deployerConnectTokenContract = governor.connect(deployer); txCastVote = await deployerConnectTokenContract.castVote( - "56356127963133137284153767860446917474770664449431303765214938038603641261463", + "25642064417695780697194357454208262799831375866508686635461989984084662075539", 1 ); await txCastVote.wait(1); @@ -116,7 +106,7 @@ developmentChains.includes(network.name) projectOwnerIndex = await projectOwnerConnectContract.getCurrentProjectId(); - const args = "QmeqcGRJSAUJecnyHNUbxg53YPErLodFnvuNq92qAhVLLQ"; + const args = "QmWecuZF73W4Qm7D7hvR5fWU83s9kn9QjWfmGd9tuDevLn"; const descriptionHash = ethers.utils.keccak256( ethers.utils.toUtf8Bytes(args) ); @@ -124,6 +114,7 @@ developmentChains.includes(network.name) FUNC_FUND, [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwnerIndex] ); + governor = await ethers.getContract("GovernerContract", deployer); console.log("Queueing..."); const queueTx = await governor.queue( From fd54f69841ff4e4af78c2451f6270f0c20559b55 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 18 Nov 2022 03:47:56 +0300 Subject: [PATCH 27/28] deployed mumbai testnet v2 fix bugs --- contracts/FundProject.sol | 4 +- coverage.json | 2 +- coverage/contracts/FundProject.sol.html | 76 ++--- coverage/contracts/GovernanceToken.sol.html | 30 +- coverage/contracts/GovernerContract.sol.html | 20 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 42 +-- coverage/coverage-final.json | 6 +- coverage/index.html | 28 +- .../contracts/FundProject.sol.html | 76 ++--- .../contracts/GovernanceToken.sol.html | 30 +- .../contracts/GovernerContract.sol.html | 20 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 42 +-- coverage/lcov-report/index.html | 28 +- coverage/lcov.info | 138 +++++----- helper-config.js | 4 +- test/unit/dao.unit.test.js | 30 +- test/unit/fundContract.unit2.test.js | 259 ++++++++++++++++++ 19 files changed, 562 insertions(+), 277 deletions(-) create mode 100644 test/unit/fundContract.unit2.test.js diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index e2b59d9..5db6647 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -107,8 +107,8 @@ contract FundProject is Ownable, AutomationCompatibleInterface { function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { // only dao can call it _isApporovedByDao[_projecID] = false; - _isFunding[projectId] = false; - _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; + _isFunding[_projecID] = false; + _ProjectFundingStatus[_projecID] = ProjectFundingStatus.CANCELED; } function checkUpkeep( diff --git a/coverage.json b/coverage.json index 2743cfc..8821caa 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/FundProject.sol":{"l":{"56":3,"57":0,"58":3,"62":3,"63":3,"64":3,"72":3,"73":3,"74":3,"84":7,"89":0,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"97":7,"100":7,"101":7,"102":7,"103":7,"109":0,"110":0,"111":0,"122":12,"123":14,"124":6,"127":6,"128":6,"129":4,"130":4,"137":4,"138":4,"139":1,"142":3,"143":3,"144":3,"146":3,"147":1,"148":1,"150":1,"151":1,"154":1,"155":0,"158":1,"160":2,"161":2,"166":8,"167":0,"169":8,"170":8,"171":8,"176":2,"177":1,"178":1,"179":1,"182":1,"183":0,"185":1,"187":1,"196":4,"204":1,"212":7,"220":1,"228":0,"232":3,"240":3,"244":9,"248":0,"256":2,"264":0,"268":1,"276":0,"277":0,"281":9},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":6,"25":6,"26":6,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":8,"46":2,"47":1,"48":1,"49":1,"50":1,"51":1,"52":4,"53":1,"54":7,"55":1,"56":0,"57":3,"58":3,"59":9,"60":0,"61":2,"62":0,"63":1,"64":0,"65":0,"66":9},"b":{"1":[0,3],"2":[0,7],"3":[6,8],"4":[4,2],"5":[1,3],"6":[1,2],"7":[0,1],"8":[0,8],"9":[1,1],"10":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0,"23":9},"fnMap":{"1":{"name":"isApporovedByDao","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"2":{"name":"constructor","line":61,"loc":{"start":{"line":61,"column":4},"end":{"line":65,"column":4}}},"3":{"name":"fund","line":70,"loc":{"start":{"line":67,"column":4},"end":{"line":75,"column":4}}},"4":{"name":"apporoveFundingByDao","line":82,"loc":{"start":{"line":77,"column":4},"end":{"line":105,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":112,"column":4}}},"6":{"name":"checkUpkeep","line":114,"loc":{"start":{"line":114,"column":4},"end":{"line":134,"column":4}}},"7":{"name":"performUpkeep","line":136,"loc":{"start":{"line":136,"column":4},"end":{"line":163,"column":4}}},"8":{"name":"paySubmitFee","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":173,"column":4}}},"9":{"name":"withdrawFund","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":189,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"11":{"name":"_getHashOfProjectData","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"12":{"name":"_getProjectId","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"13":{"name":"_getBalanceOfProject","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":221,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":223,"loc":{"start":{"line":223,"column":4},"end":{"line":229,"column":4}}},"15":{"name":"is_funding","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"16":{"name":"_getProjectStatus","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"17":{"name":"getEnteranceFee","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":245,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":247,"loc":{"start":{"line":247,"column":4},"end":{"line":249,"column":4}}},"19":{"name":"getFunderBalance","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":257,"column":4}}},"20":{"name":"getInvestedProjects","line":259,"loc":{"start":{"line":259,"column":4},"end":{"line":265,"column":4}}},"21":{"name":"getDaoPercentage","line":267,"loc":{"start":{"line":267,"column":4},"end":{"line":269,"column":4}}},"22":{"name":"getTimeleft","line":271,"loc":{"start":{"line":271,"column":4},"end":{"line":278,"column":4}}},"23":{"name":"getCurrentProjectId","line":280,"loc":{"start":{"line":280,"column":4},"end":{"line":282,"column":4}}}},"statementMap":{"1":{"start":{"line":56,"column":8},"end":{"line":56,"column":2247}},"2":{"start":{"line":62,"column":8},"end":{"line":62,"column":38}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":37}},"4":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"5":{"start":{"line":72,"column":8},"end":{"line":72,"column":50}},"6":{"start":{"line":73,"column":8},"end":{"line":73,"column":43}},"7":{"start":{"line":74,"column":8},"end":{"line":74,"column":49}},"8":{"start":{"line":84,"column":8},"end":{"line":84,"column":3021}},"9":{"start":{"line":91,"column":12},"end":{"line":91,"column":60}},"10":{"start":{"line":92,"column":12},"end":{"line":92,"column":77}},"11":{"start":{"line":93,"column":12},"end":{"line":93,"column":34}},"12":{"start":{"line":94,"column":12},"end":{"line":94,"column":67}},"13":{"start":{"line":95,"column":12},"end":{"line":95,"column":49}},"14":{"start":{"line":96,"column":12},"end":{"line":96,"column":42}},"15":{"start":{"line":97,"column":12},"end":{"line":97,"column":3588}},"16":{"start":{"line":100,"column":12},"end":{"line":100,"column":46}},"17":{"start":{"line":101,"column":12},"end":{"line":101,"column":39}},"18":{"start":{"line":102,"column":12},"end":{"line":102,"column":48}},"19":{"start":{"line":109,"column":8},"end":{"line":109,"column":43}},"20":{"start":{"line":110,"column":8},"end":{"line":110,"column":36}},"21":{"start":{"line":111,"column":8},"end":{"line":111,"column":71}},"22":{"start":{"line":122,"column":8},"end":{"line":122,"column":4352}},"23":{"start":{"line":123,"column":12},"end":{"line":123,"column":4441}},"24":{"start":{"line":124,"column":16},"end":{"line":124,"column":4515}},"25":{"start":{"line":127,"column":16},"end":{"line":127,"column":42}},"26":{"start":{"line":128,"column":16},"end":{"line":128,"column":4704}},"27":{"start":{"line":129,"column":20},"end":{"line":129,"column":63}},"28":{"start":{"line":137,"column":8},"end":{"line":137,"column":47}},"29":{"start":{"line":138,"column":8},"end":{"line":138,"column":4990}},"30":{"start":{"line":142,"column":8},"end":{"line":142,"column":57}},"31":{"start":{"line":143,"column":8},"end":{"line":143,"column":36}},"32":{"start":{"line":144,"column":8},"end":{"line":144,"column":43}},"33":{"start":{"line":146,"column":8},"end":{"line":146,"column":5223}},"34":{"start":{"line":147,"column":12},"end":{"line":147,"column":74}},"35":{"start":{"line":148,"column":12},"end":{"line":148,"column":5417}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":38}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":5538}},"38":{"start":{"line":154,"column":12},"end":{"line":154,"column":5657}},"39":{"start":{"line":158,"column":12},"end":{"line":158,"column":53}},"40":{"start":{"line":160,"column":12},"end":{"line":160,"column":73}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":48}},"42":{"start":{"line":166,"column":8},"end":{"line":166,"column":6029}},"43":{"start":{"line":169,"column":12},"end":{"line":169,"column":49}},"44":{"start":{"line":170,"column":12},"end":{"line":170,"column":59}},"45":{"start":{"line":171,"column":12},"end":{"line":171,"column":45}},"46":{"start":{"line":176,"column":8},"end":{"line":176,"column":6371}},"47":{"start":{"line":177,"column":12},"end":{"line":177,"column":64}},"48":{"start":{"line":178,"column":12},"end":{"line":178,"column":46}},"49":{"start":{"line":179,"column":12},"end":{"line":179,"column":6575}},"50":{"start":{"line":182,"column":12},"end":{"line":182,"column":6686}},"51":{"start":{"line":185,"column":12},"end":{"line":185,"column":64}},"52":{"start":{"line":196,"column":8},"end":{"line":196,"column":43}},"53":{"start":{"line":204,"column":8},"end":{"line":204,"column":34}},"54":{"start":{"line":212,"column":8},"end":{"line":212,"column":41}},"55":{"start":{"line":220,"column":8},"end":{"line":220,"column":38}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":50}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":37}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":48}},"59":{"start":{"line":244,"column":8},"end":{"line":244,"column":27}},"60":{"start":{"line":248,"column":8},"end":{"line":248,"column":43}},"61":{"start":{"line":256,"column":8},"end":{"line":256,"column":46}},"62":{"start":{"line":264,"column":8},"end":{"line":264,"column":41}},"63":{"start":{"line":268,"column":8},"end":{"line":268,"column":28}},"64":{"start":{"line":276,"column":8},"end":{"line":276,"column":72}},"65":{"start":{"line":277,"column":8},"end":{"line":277,"column":27}},"66":{"start":{"line":281,"column":8},"end":{"line":281,"column":24}}},"branchMap":{"1":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":8}},{"start":{"line":56,"column":8},"end":{"line":56,"column":8}}]},"2":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":8}},{"start":{"line":84,"column":8},"end":{"line":84,"column":8}}]},"3":{"line":123,"type":"if","locations":[{"start":{"line":123,"column":12},"end":{"line":123,"column":12}},{"start":{"line":123,"column":12},"end":{"line":123,"column":12}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":16},"end":{"line":128,"column":16}},{"start":{"line":128,"column":16},"end":{"line":128,"column":16}}]},"5":{"line":138,"type":"if","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":8}},{"start":{"line":138,"column":8},"end":{"line":138,"column":8}}]},"6":{"line":146,"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":146,"column":8}},{"start":{"line":146,"column":8},"end":{"line":146,"column":8}}]},"7":{"line":154,"type":"if","locations":[{"start":{"line":154,"column":12},"end":{"line":154,"column":12}},{"start":{"line":154,"column":12},"end":{"line":154,"column":12}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":176,"type":"if","locations":[{"start":{"line":176,"column":8},"end":{"line":176,"column":8}},{"start":{"line":176,"column":8},"end":{"line":176,"column":8}}]},"10":{"line":182,"type":"if","locations":[{"start":{"line":182,"column":12},"end":{"line":182,"column":12}},{"start":{"line":182,"column":12},"end":{"line":182,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":10,"89":2,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":10,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[2,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":10,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/FundProject.sol":{"l":{"56":3,"57":0,"58":3,"62":3,"63":3,"64":3,"72":3,"73":3,"74":3,"84":8,"89":0,"91":8,"92":8,"93":8,"94":8,"95":8,"96":8,"97":8,"100":8,"101":8,"102":8,"103":8,"109":1,"110":1,"111":1,"122":13,"123":15,"124":6,"127":6,"128":6,"129":4,"130":4,"137":4,"138":4,"139":1,"142":3,"143":3,"144":3,"146":3,"147":1,"148":1,"150":1,"151":1,"154":1,"155":0,"158":1,"160":2,"161":2,"166":10,"167":0,"169":10,"170":10,"171":10,"176":2,"177":1,"178":1,"179":1,"182":1,"183":0,"185":1,"187":1,"196":5,"204":1,"212":8,"220":1,"228":0,"232":4,"240":4,"244":11,"248":0,"256":2,"264":0,"268":1,"276":0,"277":0,"281":10},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":8,"9":8,"10":8,"11":8,"12":8,"13":8,"14":8,"15":8,"16":8,"17":8,"18":8,"19":1,"20":1,"21":1,"22":13,"23":15,"24":6,"25":6,"26":6,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":10,"43":10,"44":10,"45":10,"46":2,"47":1,"48":1,"49":1,"50":1,"51":1,"52":5,"53":1,"54":8,"55":1,"56":0,"57":4,"58":4,"59":11,"60":0,"61":2,"62":0,"63":1,"64":0,"65":0,"66":10},"b":{"1":[0,3],"2":[0,8],"3":[6,9],"4":[4,2],"5":[1,3],"6":[1,2],"7":[0,1],"8":[0,10],"9":[1,1],"10":[0,1]},"f":{"1":3,"2":3,"3":3,"4":8,"5":1,"6":13,"7":4,"8":10,"9":2,"10":5,"11":1,"12":8,"13":1,"14":0,"15":4,"16":4,"17":11,"18":0,"19":2,"20":0,"21":1,"22":0,"23":10},"fnMap":{"1":{"name":"isApporovedByDao","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"2":{"name":"constructor","line":61,"loc":{"start":{"line":61,"column":4},"end":{"line":65,"column":4}}},"3":{"name":"fund","line":70,"loc":{"start":{"line":67,"column":4},"end":{"line":75,"column":4}}},"4":{"name":"apporoveFundingByDao","line":82,"loc":{"start":{"line":77,"column":4},"end":{"line":105,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":112,"column":4}}},"6":{"name":"checkUpkeep","line":114,"loc":{"start":{"line":114,"column":4},"end":{"line":134,"column":4}}},"7":{"name":"performUpkeep","line":136,"loc":{"start":{"line":136,"column":4},"end":{"line":163,"column":4}}},"8":{"name":"paySubmitFee","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":173,"column":4}}},"9":{"name":"withdrawFund","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":189,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"11":{"name":"_getHashOfProjectData","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"12":{"name":"_getProjectId","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"13":{"name":"_getBalanceOfProject","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":221,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":223,"loc":{"start":{"line":223,"column":4},"end":{"line":229,"column":4}}},"15":{"name":"is_funding","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"16":{"name":"_getProjectStatus","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"17":{"name":"getEnteranceFee","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":245,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":247,"loc":{"start":{"line":247,"column":4},"end":{"line":249,"column":4}}},"19":{"name":"getFunderBalance","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":257,"column":4}}},"20":{"name":"getInvestedProjects","line":259,"loc":{"start":{"line":259,"column":4},"end":{"line":265,"column":4}}},"21":{"name":"getDaoPercentage","line":267,"loc":{"start":{"line":267,"column":4},"end":{"line":269,"column":4}}},"22":{"name":"getTimeleft","line":271,"loc":{"start":{"line":271,"column":4},"end":{"line":278,"column":4}}},"23":{"name":"getCurrentProjectId","line":280,"loc":{"start":{"line":280,"column":4},"end":{"line":282,"column":4}}}},"statementMap":{"1":{"start":{"line":56,"column":8},"end":{"line":56,"column":2247}},"2":{"start":{"line":62,"column":8},"end":{"line":62,"column":38}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":37}},"4":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"5":{"start":{"line":72,"column":8},"end":{"line":72,"column":50}},"6":{"start":{"line":73,"column":8},"end":{"line":73,"column":43}},"7":{"start":{"line":74,"column":8},"end":{"line":74,"column":49}},"8":{"start":{"line":84,"column":8},"end":{"line":84,"column":3021}},"9":{"start":{"line":91,"column":12},"end":{"line":91,"column":60}},"10":{"start":{"line":92,"column":12},"end":{"line":92,"column":77}},"11":{"start":{"line":93,"column":12},"end":{"line":93,"column":34}},"12":{"start":{"line":94,"column":12},"end":{"line":94,"column":67}},"13":{"start":{"line":95,"column":12},"end":{"line":95,"column":49}},"14":{"start":{"line":96,"column":12},"end":{"line":96,"column":42}},"15":{"start":{"line":97,"column":12},"end":{"line":97,"column":3588}},"16":{"start":{"line":100,"column":12},"end":{"line":100,"column":46}},"17":{"start":{"line":101,"column":12},"end":{"line":101,"column":39}},"18":{"start":{"line":102,"column":12},"end":{"line":102,"column":48}},"19":{"start":{"line":109,"column":8},"end":{"line":109,"column":43}},"20":{"start":{"line":110,"column":8},"end":{"line":110,"column":36}},"21":{"start":{"line":111,"column":8},"end":{"line":111,"column":71}},"22":{"start":{"line":122,"column":8},"end":{"line":122,"column":4352}},"23":{"start":{"line":123,"column":12},"end":{"line":123,"column":4441}},"24":{"start":{"line":124,"column":16},"end":{"line":124,"column":4515}},"25":{"start":{"line":127,"column":16},"end":{"line":127,"column":42}},"26":{"start":{"line":128,"column":16},"end":{"line":128,"column":4704}},"27":{"start":{"line":129,"column":20},"end":{"line":129,"column":63}},"28":{"start":{"line":137,"column":8},"end":{"line":137,"column":47}},"29":{"start":{"line":138,"column":8},"end":{"line":138,"column":4990}},"30":{"start":{"line":142,"column":8},"end":{"line":142,"column":57}},"31":{"start":{"line":143,"column":8},"end":{"line":143,"column":36}},"32":{"start":{"line":144,"column":8},"end":{"line":144,"column":43}},"33":{"start":{"line":146,"column":8},"end":{"line":146,"column":5223}},"34":{"start":{"line":147,"column":12},"end":{"line":147,"column":74}},"35":{"start":{"line":148,"column":12},"end":{"line":148,"column":5417}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":38}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":5538}},"38":{"start":{"line":154,"column":12},"end":{"line":154,"column":5657}},"39":{"start":{"line":158,"column":12},"end":{"line":158,"column":53}},"40":{"start":{"line":160,"column":12},"end":{"line":160,"column":73}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":48}},"42":{"start":{"line":166,"column":8},"end":{"line":166,"column":6029}},"43":{"start":{"line":169,"column":12},"end":{"line":169,"column":49}},"44":{"start":{"line":170,"column":12},"end":{"line":170,"column":59}},"45":{"start":{"line":171,"column":12},"end":{"line":171,"column":45}},"46":{"start":{"line":176,"column":8},"end":{"line":176,"column":6371}},"47":{"start":{"line":177,"column":12},"end":{"line":177,"column":64}},"48":{"start":{"line":178,"column":12},"end":{"line":178,"column":46}},"49":{"start":{"line":179,"column":12},"end":{"line":179,"column":6575}},"50":{"start":{"line":182,"column":12},"end":{"line":182,"column":6686}},"51":{"start":{"line":185,"column":12},"end":{"line":185,"column":64}},"52":{"start":{"line":196,"column":8},"end":{"line":196,"column":43}},"53":{"start":{"line":204,"column":8},"end":{"line":204,"column":34}},"54":{"start":{"line":212,"column":8},"end":{"line":212,"column":41}},"55":{"start":{"line":220,"column":8},"end":{"line":220,"column":38}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":50}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":37}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":48}},"59":{"start":{"line":244,"column":8},"end":{"line":244,"column":27}},"60":{"start":{"line":248,"column":8},"end":{"line":248,"column":43}},"61":{"start":{"line":256,"column":8},"end":{"line":256,"column":46}},"62":{"start":{"line":264,"column":8},"end":{"line":264,"column":41}},"63":{"start":{"line":268,"column":8},"end":{"line":268,"column":28}},"64":{"start":{"line":276,"column":8},"end":{"line":276,"column":72}},"65":{"start":{"line":277,"column":8},"end":{"line":277,"column":27}},"66":{"start":{"line":281,"column":8},"end":{"line":281,"column":24}}},"branchMap":{"1":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":8}},{"start":{"line":56,"column":8},"end":{"line":56,"column":8}}]},"2":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":8}},{"start":{"line":84,"column":8},"end":{"line":84,"column":8}}]},"3":{"line":123,"type":"if","locations":[{"start":{"line":123,"column":12},"end":{"line":123,"column":12}},{"start":{"line":123,"column":12},"end":{"line":123,"column":12}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":16},"end":{"line":128,"column":16}},{"start":{"line":128,"column":16},"end":{"line":128,"column":16}}]},"5":{"line":138,"type":"if","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":8}},{"start":{"line":138,"column":8},"end":{"line":138,"column":8}}]},"6":{"line":146,"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":146,"column":8}},{"start":{"line":146,"column":8},"end":{"line":146,"column":8}}]},"7":{"line":154,"type":"if","locations":[{"start":{"line":154,"column":12},"end":{"line":154,"column":12}},{"start":{"line":154,"column":12},"end":{"line":154,"column":12}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":176,"type":"if","locations":[{"start":{"line":176,"column":8},"end":{"line":176,"column":8}},{"start":{"line":176,"column":8},"end":{"line":176,"column":8}}]},"10":{"line":182,"type":"if","locations":[{"start":{"line":182,"column":12},"end":{"line":182,"column":12}},{"start":{"line":182,"column":12},"end":{"line":182,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":35,"29":35,"37":4,"41":2,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":35,"3":35,"4":4,"5":2,"6":1,"7":1},"b":{},"f":{"1":3,"2":35,"3":4,"4":2,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":10,"61":10,"70":30,"79":62,"88":12,"89":2,"91":10,"100":10,"110":9,"119":0,"128":18,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":10,"2":10,"3":30,"4":62,"5":12,"6":10,"7":10,"8":9,"9":0,"10":18,"11":0},"b":{"1":[2,10]},"f":{"1":3,"2":10,"3":10,"4":30,"5":62,"6":12,"7":10,"8":9,"9":0,"10":18,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html index 8611122..7563aa7 100644 --- a/coverage/contracts/FundProject.sol.html +++ b/coverage/contracts/FundProject.sol.html @@ -20,9 +20,9 @@

- 87.88% + 92.42% Statements - 58/66 + 61/66
75% @@ -30,14 +30,14 @@

15/20

- 78.26% + 82.61% Functions - 18/23 + 19/23
- 82.89% + 86.84% Lines - 63/76 + 66/76
@@ -409,34 +409,34 @@

      - +             - - - - - - - + + + + + + +     - - - - + + + +           -  -  -  + + +       @@ -447,8 +447,8 @@

      -12× -14× +13× +15×     @@ -491,12 +491,12 @@

      - +10×     - - - +10× +10× +10×       @@ -521,7 +521,7 @@

      - +       @@ -537,7 +537,7 @@

      - +       @@ -557,7 +557,7 @@

      - +       @@ -565,11 +565,11 @@

      - +       - +11×       @@ -606,7 +606,7 @@

      - +10×      

- - - + + + - - - - + + + + - - - + + + - - - - + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index add3a09..ede95c3 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,5 @@ { -"contracts/FundProject.sol":{"l":{"56":3,"57":0,"58":3,"62":3,"63":3,"64":3,"72":3,"73":3,"74":3,"84":7,"89":0,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"97":7,"100":7,"101":7,"102":7,"103":7,"109":0,"110":0,"111":0,"122":12,"123":14,"124":6,"127":6,"128":6,"129":4,"130":4,"137":4,"138":4,"139":1,"142":3,"143":3,"144":3,"146":3,"147":1,"148":1,"150":1,"151":1,"154":1,"155":0,"158":1,"160":2,"161":2,"166":8,"167":0,"169":8,"170":8,"171":8,"176":2,"177":1,"178":1,"179":1,"182":1,"183":0,"185":1,"187":1,"196":4,"204":1,"212":7,"220":1,"228":0,"232":3,"240":3,"244":9,"248":0,"256":2,"264":0,"268":1,"276":0,"277":0,"281":9},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":6,"25":6,"26":6,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":8,"46":2,"47":1,"48":1,"49":1,"50":1,"51":1,"52":4,"53":1,"54":7,"55":1,"56":0,"57":3,"58":3,"59":9,"60":0,"61":2,"62":0,"63":1,"64":0,"65":0,"66":9},"b":{"1":[0,3],"2":[0,7],"3":[6,8],"4":[4,2],"5":[1,3],"6":[1,2],"7":[0,1],"8":[0,8],"9":[1,1],"10":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0,"23":9},"fnMap":{"1":{"name":"isApporovedByDao","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"2":{"name":"constructor","line":61,"loc":{"start":{"line":61,"column":4},"end":{"line":65,"column":4}}},"3":{"name":"fund","line":70,"loc":{"start":{"line":67,"column":4},"end":{"line":75,"column":4}}},"4":{"name":"apporoveFundingByDao","line":82,"loc":{"start":{"line":77,"column":4},"end":{"line":105,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":112,"column":4}}},"6":{"name":"checkUpkeep","line":114,"loc":{"start":{"line":114,"column":4},"end":{"line":134,"column":4}}},"7":{"name":"performUpkeep","line":136,"loc":{"start":{"line":136,"column":4},"end":{"line":163,"column":4}}},"8":{"name":"paySubmitFee","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":173,"column":4}}},"9":{"name":"withdrawFund","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":189,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"11":{"name":"_getHashOfProjectData","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"12":{"name":"_getProjectId","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"13":{"name":"_getBalanceOfProject","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":221,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":223,"loc":{"start":{"line":223,"column":4},"end":{"line":229,"column":4}}},"15":{"name":"is_funding","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"16":{"name":"_getProjectStatus","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"17":{"name":"getEnteranceFee","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":245,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":247,"loc":{"start":{"line":247,"column":4},"end":{"line":249,"column":4}}},"19":{"name":"getFunderBalance","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":257,"column":4}}},"20":{"name":"getInvestedProjects","line":259,"loc":{"start":{"line":259,"column":4},"end":{"line":265,"column":4}}},"21":{"name":"getDaoPercentage","line":267,"loc":{"start":{"line":267,"column":4},"end":{"line":269,"column":4}}},"22":{"name":"getTimeleft","line":271,"loc":{"start":{"line":271,"column":4},"end":{"line":278,"column":4}}},"23":{"name":"getCurrentProjectId","line":280,"loc":{"start":{"line":280,"column":4},"end":{"line":282,"column":4}}}},"statementMap":{"1":{"start":{"line":56,"column":8},"end":{"line":56,"column":2247}},"2":{"start":{"line":62,"column":8},"end":{"line":62,"column":38}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":37}},"4":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"5":{"start":{"line":72,"column":8},"end":{"line":72,"column":50}},"6":{"start":{"line":73,"column":8},"end":{"line":73,"column":43}},"7":{"start":{"line":74,"column":8},"end":{"line":74,"column":49}},"8":{"start":{"line":84,"column":8},"end":{"line":84,"column":3021}},"9":{"start":{"line":91,"column":12},"end":{"line":91,"column":60}},"10":{"start":{"line":92,"column":12},"end":{"line":92,"column":77}},"11":{"start":{"line":93,"column":12},"end":{"line":93,"column":34}},"12":{"start":{"line":94,"column":12},"end":{"line":94,"column":67}},"13":{"start":{"line":95,"column":12},"end":{"line":95,"column":49}},"14":{"start":{"line":96,"column":12},"end":{"line":96,"column":42}},"15":{"start":{"line":97,"column":12},"end":{"line":97,"column":3588}},"16":{"start":{"line":100,"column":12},"end":{"line":100,"column":46}},"17":{"start":{"line":101,"column":12},"end":{"line":101,"column":39}},"18":{"start":{"line":102,"column":12},"end":{"line":102,"column":48}},"19":{"start":{"line":109,"column":8},"end":{"line":109,"column":43}},"20":{"start":{"line":110,"column":8},"end":{"line":110,"column":36}},"21":{"start":{"line":111,"column":8},"end":{"line":111,"column":71}},"22":{"start":{"line":122,"column":8},"end":{"line":122,"column":4352}},"23":{"start":{"line":123,"column":12},"end":{"line":123,"column":4441}},"24":{"start":{"line":124,"column":16},"end":{"line":124,"column":4515}},"25":{"start":{"line":127,"column":16},"end":{"line":127,"column":42}},"26":{"start":{"line":128,"column":16},"end":{"line":128,"column":4704}},"27":{"start":{"line":129,"column":20},"end":{"line":129,"column":63}},"28":{"start":{"line":137,"column":8},"end":{"line":137,"column":47}},"29":{"start":{"line":138,"column":8},"end":{"line":138,"column":4990}},"30":{"start":{"line":142,"column":8},"end":{"line":142,"column":57}},"31":{"start":{"line":143,"column":8},"end":{"line":143,"column":36}},"32":{"start":{"line":144,"column":8},"end":{"line":144,"column":43}},"33":{"start":{"line":146,"column":8},"end":{"line":146,"column":5223}},"34":{"start":{"line":147,"column":12},"end":{"line":147,"column":74}},"35":{"start":{"line":148,"column":12},"end":{"line":148,"column":5417}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":38}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":5538}},"38":{"start":{"line":154,"column":12},"end":{"line":154,"column":5657}},"39":{"start":{"line":158,"column":12},"end":{"line":158,"column":53}},"40":{"start":{"line":160,"column":12},"end":{"line":160,"column":73}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":48}},"42":{"start":{"line":166,"column":8},"end":{"line":166,"column":6029}},"43":{"start":{"line":169,"column":12},"end":{"line":169,"column":49}},"44":{"start":{"line":170,"column":12},"end":{"line":170,"column":59}},"45":{"start":{"line":171,"column":12},"end":{"line":171,"column":45}},"46":{"start":{"line":176,"column":8},"end":{"line":176,"column":6371}},"47":{"start":{"line":177,"column":12},"end":{"line":177,"column":64}},"48":{"start":{"line":178,"column":12},"end":{"line":178,"column":46}},"49":{"start":{"line":179,"column":12},"end":{"line":179,"column":6575}},"50":{"start":{"line":182,"column":12},"end":{"line":182,"column":6686}},"51":{"start":{"line":185,"column":12},"end":{"line":185,"column":64}},"52":{"start":{"line":196,"column":8},"end":{"line":196,"column":43}},"53":{"start":{"line":204,"column":8},"end":{"line":204,"column":34}},"54":{"start":{"line":212,"column":8},"end":{"line":212,"column":41}},"55":{"start":{"line":220,"column":8},"end":{"line":220,"column":38}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":50}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":37}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":48}},"59":{"start":{"line":244,"column":8},"end":{"line":244,"column":27}},"60":{"start":{"line":248,"column":8},"end":{"line":248,"column":43}},"61":{"start":{"line":256,"column":8},"end":{"line":256,"column":46}},"62":{"start":{"line":264,"column":8},"end":{"line":264,"column":41}},"63":{"start":{"line":268,"column":8},"end":{"line":268,"column":28}},"64":{"start":{"line":276,"column":8},"end":{"line":276,"column":72}},"65":{"start":{"line":277,"column":8},"end":{"line":277,"column":27}},"66":{"start":{"line":281,"column":8},"end":{"line":281,"column":24}}},"branchMap":{"1":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":8}},{"start":{"line":56,"column":8},"end":{"line":56,"column":8}}]},"2":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":8}},{"start":{"line":84,"column":8},"end":{"line":84,"column":8}}]},"3":{"line":123,"type":"if","locations":[{"start":{"line":123,"column":12},"end":{"line":123,"column":12}},{"start":{"line":123,"column":12},"end":{"line":123,"column":12}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":16},"end":{"line":128,"column":16}},{"start":{"line":128,"column":16},"end":{"line":128,"column":16}}]},"5":{"line":138,"type":"if","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":8}},{"start":{"line":138,"column":8},"end":{"line":138,"column":8}}]},"6":{"line":146,"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":146,"column":8}},{"start":{"line":146,"column":8},"end":{"line":146,"column":8}}]},"7":{"line":154,"type":"if","locations":[{"start":{"line":154,"column":12},"end":{"line":154,"column":12}},{"start":{"line":154,"column":12},"end":{"line":154,"column":12}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":176,"type":"if","locations":[{"start":{"line":176,"column":8},"end":{"line":176,"column":8}},{"start":{"line":176,"column":8},"end":{"line":176,"column":8}}]},"10":{"line":182,"type":"if","locations":[{"start":{"line":182,"column":12},"end":{"line":182,"column":12}},{"start":{"line":182,"column":12},"end":{"line":182,"column":12}}]}}}, -"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}}, -"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":10,"89":2,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":10,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[2,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":10,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, +"contracts/FundProject.sol":{"l":{"56":3,"57":0,"58":3,"62":3,"63":3,"64":3,"72":3,"73":3,"74":3,"84":8,"89":0,"91":8,"92":8,"93":8,"94":8,"95":8,"96":8,"97":8,"100":8,"101":8,"102":8,"103":8,"109":1,"110":1,"111":1,"122":13,"123":15,"124":6,"127":6,"128":6,"129":4,"130":4,"137":4,"138":4,"139":1,"142":3,"143":3,"144":3,"146":3,"147":1,"148":1,"150":1,"151":1,"154":1,"155":0,"158":1,"160":2,"161":2,"166":10,"167":0,"169":10,"170":10,"171":10,"176":2,"177":1,"178":1,"179":1,"182":1,"183":0,"185":1,"187":1,"196":5,"204":1,"212":8,"220":1,"228":0,"232":4,"240":4,"244":11,"248":0,"256":2,"264":0,"268":1,"276":0,"277":0,"281":10},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":8,"9":8,"10":8,"11":8,"12":8,"13":8,"14":8,"15":8,"16":8,"17":8,"18":8,"19":1,"20":1,"21":1,"22":13,"23":15,"24":6,"25":6,"26":6,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":10,"43":10,"44":10,"45":10,"46":2,"47":1,"48":1,"49":1,"50":1,"51":1,"52":5,"53":1,"54":8,"55":1,"56":0,"57":4,"58":4,"59":11,"60":0,"61":2,"62":0,"63":1,"64":0,"65":0,"66":10},"b":{"1":[0,3],"2":[0,8],"3":[6,9],"4":[4,2],"5":[1,3],"6":[1,2],"7":[0,1],"8":[0,10],"9":[1,1],"10":[0,1]},"f":{"1":3,"2":3,"3":3,"4":8,"5":1,"6":13,"7":4,"8":10,"9":2,"10":5,"11":1,"12":8,"13":1,"14":0,"15":4,"16":4,"17":11,"18":0,"19":2,"20":0,"21":1,"22":0,"23":10},"fnMap":{"1":{"name":"isApporovedByDao","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"2":{"name":"constructor","line":61,"loc":{"start":{"line":61,"column":4},"end":{"line":65,"column":4}}},"3":{"name":"fund","line":70,"loc":{"start":{"line":67,"column":4},"end":{"line":75,"column":4}}},"4":{"name":"apporoveFundingByDao","line":82,"loc":{"start":{"line":77,"column":4},"end":{"line":105,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":112,"column":4}}},"6":{"name":"checkUpkeep","line":114,"loc":{"start":{"line":114,"column":4},"end":{"line":134,"column":4}}},"7":{"name":"performUpkeep","line":136,"loc":{"start":{"line":136,"column":4},"end":{"line":163,"column":4}}},"8":{"name":"paySubmitFee","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":173,"column":4}}},"9":{"name":"withdrawFund","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":189,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"11":{"name":"_getHashOfProjectData","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"12":{"name":"_getProjectId","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"13":{"name":"_getBalanceOfProject","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":221,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":223,"loc":{"start":{"line":223,"column":4},"end":{"line":229,"column":4}}},"15":{"name":"is_funding","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"16":{"name":"_getProjectStatus","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"17":{"name":"getEnteranceFee","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":245,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":247,"loc":{"start":{"line":247,"column":4},"end":{"line":249,"column":4}}},"19":{"name":"getFunderBalance","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":257,"column":4}}},"20":{"name":"getInvestedProjects","line":259,"loc":{"start":{"line":259,"column":4},"end":{"line":265,"column":4}}},"21":{"name":"getDaoPercentage","line":267,"loc":{"start":{"line":267,"column":4},"end":{"line":269,"column":4}}},"22":{"name":"getTimeleft","line":271,"loc":{"start":{"line":271,"column":4},"end":{"line":278,"column":4}}},"23":{"name":"getCurrentProjectId","line":280,"loc":{"start":{"line":280,"column":4},"end":{"line":282,"column":4}}}},"statementMap":{"1":{"start":{"line":56,"column":8},"end":{"line":56,"column":2247}},"2":{"start":{"line":62,"column":8},"end":{"line":62,"column":38}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":37}},"4":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"5":{"start":{"line":72,"column":8},"end":{"line":72,"column":50}},"6":{"start":{"line":73,"column":8},"end":{"line":73,"column":43}},"7":{"start":{"line":74,"column":8},"end":{"line":74,"column":49}},"8":{"start":{"line":84,"column":8},"end":{"line":84,"column":3021}},"9":{"start":{"line":91,"column":12},"end":{"line":91,"column":60}},"10":{"start":{"line":92,"column":12},"end":{"line":92,"column":77}},"11":{"start":{"line":93,"column":12},"end":{"line":93,"column":34}},"12":{"start":{"line":94,"column":12},"end":{"line":94,"column":67}},"13":{"start":{"line":95,"column":12},"end":{"line":95,"column":49}},"14":{"start":{"line":96,"column":12},"end":{"line":96,"column":42}},"15":{"start":{"line":97,"column":12},"end":{"line":97,"column":3588}},"16":{"start":{"line":100,"column":12},"end":{"line":100,"column":46}},"17":{"start":{"line":101,"column":12},"end":{"line":101,"column":39}},"18":{"start":{"line":102,"column":12},"end":{"line":102,"column":48}},"19":{"start":{"line":109,"column":8},"end":{"line":109,"column":43}},"20":{"start":{"line":110,"column":8},"end":{"line":110,"column":36}},"21":{"start":{"line":111,"column":8},"end":{"line":111,"column":71}},"22":{"start":{"line":122,"column":8},"end":{"line":122,"column":4352}},"23":{"start":{"line":123,"column":12},"end":{"line":123,"column":4441}},"24":{"start":{"line":124,"column":16},"end":{"line":124,"column":4515}},"25":{"start":{"line":127,"column":16},"end":{"line":127,"column":42}},"26":{"start":{"line":128,"column":16},"end":{"line":128,"column":4704}},"27":{"start":{"line":129,"column":20},"end":{"line":129,"column":63}},"28":{"start":{"line":137,"column":8},"end":{"line":137,"column":47}},"29":{"start":{"line":138,"column":8},"end":{"line":138,"column":4990}},"30":{"start":{"line":142,"column":8},"end":{"line":142,"column":57}},"31":{"start":{"line":143,"column":8},"end":{"line":143,"column":36}},"32":{"start":{"line":144,"column":8},"end":{"line":144,"column":43}},"33":{"start":{"line":146,"column":8},"end":{"line":146,"column":5223}},"34":{"start":{"line":147,"column":12},"end":{"line":147,"column":74}},"35":{"start":{"line":148,"column":12},"end":{"line":148,"column":5417}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":38}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":5538}},"38":{"start":{"line":154,"column":12},"end":{"line":154,"column":5657}},"39":{"start":{"line":158,"column":12},"end":{"line":158,"column":53}},"40":{"start":{"line":160,"column":12},"end":{"line":160,"column":73}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":48}},"42":{"start":{"line":166,"column":8},"end":{"line":166,"column":6029}},"43":{"start":{"line":169,"column":12},"end":{"line":169,"column":49}},"44":{"start":{"line":170,"column":12},"end":{"line":170,"column":59}},"45":{"start":{"line":171,"column":12},"end":{"line":171,"column":45}},"46":{"start":{"line":176,"column":8},"end":{"line":176,"column":6371}},"47":{"start":{"line":177,"column":12},"end":{"line":177,"column":64}},"48":{"start":{"line":178,"column":12},"end":{"line":178,"column":46}},"49":{"start":{"line":179,"column":12},"end":{"line":179,"column":6575}},"50":{"start":{"line":182,"column":12},"end":{"line":182,"column":6686}},"51":{"start":{"line":185,"column":12},"end":{"line":185,"column":64}},"52":{"start":{"line":196,"column":8},"end":{"line":196,"column":43}},"53":{"start":{"line":204,"column":8},"end":{"line":204,"column":34}},"54":{"start":{"line":212,"column":8},"end":{"line":212,"column":41}},"55":{"start":{"line":220,"column":8},"end":{"line":220,"column":38}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":50}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":37}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":48}},"59":{"start":{"line":244,"column":8},"end":{"line":244,"column":27}},"60":{"start":{"line":248,"column":8},"end":{"line":248,"column":43}},"61":{"start":{"line":256,"column":8},"end":{"line":256,"column":46}},"62":{"start":{"line":264,"column":8},"end":{"line":264,"column":41}},"63":{"start":{"line":268,"column":8},"end":{"line":268,"column":28}},"64":{"start":{"line":276,"column":8},"end":{"line":276,"column":72}},"65":{"start":{"line":277,"column":8},"end":{"line":277,"column":27}},"66":{"start":{"line":281,"column":8},"end":{"line":281,"column":24}}},"branchMap":{"1":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":8}},{"start":{"line":56,"column":8},"end":{"line":56,"column":8}}]},"2":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":8}},{"start":{"line":84,"column":8},"end":{"line":84,"column":8}}]},"3":{"line":123,"type":"if","locations":[{"start":{"line":123,"column":12},"end":{"line":123,"column":12}},{"start":{"line":123,"column":12},"end":{"line":123,"column":12}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":16},"end":{"line":128,"column":16}},{"start":{"line":128,"column":16},"end":{"line":128,"column":16}}]},"5":{"line":138,"type":"if","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":8}},{"start":{"line":138,"column":8},"end":{"line":138,"column":8}}]},"6":{"line":146,"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":146,"column":8}},{"start":{"line":146,"column":8},"end":{"line":146,"column":8}}]},"7":{"line":154,"type":"if","locations":[{"start":{"line":154,"column":12},"end":{"line":154,"column":12}},{"start":{"line":154,"column":12},"end":{"line":154,"column":12}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":176,"type":"if","locations":[{"start":{"line":176,"column":8},"end":{"line":176,"column":8}},{"start":{"line":176,"column":8},"end":{"line":176,"column":8}}]},"10":{"line":182,"type":"if","locations":[{"start":{"line":182,"column":12},"end":{"line":182,"column":12}},{"start":{"line":182,"column":12},"end":{"line":182,"column":12}}]}}}, +"contracts/GovernanceToken.sol":{"l":{"20":3,"28":35,"29":35,"37":4,"41":2,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":35,"3":35,"4":4,"5":2,"6":1,"7":1},"b":{},"f":{"1":3,"2":35,"3":4,"4":2,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}}, +"contracts/GovernerContract.sol":{"l":{"52":10,"61":10,"70":30,"79":62,"88":12,"89":2,"91":10,"100":10,"110":9,"119":0,"128":18,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":10,"2":10,"3":30,"4":62,"5":12,"6":10,"7":10,"8":9,"9":0,"10":18,"11":0},"b":{"1":[2,10]},"f":{"1":3,"2":10,"3":10,"4":30,"5":62,"6":12,"7":10,"8":9,"9":0,"10":18,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index 87e73ba..d0d5f88 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,9 +20,9 @@

- 86.9% + 91.67% Statements - 73/84 + 77/84
77.27% @@ -30,14 +30,14 @@

17/22

- 80.49% + 85.37% Functions - 33/41 + 35/41
- 83.16% + 87.37% Lines - 79/95 + 83/95
@@ -60,15 +60,15 @@

- - - + + + - - - - + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html index 8611122..7563aa7 100644 --- a/coverage/lcov-report/contracts/FundProject.sol.html +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -20,9 +20,9 @@

- 87.88% + 92.42% Statements - 58/66 + 61/66
75% @@ -30,14 +30,14 @@

15/20

- 78.26% + 82.61% Functions - 18/23 + 19/23
- 82.89% + 86.84% Lines - 63/76 + 66/76
@@ -409,34 +409,34 @@

      - +             - - - - - - - + + + + + + +     - - - - + + + +           -  -  -  + + +       @@ -447,8 +447,8 @@

      -12× -14× +13× +15×     @@ -491,12 +491,12 @@

      - +10×     - - - +10× +10× +10×       @@ -521,7 +521,7 @@

      - +       @@ -537,7 +537,7 @@

      - +       @@ -557,7 +557,7 @@

      - +       @@ -565,11 +565,11 @@

      - +       - +11×       @@ -606,7 +606,7 @@

      - +10×      

- - - + + + - - - - + + + + - - - + + + - - - - + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index 87e73ba..d0d5f88 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,9 +20,9 @@

- 86.9% + 91.67% Statements - 73/84 + 77/84
77.27% @@ -30,14 +30,14 @@

17/22

- 80.49% + 85.37% Functions - 33/41 + 35/41
- 83.16% + 87.37% Lines - 79/95 + 83/95
@@ -60,15 +60,15 @@

- - - + + + - - - - + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 27e402c..612b03a 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -24,30 +24,30 @@ FN:267,getDaoPercentage FN:271,getTimeleft FN:280,getCurrentProjectId FNF:23 -FNH:18 +FNH:19 FNDA:3,isApporovedByDao FNDA:3,constructor FNDA:3,fund -FNDA:7,apporoveFundingByDao -FNDA:0,cancelApporovelFundingByDao -FNDA:12,checkUpkeep +FNDA:8,apporoveFundingByDao +FNDA:1,cancelApporovelFundingByDao +FNDA:13,checkUpkeep FNDA:4,performUpkeep -FNDA:8,paySubmitFee +FNDA:10,paySubmitFee FNDA:2,withdrawFund -FNDA:4,_isApporoveFundingByDao +FNDA:5,_isApporoveFundingByDao FNDA:1,_getHashOfProjectData -FNDA:7,_getProjectId +FNDA:8,_getProjectId FNDA:1,_getBalanceOfProject FNDA:0,_getFundingGoalAmount -FNDA:3,is_funding -FNDA:3,_getProjectStatus -FNDA:9,getEnteranceFee +FNDA:4,is_funding +FNDA:4,_getProjectStatus +FNDA:11,getEnteranceFee FNDA:0,isEnteranceFeePaid FNDA:2,getFunderBalance FNDA:0,getInvestedProjects FNDA:1,getDaoPercentage FNDA:0,getTimeleft -FNDA:9,getCurrentProjectId +FNDA:10,getCurrentProjectId DA:56,3 DA:57,0 DA:58,3 @@ -57,24 +57,24 @@ DA:64,3 DA:72,3 DA:73,3 DA:74,3 -DA:84,7 +DA:84,8 DA:89,0 -DA:91,7 -DA:92,7 -DA:93,7 -DA:94,7 -DA:95,7 -DA:96,7 -DA:97,7 -DA:100,7 -DA:101,7 -DA:102,7 -DA:103,7 -DA:109,0 -DA:110,0 -DA:111,0 -DA:122,12 -DA:123,14 +DA:91,8 +DA:92,8 +DA:93,8 +DA:94,8 +DA:95,8 +DA:96,8 +DA:97,8 +DA:100,8 +DA:101,8 +DA:102,8 +DA:103,8 +DA:109,1 +DA:110,1 +DA:111,1 +DA:122,13 +DA:123,15 DA:124,6 DA:127,6 DA:128,6 @@ -96,11 +96,11 @@ DA:155,0 DA:158,1 DA:160,2 DA:161,2 -DA:166,8 +DA:166,10 DA:167,0 -DA:169,8 -DA:170,8 -DA:171,8 +DA:169,10 +DA:170,10 +DA:171,10 DA:176,2 DA:177,1 DA:178,1 @@ -109,29 +109,29 @@ DA:182,1 DA:183,0 DA:185,1 DA:187,1 -DA:196,4 +DA:196,5 DA:204,1 -DA:212,7 +DA:212,8 DA:220,1 DA:228,0 -DA:232,3 -DA:240,3 -DA:244,9 +DA:232,4 +DA:240,4 +DA:244,11 DA:248,0 DA:256,2 DA:264,0 DA:268,1 DA:276,0 DA:277,0 -DA:281,9 +DA:281,10 LF:76 -LH:63 +LH:66 BRDA:56,1,0,0 BRDA:56,1,1,3 BRDA:84,2,0,0 -BRDA:84,2,1,7 +BRDA:84,2,1,8 BRDA:123,3,0,6 -BRDA:123,3,1,8 +BRDA:123,3,1,9 BRDA:128,4,0,4 BRDA:128,4,1,2 BRDA:138,5,0,1 @@ -141,7 +141,7 @@ BRDA:146,6,1,2 BRDA:154,7,0,0 BRDA:154,7,1,1 BRDA:166,8,0,0 -BRDA:166,8,1,8 +BRDA:166,8,1,10 BRDA:176,9,0,1 BRDA:176,9,1,1 BRDA:182,10,0,0 @@ -158,22 +158,22 @@ FN:40,mintToken FN:44,burnToken FN:48,_burn FNF:6 -FNH:5 +FNH:6 FNDA:3,constructor -FNDA:31,_afterTokenTransfer -FNDA:3,_mint -FNDA:0,mintToken +FNDA:35,_afterTokenTransfer +FNDA:4,_mint +FNDA:2,mintToken FNDA:1,burnToken FNDA:1,_burn DA:20,3 -DA:28,31 -DA:29,31 -DA:37,3 -DA:41,0 +DA:28,35 +DA:29,35 +DA:37,4 +DA:41,2 DA:45,1 DA:52,1 LF:7 -LH:6 +LH:7 BRF:0 BRH:0 end_of_record @@ -193,32 +193,32 @@ FN:131,supportsInterface FNF:11 FNH:9 FNDA:3,constructor -FNDA:8,votingDelay -FNDA:8,votingPeriod -FNDA:24,quorum -FNDA:50,state -FNDA:10,propose -FNDA:8,proposalThreshold -FNDA:7,_execute +FNDA:10,votingDelay +FNDA:10,votingPeriod +FNDA:30,quorum +FNDA:62,state +FNDA:12,propose +FNDA:10,proposalThreshold +FNDA:9,_execute FNDA:0,_cancel -FNDA:14,_executor +FNDA:18,_executor FNDA:0,supportsInterface -DA:52,8 -DA:61,8 -DA:70,24 -DA:79,50 -DA:88,10 +DA:52,10 +DA:61,10 +DA:70,30 +DA:79,62 +DA:88,12 DA:89,2 -DA:91,8 -DA:100,8 -DA:110,7 +DA:91,10 +DA:100,10 +DA:110,9 DA:119,0 -DA:128,14 +DA:128,18 DA:137,0 LF:12 LH:10 BRDA:88,1,0,2 -BRDA:88,1,1,8 +BRDA:88,1,1,10 BRF:2 BRH:2 end_of_record diff --git a/helper-config.js b/helper-config.js index f1e5af0..c8b0858 100644 --- a/helper-config.js +++ b/helper-config.js @@ -37,10 +37,10 @@ const s_website = "www.sampleProject.com"; const s_description = "Amazing way to make money"; const s_video = "https://www.youtube.com/watch?v=5abamRO41fE&list=RD5abamRO41fE&start_radio=1&ab_channel=Slipknot"; -const s_fundRaisingGoalAmount = 10000; // in wei +const s_fundRaisingGoalAmount = "5000"; // in wei const s_roadMap = "Just click the video"; const s_otherSources = "You dont need anything else"; -const s_fundingTime = 86400; // 10 sec. +const s_fundingTime = 2592000; // 10 sec. module.exports = { developmentChains, diff --git a/test/unit/dao.unit.test.js b/test/unit/dao.unit.test.js index 6122528..e760aec 100644 --- a/test/unit/dao.unit.test.js +++ b/test/unit/dao.unit.test.js @@ -50,9 +50,35 @@ const fs = require("fs"); assert(timeLock.address); }); - it("Only Dao can mint token", async () => {}); + it("Only Owner can mint token", async () => { + // console.log((await gtToken.balanceOf(deployer)).toString()); - it("can only be changed through governance", async () => {}); + const tx = await gtToken.mintToken( + deployer, + ethers.BigNumber.from("1000000000000000000000000") + ); + await tx.wait(1); + + // console.log((await gtToken.balanceOf(deployer)).toString()); + + expect((await gtToken.balanceOf(deployer)).toString()).to.equal( + "2000000000000000000000000" + ); + gtToken = await ethers.getContract("GovernanceToken", account1.address); + + await expect( + gtToken.mintToken( + account1.address, + ethers.BigNumber.from("1000000000000000000000000") + ) + ).to.be.revertedWith("Ownable: caller is not the owner"); + }); + + it("can only be changed through governance", async () => { + await expect( + governor.apporoveFundingByDao("qwbsakjd00", 5, 5, 5) + ).to.be.revertedWith("Ownable: caller is not the owner"); + }); //-------------------------------------------------------------------------------- diff --git a/test/unit/fundContract.unit2.test.js b/test/unit/fundContract.unit2.test.js new file mode 100644 index 0000000..8996054 --- /dev/null +++ b/test/unit/fundContract.unit2.test.js @@ -0,0 +1,259 @@ +const { ethers, deployments, getNamedAccounts, network } = require("hardhat"); +const { assert, expect } = require("chai"); +const { + FUNC_FUND, + developmentChains, + VOTING_DELAY, + VOTING_PERIOD, + MIN_DELAY, + s_fundingTime, + s_fundRaisingGoalAmount, +} = require("../../helper-config"); +const { moveBlocks } = require("../../utils/move-blocks"); +const { moveTime } = require("../../utils/move-time"); +const fs = require("fs"); + +!developmentChains.includes(network.name) + ? describe.skip + : describe("FundProject Unit Tests 2 ", async () => { + let gtToken, + account1, + account2, + account3, + projectOwner, + projectOwnerIndex, + governor, + timeLock, + proposalState, + projectId, + blockNumber, + deployer, + investor; + const provider = ethers.getDefaultProvider(); + beforeEach(async () => { + account1 = (await ethers.getSigners())[1]; + account2 = (await ethers.getSigners())[2]; + account3 = (await ethers.getSigners())[3]; + projectOwner = (await ethers.getSigners())[4]; + investor = (await ethers.getSigners())[5]; + deployer = (await getNamedAccounts()).deployer; + + await deployments.fixture("all"); + gtToken = await ethers.getContract("GovernanceToken"); + governor = await ethers.getContract("GovernerContract"); + timeLock = await ethers.getContract("TimeLock"); + gtToken = await ethers.getContract("GovernanceToken", deployer); + + let tx1 = await gtToken.transfer( + account1.address, + ethers.utils.parseEther("500000") + ); + tx1 = await gtToken.transfer( + account2.address, + ethers.utils.parseEther("300000") + ); + tx1 = await gtToken.transfer( + account3.address, + ethers.utils.parseEther("100000") + ); + + await tx1.wait(1); + + gtToken = await ethers.getContract("GovernanceToken", account1.address); + tx1 = await gtToken.delegate(account1.address); + await tx1.wait(1); + gtToken = await ethers.getContract("GovernanceToken", account2.address); + tx1 = await gtToken.delegate(account2.address); + gtToken = await ethers.getContract("GovernanceToken", account3.address); + tx1 = await gtToken.delegate(account3.address); + await tx1.wait(1); + + moveBlocks(1); + + const { upkeepNeeded } = await governor.checkUpkeep([]); + assert(!upkeepNeeded); + + const projectOwnerConnect = governor.connect(projectOwner); + const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; + projectOwnerIndex = await projectOwnerConnect.getCurrentProjectId(); + + const encodedFunctionCall = + projectOwnerConnect.interface.encodeFunctionData(FUNC_FUND, [ + args, + s_fundRaisingGoalAmount, + s_fundingTime, + projectOwnerIndex, + ]); + + const enteranceFee = await projectOwnerConnect.getEnteranceFee(); + + const payFee = await projectOwnerConnect.paySubmitFee({ + value: enteranceFee, + }); + await payFee.wait(1); + + const proposalTx = await projectOwnerConnect.propose( + [governor.address], + [0], + [encodedFunctionCall], + args + ); + const proposeReceipt = await proposalTx.wait(1); + + const proposalId = proposeReceipt.events[0].args.proposalId; + await moveBlocks(VOTING_DELAY + 1); + + governor = await ethers.getContract( + "GovernerContract", + account1.address + ); + let voteTxResponse = await governor.castVote(proposalId, 1); + await voteTxResponse.wait(1); + + const governor1 = await ethers.getContract( + "GovernerContract", + account2.address + ); + const voteTxResponse1 = await governor1.castVote(proposalId, 0); + await voteTxResponse1.wait(1); + + governor = await ethers.getContract( + "GovernerContract", + account3.address + ); + voteTxResponse = await governor.castVote(proposalId, 1); + await moveBlocks(VOTING_PERIOD + 1); + + proposalState = await governor.state(proposalId); + console.log(`End of voting: ${proposalState}`); + assert.equal(proposalState.toString(), "4"); + + // its time to queue & execute + + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(args) + ); + governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + const queueTx = await governor.queue( + [governor.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await queueTx.wait(1); + console.log("Queued"); + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + console.log("Executing..."); + + const executeTx = await governor.execute( + [governor.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + expect(executeTx).to.emit(governor, "projectGoesToFunding"); + await executeTx.wait(1); + console.log("Executed!"); + + projectId = await governor._getProjectId(args); + console.log(`ProjectId = ${projectId.toString()}`); + }); + it("Cancel approve by dao", async () => { + // cancelApporovelFundingByDao + deployer = await ethers.getSigner(deployer); + const deployerConnect = governor.connect(deployer); + const encodedFunctionCall = + deployerConnect.interface.encodeFunctionData( + "cancelApporovelFundingByDao", + [1] + ); + + const enteranceFee = await deployerConnect.getEnteranceFee(); + + const payFee = await deployerConnect.paySubmitFee({ + value: enteranceFee, + }); + await payFee.wait(1); + + const proposalTx = await deployerConnect.propose( + [governor.address], + [0], + [encodedFunctionCall], + 1 + ); + const proposeReceipt = await proposalTx.wait(1); + + const proposalId = proposeReceipt.events[0].args.proposalId; + + await moveBlocks(VOTING_DELAY + 1); + + governor = await ethers.getContract( + "GovernerContract", + account1.address + ); + let voteTxResponse = await governor.castVote(proposalId, 1); + await voteTxResponse.wait(1); + + const governor1 = await ethers.getContract( + "GovernerContract", + account2.address + ); + const voteTxResponse1 = await governor1.castVote(proposalId, 0); + await voteTxResponse1.wait(1); + + governor = await ethers.getContract( + "GovernerContract", + account3.address + ); + voteTxResponse = await governor.castVote(proposalId, 1); + await moveBlocks(VOTING_PERIOD + 1); + + proposalState = await governor.state(proposalId); + console.log(`End of voting: ${proposalState}`); + assert.equal(proposalState.toString(), "4"); + + // its time to queue & execute + + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(1) + ); + governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + const queueTx = await governor.queue( + [governor.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await queueTx.wait(1); + console.log("Queued"); + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + console.log("Executing..."); + + const executeTx = await governor.execute( + [governor.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + expect(executeTx).to.emit(governor, "projectGoesToFunding"); + await executeTx.wait(1); + console.log("Executed!"); + + assert.equal( + (await governor._getProjectStatus(projectId)).toString(), + "3" + ); + assert.equal( + (await governor._isApporoveFundingByDao(projectId)).toString(), + "false" + ); + assert.equal( + (await governor.is_funding(projectId)).toString(), + "false" + ); + }); + }); From 327bbd8d4e27cbf34b6adbfb2433d02f3f8dfdce Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Fri, 18 Nov 2022 03:50:05 +0300 Subject: [PATCH 28/28] deployed mumbai testnet v3 fix bugs --- test/unit/fundContract.unit2.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/fundContract.unit2.test.js b/test/unit/fundContract.unit2.test.js index 8996054..08e3d75 100644 --- a/test/unit/fundContract.unit2.test.js +++ b/test/unit/fundContract.unit2.test.js @@ -15,7 +15,7 @@ const fs = require("fs"); !developmentChains.includes(network.name) ? describe.skip - : describe("FundProject Unit Tests 2 ", async () => { + : describe("cancelApporovelFundingByDao ", async () => { let gtToken, account1, account2,

1 2 @@ -132,7 +132,190 @@

87 88 89 -90

  +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +        @@ -150,9 +333,6 @@

      - - -       @@ -161,10 +341,17 @@

    +        + + + +  +  +        @@ -172,10 +359,100 @@

+  +  +  +  +  +  +  +  +  + +  +  + + + + + + + + + + + +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + +  +  + + +  +  +  +  - +  +      +  +      @@ -186,6 +463,7 @@

      +      @@ -210,7 +488,7 @@

      - +        @@ -218,31 +496,108 @@

      - +  +  +  +  + +  +  +  +  +  +  +  + +  +  +  + +  +  +  +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  +  +  +  +      

// SPDX-License-Identifier: MIT
 pragma solidity ^0.8.0;
  
 import "@openzeppelin/contracts/access/Ownable.sol";
+import "@chainlink/contracts/src/v0.8/AutomationCompatible.sol";
  
-contract FundProject is Ownable {
-    error FundProject__NotApporovedByDao();
+error FundProject__NotApporovedByDao();
+error FundProject__UpkeepNeeded();
+error FundProject__TransferFailed(uint256 _projectId);
+error FundProject__NotEnoughPayment();
+error FundProject__withdrawFund();
+error FundProject__WithdrawTransferFailed();
+error FundProject__EnteranceFeeNeeded();
+ 
+contract FundProject is Ownable, AutomationCompatibleInterface {
+    enum ProjectFundingStatus {
+        ONPROGRESS,
+        SUCCESS,
+        FAILED,
+        CANCELED
+    }
  
     uint256 public projectId = 1;
+ 
+    uint public lastTimeStamp;
+    uint256 public daoPercentage;
+    uint256 public enteranceFee;
+ 
+    mapping(uint256 => bool) public _isFunding;
+    mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add
+    mapping(uint256 => uint256) public time;
  
     mapping(string => uint256) public hashToProjectId;
     mapping(uint256 => string) public idToHash;
-    mapping(uint256 => mapping(address => uint256)) public funders;
+    mapping(uint256 => mapping(address => uint256)) public funders; // projectId => funderAddress => funderBalance
     mapping(uint256 => uint256) public projectFunds;
     mapping(uint256 => uint256) public projectFundingGoalAmount;
     mapping(uint256 => bool) public _isApporovedByDao;
+    mapping(uint256 => address) public projectOwnerAddress;
+    mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;
+    mapping(address => bool) public _isEnteranceFeePaid;
+    mapping(address => uint256[]) public investedProjects; // investor address => investedProjects
+ 
+    event projectSuccessfullyFunded(uint256 indexed _projectId);
+    event projectFundingFailed(uint256 indexed _projectId);
+    event enteranceFeePaid(address indexed _projectOwner);
+    event projectGoesToFunding(uint256 indexed _projectId);
  
     modifier isApporovedByDao(uint256 _projecID) {
-        if (!_isApporovedByDao[_projecID])
+        Iif (!_isApporovedByDao[_projecID])
             revert FundProject__NotApporovedByDao();
         _;
     }
+ 
+    constructor(uint256 _enteranceFee, uint256 _daoPercentage) {
+        lastTimeStamp = block.timestamp;
+        daoPercentage = _daoPercentage;
+        enteranceFee = _enteranceFee;
+    }
  
     function fund(uint256 _projecID)
         public
@@ -251,23 +606,105 @@ 

{ funders[_projecID][msg.sender] += msg.value; projectFunds[_projecID] += msg.value; + investedProjects[msg.sender] = [_projecID]; // need testing }   function apporoveFundingByDao( string memory _ipfsHash, - uint256 _fundingGoalAmount + uint256 _fundingGoalAmount, + uint256 _time, + address _projectOwnerAddress ) external onlyOwner { - // only dao can call this function (after deployement we will transfer ownership to dao) - projectFundingGoalAmount[projectId] = _fundingGoalAmount; - hashToProjectId[_ipfsHash] = projectId; - idToHash[projectId] = _ipfsHash; - _isApporovedByDao[projectId] = true; - projectId++; + // only dao can call it + Iif (!_isEnteranceFeePaid[_projectOwnerAddress]) { + revert FundProject__EnteranceFeeNeeded(); + } else { + projectToTime[projectId][_time] = block.timestamp; + _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS; + time[projectId] = _time; + projectFundingGoalAmount[projectId] = _fundingGoalAmount; + hashToProjectId[_ipfsHash] = projectId; + idToHash[projectId] = _ipfsHash; + projectOwnerAddress[projectId] = _projectOwnerAddress; + _isApporovedByDao[projectId] = true; + _isFunding[projectId] = true; + emit projectGoesToFunding(projectId); + projectId++; + } + } +  + function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { + // only dao can call it + _isApporovedByDao[_projecID] = false; + _isFunding[projectId] = false; + _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; }   - function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { - // only dao can call this function (after deployement we will transfer ownership to dao) - _isApporovedByDao[_projecID] = false; + function checkUpkeep( + bytes memory /* checkData */ + ) + public + view + override + returns ( + bool upkeepNeeded, + bytes memory /* performData */ + ) + { + upkeepNeeded = (_isFunding[projectId] && + (block.timestamp - projectToTime[projectId][time[projectId]]) > + projectToTime[projectId][time[projectId]]); + } +  + function performUpkeep( + bytes calldata /* performData */ + ) external override { + (bool upkeepNeeded, ) = checkUpkeep(""); + if (!upkeepNeeded) { + revert FundProject__UpkeepNeeded(); + } + _isFunding[projectId] = false; + _isApporovedByDao[projectId] = false; +  + if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) { + _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS; + uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) / + 100; + (bool success, ) = (projectOwnerAddress[projectId]).call{ + value: fundsToSent + }(""); + if (!success) { + revert FundProject__TransferFailed(projectFunds[projectId]); + } +  + emit projectSuccessfullyFunded(projectId); + } else { + _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED; + emit projectFundingFailed(projectId); + } + } +  + function paySubmitFee() public payable { + Iif (msg.value < enteranceFee) { + revert FundProject__NotEnoughPayment(); + } else { + _isEnteranceFeePaid[msg.sender] = true; + emit enteranceFeePaid(msg.sender); + } + } +  + function withdrawFund(uint256 _projectID) public { + Iif (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) { + uint256 fundToSent = funders[_projectID][msg.sender]; + (bool success, ) = (payable(msg.sender)).call{value: fundToSent}( + "" + ); + if (!success) { + revert FundProject__WithdrawTransferFailed(); + } + } else { + revert FundProject__withdrawFund(); + } }   function _isApporoveFundingByDao(uint256 _projecID) @@ -294,20 +731,60 @@

return hashToProjectId[_ipfsHash]; }   - function _getBalanceOfProject(uint256 _projecID) + function _getBalanceOfProject(uint256 _projecID) + public + view + returns (uint256) + { + return projectFunds[_projecID]; + } +  + function _getFundingGoalAmount(uint256 _projecID) public view returns (uint256) { - return projectFunds[_projecID]; + return projectFundingGoalAmount[_projecID]; + } +  + function is_funding(uint256 _projectID) public view returns (bool) { + return _isFunding[_projectID]; }   - function _getFundingGoalAmount(uint256 _projecID) + function _getProjectStatus(uint256 _projectID) + public + view + returns (ProjectFundingStatus) + { + return _ProjectFundingStatus[_projectID]; + } +  + function getEnteranceFee() public view returns (uint256) { + return enteranceFee; + } +  + function isEnteranceFeePaid(address account) public view returns (bool) { + return _isEnteranceFeePaid[account]; + } +  + function getFunderBalance(uint256 _projectID) public view returns (uint256) { - return projectFundingGoalAmount[_projecID]; + return funders[_projectID][msg.sender]; + } +  + function getInvestedProjects(address investor) + public + view + returns (uint256[] memory) + { + return investedProjects[investor]; // need testing + } +  + function getDaoPercentage() public view returns (uint256) { + return daoPercentage; } }  

  -  -  +55        @@ -119,15 +111,11 @@

      - -           -  -     @@ -136,8 +124,8 @@

      -17× -17× +19× +19×       @@ -145,11 +133,11 @@

      - +       - +        @@ -167,27 +155,21 @@

pragma solidity ^0.8.7;   import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; +import "@openzeppelin/contracts/access/Ownable.sol";   -contract GovernanceToken is ERC20Votes { +contract GovernanceToken is ERC20Votes, Ownable { uint256 public s_initialSupply = 1000000e18; - address private immutable i_owner;   event TokenTransfer( address indexed _from, address indexed _to, uint256 _amount ); -  - modifier onlyOwner() { - require(i_owner == msg.sender, "Ownable: caller is not the owner"); - _; - }   constructor() ERC20("GovernanceToken", "GT") ERC20Permit("GovernanceToken") { - i_owner = msg.sender; _mint(msg.sender, s_initialSupply); }   @@ -208,8 +190,8 @@

super._mint(to, amount); }   - function mintToken(address to, uint256 amount) external { - _mint(to, amount); + function mintToken(address to, uint256 amount) external { + _mint(to, amount); }   function burnToken(address account, uint256 amount) external { @@ -229,7 +211,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 119d7d3..89cc827 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -20,28 +20,28 @@

- 72.73% + 81.82% Statements - 8/11 + 9/11
- 0% + 100% Branches - 0/2 + 2/2
- 75% + 81.82% Functions - 9/12 + 9/11
- 61.54% + 83.33% Lines - 8/13 + 10/12
-
+

-	
-	
-	
-	
-	
-	
-	
-	
-	
+	
+	
+	
+	
+	
+	
+	
+	
+	
@@ -116,7 +116,7 @@ 

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index e95a875..add3a09 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,5 @@ { -"contracts/FundProject.sol":{"l":{"55":3,"56":0,"57":3,"61":3,"62":3,"63":3,"71":3,"72":3,"73":3,"83":7,"84":0,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"102":0,"103":0,"104":0,"115":12,"116":14,"117":14,"119":14,"120":14,"121":4,"122":4,"128":4,"129":4,"130":1,"133":3,"134":3,"135":3,"137":3,"138":1,"139":1,"141":1,"142":1,"145":1,"146":0,"149":1,"151":2,"152":2,"157":8,"158":0,"160":8,"161":8,"166":2,"167":1,"168":1,"169":1,"172":1,"173":0,"175":1,"177":1,"186":4,"194":1,"202":7,"210":1,"218":0,"222":3,"230":3,"234":9,"238":6,"246":2,"254":0,"258":1,"266":0,"267":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"51":4,"52":1,"53":7,"54":1,"55":0,"56":3,"57":3,"58":9,"59":6,"60":2,"61":0,"62":1,"63":0,"64":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[1,1],"9":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":6,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":58,"column":4}}},"2":{"name":"constructor","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":64,"column":4}}},"3":{"name":"fund","line":69,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":4}}},"4":{"name":"apporoveFundingByDao","line":81,"loc":{"start":{"line":76,"column":4},"end":{"line":98,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":105,"column":4}}},"6":{"name":"checkUpkeep","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":125,"column":4}}},"7":{"name":"performUpkeep","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":154,"column":4}}},"8":{"name":"paySubmitFee","line":156,"loc":{"start":{"line":156,"column":4},"end":{"line":163,"column":4}}},"9":{"name":"withdrawFund","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":179,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":181,"loc":{"start":{"line":181,"column":4},"end":{"line":187,"column":4}}},"11":{"name":"_getHashOfProjectData","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":195,"column":4}}},"12":{"name":"_getProjectId","line":197,"loc":{"start":{"line":197,"column":4},"end":{"line":203,"column":4}}},"13":{"name":"_getBalanceOfProject","line":205,"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"15":{"name":"is_funding","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"16":{"name":"_getProjectStatus","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":231,"column":4}}},"17":{"name":"getEnteranceFee","line":233,"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":4}}},"19":{"name":"getFunderBalance","line":241,"loc":{"start":{"line":241,"column":4},"end":{"line":247,"column":4}}},"20":{"name":"getInvestedProjects","line":249,"loc":{"start":{"line":249,"column":4},"end":{"line":255,"column":4}}},"21":{"name":"getDaoPercentage","line":257,"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":4}}},"22":{"name":"getTimeleft","line":261,"loc":{"start":{"line":261,"column":4},"end":{"line":268,"column":4}}}},"statementMap":{"1":{"start":{"line":55,"column":8},"end":{"line":55,"column":2182}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":38}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":37}},"4":{"start":{"line":63,"column":8},"end":{"line":63,"column":35}},"5":{"start":{"line":71,"column":8},"end":{"line":71,"column":50}},"6":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"7":{"start":{"line":73,"column":8},"end":{"line":73,"column":49}},"8":{"start":{"line":83,"column":8},"end":{"line":83,"column":2951}},"9":{"start":{"line":86,"column":12},"end":{"line":86,"column":60}},"10":{"start":{"line":87,"column":12},"end":{"line":87,"column":77}},"11":{"start":{"line":88,"column":12},"end":{"line":88,"column":34}},"12":{"start":{"line":89,"column":12},"end":{"line":89,"column":67}},"13":{"start":{"line":90,"column":12},"end":{"line":90,"column":49}},"14":{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},"15":{"start":{"line":92,"column":12},"end":{"line":92,"column":64}},"16":{"start":{"line":93,"column":12},"end":{"line":93,"column":46}},"17":{"start":{"line":94,"column":12},"end":{"line":94,"column":39}},"18":{"start":{"line":95,"column":12},"end":{"line":95,"column":48}},"19":{"start":{"line":102,"column":8},"end":{"line":102,"column":43}},"20":{"start":{"line":103,"column":8},"end":{"line":103,"column":36}},"21":{"start":{"line":104,"column":8},"end":{"line":104,"column":71}},"22":{"start":{"line":115,"column":8},"end":{"line":115,"column":4138}},"23":{"start":{"line":116,"column":12},"end":{"line":116,"column":41}},"24":{"start":{"line":117,"column":12},"end":{"line":117,"column":4248}},"25":{"start":{"line":119,"column":12},"end":{"line":119,"column":50}},"26":{"start":{"line":120,"column":12},"end":{"line":120,"column":4395}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":48}},"28":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"29":{"start":{"line":129,"column":8},"end":{"line":129,"column":4648}},"30":{"start":{"line":133,"column":8},"end":{"line":133,"column":57}},"31":{"start":{"line":134,"column":8},"end":{"line":134,"column":36}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":43}},"33":{"start":{"line":137,"column":8},"end":{"line":137,"column":4881}},"34":{"start":{"line":138,"column":12},"end":{"line":138,"column":74}},"35":{"start":{"line":139,"column":12},"end":{"line":139,"column":5050}},"36":{"start":{"line":141,"column":12},"end":{"line":141,"column":38}},"37":{"start":{"line":142,"column":12},"end":{"line":142,"column":5188}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":5307}},"39":{"start":{"line":149,"column":12},"end":{"line":149,"column":53}},"40":{"start":{"line":151,"column":12},"end":{"line":151,"column":73}},"41":{"start":{"line":152,"column":12},"end":{"line":152,"column":48}},"42":{"start":{"line":157,"column":8},"end":{"line":157,"column":5679}},"43":{"start":{"line":160,"column":12},"end":{"line":160,"column":49}},"44":{"start":{"line":161,"column":12},"end":{"line":161,"column":45}},"45":{"start":{"line":166,"column":8},"end":{"line":166,"column":5959}},"46":{"start":{"line":167,"column":12},"end":{"line":167,"column":64}},"47":{"start":{"line":168,"column":12},"end":{"line":168,"column":46}},"48":{"start":{"line":169,"column":12},"end":{"line":169,"column":6163}},"49":{"start":{"line":172,"column":12},"end":{"line":172,"column":6274}},"50":{"start":{"line":175,"column":12},"end":{"line":175,"column":64}},"51":{"start":{"line":186,"column":8},"end":{"line":186,"column":43}},"52":{"start":{"line":194,"column":8},"end":{"line":194,"column":34}},"53":{"start":{"line":202,"column":8},"end":{"line":202,"column":41}},"54":{"start":{"line":210,"column":8},"end":{"line":210,"column":38}},"55":{"start":{"line":218,"column":8},"end":{"line":218,"column":50}},"56":{"start":{"line":222,"column":8},"end":{"line":222,"column":37}},"57":{"start":{"line":230,"column":8},"end":{"line":230,"column":48}},"58":{"start":{"line":234,"column":8},"end":{"line":234,"column":27}},"59":{"start":{"line":238,"column":8},"end":{"line":238,"column":43}},"60":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"61":{"start":{"line":254,"column":8},"end":{"line":254,"column":41}},"62":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"63":{"start":{"line":266,"column":8},"end":{"line":266,"column":72}},"64":{"start":{"line":267,"column":8},"end":{"line":267,"column":27}}},"branchMap":{"1":{"line":55,"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":8}},{"start":{"line":55,"column":8},"end":{"line":55,"column":8}}]},"2":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"3":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":12},"end":{"line":120,"column":12}},{"start":{"line":120,"column":12},"end":{"line":120,"column":12}}]},"4":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"5":{"line":137,"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":137,"column":8}},{"start":{"line":137,"column":8},"end":{"line":137,"column":8}}]},"6":{"line":145,"type":"if","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":12}},{"start":{"line":145,"column":12},"end":{"line":145,"column":12}}]},"7":{"line":157,"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":8}},{"start":{"line":157,"column":8},"end":{"line":157,"column":8}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":172,"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":172,"column":12}},{"start":{"line":172,"column":12},"end":{"line":172,"column":12}}]}}}, +"contracts/FundProject.sol":{"l":{"56":3,"57":0,"58":3,"62":3,"63":3,"64":3,"72":3,"73":3,"74":3,"84":7,"89":0,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"97":7,"100":7,"101":7,"102":7,"103":7,"109":0,"110":0,"111":0,"122":12,"123":14,"124":6,"127":6,"128":6,"129":4,"130":4,"137":4,"138":4,"139":1,"142":3,"143":3,"144":3,"146":3,"147":1,"148":1,"150":1,"151":1,"154":1,"155":0,"158":1,"160":2,"161":2,"166":8,"167":0,"169":8,"170":8,"171":8,"176":2,"177":1,"178":1,"179":1,"182":1,"183":0,"185":1,"187":1,"196":4,"204":1,"212":7,"220":1,"228":0,"232":3,"240":3,"244":9,"248":0,"256":2,"264":0,"268":1,"276":0,"277":0,"281":9},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":6,"25":6,"26":6,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":8,"46":2,"47":1,"48":1,"49":1,"50":1,"51":1,"52":4,"53":1,"54":7,"55":1,"56":0,"57":3,"58":3,"59":9,"60":0,"61":2,"62":0,"63":1,"64":0,"65":0,"66":9},"b":{"1":[0,3],"2":[0,7],"3":[6,8],"4":[4,2],"5":[1,3],"6":[1,2],"7":[0,1],"8":[0,8],"9":[1,1],"10":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0,"23":9},"fnMap":{"1":{"name":"isApporovedByDao","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"2":{"name":"constructor","line":61,"loc":{"start":{"line":61,"column":4},"end":{"line":65,"column":4}}},"3":{"name":"fund","line":70,"loc":{"start":{"line":67,"column":4},"end":{"line":75,"column":4}}},"4":{"name":"apporoveFundingByDao","line":82,"loc":{"start":{"line":77,"column":4},"end":{"line":105,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":112,"column":4}}},"6":{"name":"checkUpkeep","line":114,"loc":{"start":{"line":114,"column":4},"end":{"line":134,"column":4}}},"7":{"name":"performUpkeep","line":136,"loc":{"start":{"line":136,"column":4},"end":{"line":163,"column":4}}},"8":{"name":"paySubmitFee","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":173,"column":4}}},"9":{"name":"withdrawFund","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":189,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"11":{"name":"_getHashOfProjectData","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"12":{"name":"_getProjectId","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"13":{"name":"_getBalanceOfProject","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":221,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":223,"loc":{"start":{"line":223,"column":4},"end":{"line":229,"column":4}}},"15":{"name":"is_funding","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"16":{"name":"_getProjectStatus","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"17":{"name":"getEnteranceFee","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":245,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":247,"loc":{"start":{"line":247,"column":4},"end":{"line":249,"column":4}}},"19":{"name":"getFunderBalance","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":257,"column":4}}},"20":{"name":"getInvestedProjects","line":259,"loc":{"start":{"line":259,"column":4},"end":{"line":265,"column":4}}},"21":{"name":"getDaoPercentage","line":267,"loc":{"start":{"line":267,"column":4},"end":{"line":269,"column":4}}},"22":{"name":"getTimeleft","line":271,"loc":{"start":{"line":271,"column":4},"end":{"line":278,"column":4}}},"23":{"name":"getCurrentProjectId","line":280,"loc":{"start":{"line":280,"column":4},"end":{"line":282,"column":4}}}},"statementMap":{"1":{"start":{"line":56,"column":8},"end":{"line":56,"column":2247}},"2":{"start":{"line":62,"column":8},"end":{"line":62,"column":38}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":37}},"4":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"5":{"start":{"line":72,"column":8},"end":{"line":72,"column":50}},"6":{"start":{"line":73,"column":8},"end":{"line":73,"column":43}},"7":{"start":{"line":74,"column":8},"end":{"line":74,"column":49}},"8":{"start":{"line":84,"column":8},"end":{"line":84,"column":3021}},"9":{"start":{"line":91,"column":12},"end":{"line":91,"column":60}},"10":{"start":{"line":92,"column":12},"end":{"line":92,"column":77}},"11":{"start":{"line":93,"column":12},"end":{"line":93,"column":34}},"12":{"start":{"line":94,"column":12},"end":{"line":94,"column":67}},"13":{"start":{"line":95,"column":12},"end":{"line":95,"column":49}},"14":{"start":{"line":96,"column":12},"end":{"line":96,"column":42}},"15":{"start":{"line":97,"column":12},"end":{"line":97,"column":3588}},"16":{"start":{"line":100,"column":12},"end":{"line":100,"column":46}},"17":{"start":{"line":101,"column":12},"end":{"line":101,"column":39}},"18":{"start":{"line":102,"column":12},"end":{"line":102,"column":48}},"19":{"start":{"line":109,"column":8},"end":{"line":109,"column":43}},"20":{"start":{"line":110,"column":8},"end":{"line":110,"column":36}},"21":{"start":{"line":111,"column":8},"end":{"line":111,"column":71}},"22":{"start":{"line":122,"column":8},"end":{"line":122,"column":4352}},"23":{"start":{"line":123,"column":12},"end":{"line":123,"column":4441}},"24":{"start":{"line":124,"column":16},"end":{"line":124,"column":4515}},"25":{"start":{"line":127,"column":16},"end":{"line":127,"column":42}},"26":{"start":{"line":128,"column":16},"end":{"line":128,"column":4704}},"27":{"start":{"line":129,"column":20},"end":{"line":129,"column":63}},"28":{"start":{"line":137,"column":8},"end":{"line":137,"column":47}},"29":{"start":{"line":138,"column":8},"end":{"line":138,"column":4990}},"30":{"start":{"line":142,"column":8},"end":{"line":142,"column":57}},"31":{"start":{"line":143,"column":8},"end":{"line":143,"column":36}},"32":{"start":{"line":144,"column":8},"end":{"line":144,"column":43}},"33":{"start":{"line":146,"column":8},"end":{"line":146,"column":5223}},"34":{"start":{"line":147,"column":12},"end":{"line":147,"column":74}},"35":{"start":{"line":148,"column":12},"end":{"line":148,"column":5417}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":38}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":5538}},"38":{"start":{"line":154,"column":12},"end":{"line":154,"column":5657}},"39":{"start":{"line":158,"column":12},"end":{"line":158,"column":53}},"40":{"start":{"line":160,"column":12},"end":{"line":160,"column":73}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":48}},"42":{"start":{"line":166,"column":8},"end":{"line":166,"column":6029}},"43":{"start":{"line":169,"column":12},"end":{"line":169,"column":49}},"44":{"start":{"line":170,"column":12},"end":{"line":170,"column":59}},"45":{"start":{"line":171,"column":12},"end":{"line":171,"column":45}},"46":{"start":{"line":176,"column":8},"end":{"line":176,"column":6371}},"47":{"start":{"line":177,"column":12},"end":{"line":177,"column":64}},"48":{"start":{"line":178,"column":12},"end":{"line":178,"column":46}},"49":{"start":{"line":179,"column":12},"end":{"line":179,"column":6575}},"50":{"start":{"line":182,"column":12},"end":{"line":182,"column":6686}},"51":{"start":{"line":185,"column":12},"end":{"line":185,"column":64}},"52":{"start":{"line":196,"column":8},"end":{"line":196,"column":43}},"53":{"start":{"line":204,"column":8},"end":{"line":204,"column":34}},"54":{"start":{"line":212,"column":8},"end":{"line":212,"column":41}},"55":{"start":{"line":220,"column":8},"end":{"line":220,"column":38}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":50}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":37}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":48}},"59":{"start":{"line":244,"column":8},"end":{"line":244,"column":27}},"60":{"start":{"line":248,"column":8},"end":{"line":248,"column":43}},"61":{"start":{"line":256,"column":8},"end":{"line":256,"column":46}},"62":{"start":{"line":264,"column":8},"end":{"line":264,"column":41}},"63":{"start":{"line":268,"column":8},"end":{"line":268,"column":28}},"64":{"start":{"line":276,"column":8},"end":{"line":276,"column":72}},"65":{"start":{"line":277,"column":8},"end":{"line":277,"column":27}},"66":{"start":{"line":281,"column":8},"end":{"line":281,"column":24}}},"branchMap":{"1":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":8}},{"start":{"line":56,"column":8},"end":{"line":56,"column":8}}]},"2":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":8}},{"start":{"line":84,"column":8},"end":{"line":84,"column":8}}]},"3":{"line":123,"type":"if","locations":[{"start":{"line":123,"column":12},"end":{"line":123,"column":12}},{"start":{"line":123,"column":12},"end":{"line":123,"column":12}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":16},"end":{"line":128,"column":16}},{"start":{"line":128,"column":16},"end":{"line":128,"column":16}}]},"5":{"line":138,"type":"if","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":8}},{"start":{"line":138,"column":8},"end":{"line":138,"column":8}}]},"6":{"line":146,"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":146,"column":8}},{"start":{"line":146,"column":8},"end":{"line":146,"column":8}}]},"7":{"line":154,"type":"if","locations":[{"start":{"line":154,"column":12},"end":{"line":154,"column":12}},{"start":{"line":154,"column":12},"end":{"line":154,"column":12}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":176,"type":"if","locations":[{"start":{"line":176,"column":8},"end":{"line":176,"column":8}},{"start":{"line":176,"column":8},"end":{"line":176,"column":8}}]},"10":{"line":182,"type":"if","locations":[{"start":{"line":182,"column":12},"end":{"line":182,"column":12}},{"start":{"line":182,"column":12},"end":{"line":182,"column":12}}]}}}, "contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}}, -"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, +"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":10,"89":2,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":10,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[2,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":10,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index 12c7067..87e73ba 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,24 +20,24 @@

- 87.8% + 86.9% Statements - 72/82 + 73/84
- 75% + 77.27% Branches - 15/20 + 17/22
- 82.5% + 80.49% Functions - 33/40 + 33/41
- 83.87% + 83.16% Lines - 78/93 + 79/95
@@ -60,15 +60,15 @@

- - - - - - - - - + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html index 380db2b..8611122 100644 --- a/coverage/lcov-report/contracts/FundProject.sol.html +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -20,24 +20,24 @@

- 89.06% + 87.88% Statements - 57/64 + 58/66
- 72.22% + 75% Branches - 13/18 + 15/20
- 81.82% + 78.26% Functions - 18/22 + 18/23
- 83.78% + 82.89% Lines - 62/74 + 63/76
@@ -312,7 +312,22 @@

267 268 269 -270

1 2 @@ -205,9 +205,6 @@

      -  -  -        @@ -263,7 +260,7 @@

      -29× +26×       @@ -272,6 +269,9 @@

      + + +      @@ -330,6 +330,7 @@

import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol"; import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol"; +import "./FundProject.sol";   contract GovernerContract is Governor, @@ -337,24 +338,19 @@

GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, - GovernorTimelockControl + GovernorTimelockControl, + FundProject { - error GovernerContract__NotApporovedByDaoFoundation(); -  - mapping(address => bool) public inWhiteList; -  - modifier isApporovedByDaoFoundation() { - if (!inWhiteList[msg.sender]) - revert GovernerContract__NotApporovedByDaoFoundation(); - _; - } + error GovernerContract__NeedEnteranceFee();   constructor( IVotes _token, TimelockController _timelock, uint256 _votingDelay, uint256 _votingPeriod, - uint256 _quorumPercentage + uint256 _quorumPercentage, + uint256 _enteranceFee, + uint256 _daoPercentage ) Governor("GovernerContract") GovernorSettings( @@ -365,6 +361,7 @@

GovernorVotes(_token) GovernorVotesQuorumFraction(_quorumPercentage) GovernorTimelockControl(_timelock) + FundProject(_enteranceFee, _daoPercentage) {}   // The following functions are overrides required by Solidity. @@ -411,6 +408,9 @@

bytes[] memory calldatas, string memory description ) public override(Governor, IGovernor) returns (uint256) { + if (!_isEnteranceFeePaid[msg.sender]) { + revert GovernerContract__NeedEnteranceFee(); + } return super.propose(targets, values, calldatas, description); }   @@ -466,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index fff3560..da321e1 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index 6d75dfe..ea2e6f8 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,28 +20,28 @@

- 91.67% + 63.38% Statements - 33/36 + 45/71
- 66.67% + 33.33% Branches - 4/6 + 6/18
- 90.32% + 74.36% Functions - 28/31 + 29/39
- 88.1% + 60.49% Lines - 37/42 + 49/81
-
+
@@ -59,55 +59,42 @@

- - - - - - - - - - + + + + + + + + + + - - - - - - - - + + + + - + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - + + + + @@ -129,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index 7f68b37..8e9a379 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,28 +20,28 @@

- 91.67% + 63.38% Statements - 33/36 + 45/71
- 66.67% + 33.33% Branches - 4/6 + 6/18
- 90.32% + 74.36% Functions - 28/31 + 29/39
- 88.1% + 60.49% Lines - 37/42 + 49/81
-
+
Box.sol
100%3/3100%0/0100%2/2100%3/3FundProject.sol
56.6%30/5325%4/1666.67%14/2153.23%33/62
FundProject.sol
100%13/13100%2/2100%9/9GovernanceToken.sol
85.71%6/7 100%16/160/083.33%5/685.71%6/7
GovernanceToken.sol
100%9/9GovernerContract.sol
81.82%9/11 100% 2/2100%7/7100%10/10
GovernerContract.sol
72.73%8/110%0/275%9/1261.54%8/1381.82%9/1183.33%10/12
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 2244c18..2f4ccf6 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -1,146 +1,204 @@ TN: -SF:/home/furkansezal/dao/contracts/Box.sol -FN:14,store -FN:20,retrieve -FNF:2 -FNH:2 -FNDA:1,store -FNDA:2,retrieve -DA:15,1 -DA:16,1 -DA:21,2 -LF:3 -LH:3 -BRF:0 -BRH:0 -end_of_record -TN: SF:/home/furkansezal/dao/contracts/FundProject.sol -FN:18,isApporovedByDao -FN:27,fund -FN:36,apporoveFundingByDao -FN:45,cancelApporovelFundingByDao -FN:50,_isApporoveFundingByDao -FN:58,_getHashOfProjectData -FN:66,_getProjectId -FN:74,_getBalanceOfProject -FN:82,_getFundingGoalAmount -FNF:9 -FNH:9 -FNDA:2,isApporovedByDao +FN:49,isApporovedByDao +FN:55,constructor +FN:64,fund +FN:76,apporoveFundingByDao +FN:95,cancelApporovelFundingByDao +FN:102,checkUpkeep +FN:118,performUpkeep +FN:146,paySubmitFee +FN:155,withdrawFund +FN:169,_isApporoveFundingByDao +FN:177,_getHashOfProjectData +FN:185,_getProjectId +FN:193,_getBalanceOfProject +FN:201,_getFundingGoalAmount +FN:209,is_funding +FN:213,_getProjectStatus +FN:221,getEnteranceFee +FN:225,isEnteranceFeePaid +FN:229,getFunderBalance +FN:237,getInvestedProjects +FN:245,getDaoPercentage +FNF:21 +FNH:14 +FNDA:1,isApporovedByDao +FNDA:3,constructor FNDA:1,fund -FNDA:1,apporoveFundingByDao -FNDA:1,cancelApporovelFundingByDao +FNDA:3,apporoveFundingByDao +FNDA:0,cancelApporovelFundingByDao +FNDA:0,checkUpkeep +FNDA:0,performUpkeep +FNDA:4,paySubmitFee +FNDA:1,withdrawFund FNDA:2,_isApporoveFundingByDao FNDA:1,_getHashOfProjectData FNDA:3,_getProjectId -FNDA:2,_getBalanceOfProject -FNDA:2,_getFundingGoalAmount -DA:19,2 -DA:20,1 -DA:21,1 -DA:29,1 -DA:30,1 -DA:38,1 -DA:39,1 -DA:40,1 -DA:41,1 -DA:42,1 -DA:47,1 -DA:55,2 -DA:63,1 -DA:71,3 -DA:79,2 -DA:87,2 -LF:16 -LH:16 -BRDA:19,1,0,1 -BRDA:19,1,1,1 -BRF:2 -BRH:2 +FNDA:0,_getBalanceOfProject +FNDA:0,_getFundingGoalAmount +FNDA:1,is_funding +FNDA:1,_getProjectStatus +FNDA:5,getEnteranceFee +FNDA:0,isEnteranceFeePaid +FNDA:1,getFunderBalance +FNDA:0,getInvestedProjects +FNDA:1,getDaoPercentage +DA:50,1 +DA:51,0 +DA:52,1 +DA:56,3 +DA:57,3 +DA:58,3 +DA:66,1 +DA:67,1 +DA:68,1 +DA:78,3 +DA:79,0 +DA:81,3 +DA:82,3 +DA:83,3 +DA:84,3 +DA:85,3 +DA:86,3 +DA:87,3 +DA:88,3 +DA:89,3 +DA:90,3 +DA:91,3 +DA:97,0 +DA:98,0 +DA:99,0 +DA:113,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:125,0 +DA:126,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:132,0 +DA:135,0 +DA:136,0 +DA:139,0 +DA:141,0 +DA:142,0 +DA:147,4 +DA:148,0 +DA:150,4 +DA:151,4 +DA:156,1 +DA:157,0 +DA:158,0 +DA:161,0 +DA:162,0 +DA:165,1 +DA:174,2 +DA:182,1 +DA:190,3 +DA:198,0 +DA:206,0 +DA:210,1 +DA:218,1 +DA:222,5 +DA:226,0 +DA:234,1 +DA:242,0 +DA:246,1 +LF:62 +LH:33 +BRDA:50,1,0,0 +BRDA:50,1,1,1 +BRDA:78,2,0,0 +BRDA:78,2,1,3 +BRDA:122,3,0,0 +BRDA:122,3,1,0 +BRDA:128,4,0,0 +BRDA:128,4,1,0 +BRDA:135,5,0,0 +BRDA:135,5,1,0 +BRDA:147,6,0,0 +BRDA:147,6,1,4 +BRDA:156,7,0,0 +BRDA:156,7,1,1 +BRDA:161,8,0,0 +BRDA:161,8,1,0 +BRF:16 +BRH:4 end_of_record TN: SF:/home/furkansezal/dao/contracts/GovernanceToken.sol -FN:16,onlyOwner -FN:23,constructor -FN:29,_afterTokenTransfer -FN:41,_mint -FN:46,mintToken -FN:50,burnToken -FN:54,_burn -FNF:7 -FNH:7 -FNDA:5,onlyOwner +FN:18,constructor +FN:23,_afterTokenTransfer +FN:35,_mint +FN:40,mintToken +FN:44,burnToken +FN:48,_burn +FNF:6 +FNH:5 FNDA:3,constructor -FNDA:17,_afterTokenTransfer -FNDA:4,_mint -FNDA:2,mintToken +FNDA:19,_afterTokenTransfer +FNDA:3,_mint +FNDA:0,mintToken FNDA:1,burnToken FNDA:1,_burn -DA:17,5 -DA:18,4 -DA:25,3 -DA:26,3 -DA:34,17 -DA:35,17 -DA:43,4 -DA:47,2 -DA:51,1 -DA:58,1 -LF:10 -LH:10 -BRDA:17,1,0,4 -BRDA:17,1,1,1 -BRF:2 -BRH:2 +DA:20,3 +DA:28,19 +DA:29,19 +DA:37,3 +DA:41,0 +DA:45,1 +DA:52,1 +LF:7 +LH:6 +BRF:0 +BRH:0 end_of_record TN: SF:/home/furkansezal/dao/contracts/GovernerContract.sol -FN:23,isApporovedByDaoFoundation -FN:44,constructor -FN:49,votingDelay -FN:58,votingPeriod -FN:67,quorum -FN:76,state -FN:85,propose +FN:41,constructor +FN:46,votingDelay +FN:55,votingPeriod +FN:64,quorum +FN:73,state +FN:82,propose FN:94,proposalThreshold FN:103,_execute FN:113,_cancel FN:122,_executor FN:131,supportsInterface -FNF:12 +FNF:11 FNH:9 -FNDA:0,isApporovedByDaoFoundation FNDA:3,constructor FNDA:4,votingDelay FNDA:4,votingPeriod FNDA:12,quorum -FNDA:29,state -FNDA:4,propose +FNDA:26,state +FNDA:8,propose FNDA:4,proposalThreshold FNDA:3,_execute FNDA:0,_cancel FNDA:6,_executor FNDA:0,supportsInterface -DA:24,0 -DA:25,0 -DA:26,0 -DA:55,4 -DA:64,4 -DA:73,12 -DA:82,29 +DA:52,4 +DA:61,4 +DA:70,12 +DA:79,26 +DA:88,8 +DA:89,4 DA:91,4 DA:100,4 DA:110,3 DA:119,0 DA:128,6 DA:137,0 -LF:13 -LH:8 -BRDA:24,1,0,0 -BRDA:24,1,1,0 +LF:12 +LH:10 +BRDA:88,1,0,4 +BRDA:88,1,1,4 BRF:2 -BRH:0 +BRH:2 end_of_record TN: SF:/home/furkansezal/dao/contracts/TimeLock.sol diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index dd91c5e..460e25f 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -723,7 +723,7 @@ "transactionIndex": 0, "gasUsed": "3780772", "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000410000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000001000000000002000000008000000000020000000000000000000000000200000000000000000000000800000000000000000", - "blockHash": "0x4eceb63bf3105a8f69b6864c3260b41e6c3a792a0ee7fef8db508fee62be49a3", + "blockHash": "0x3421fc79a39f92881ad0b0ec76c222411ae0bf91f12a4461b633cbfad75283a2", "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", "logs": [ { @@ -738,7 +738,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x4eceb63bf3105a8f69b6864c3260b41e6c3a792a0ee7fef8db508fee62be49a3" + "blockHash": "0x3421fc79a39f92881ad0b0ec76c222411ae0bf91f12a4461b633cbfad75283a2" }, { "transactionIndex": 0, @@ -752,7 +752,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 1, - "blockHash": "0x4eceb63bf3105a8f69b6864c3260b41e6c3a792a0ee7fef8db508fee62be49a3" + "blockHash": "0x3421fc79a39f92881ad0b0ec76c222411ae0bf91f12a4461b633cbfad75283a2" }, { "transactionIndex": 0, @@ -766,7 +766,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 2, - "blockHash": "0x4eceb63bf3105a8f69b6864c3260b41e6c3a792a0ee7fef8db508fee62be49a3" + "blockHash": "0x3421fc79a39f92881ad0b0ec76c222411ae0bf91f12a4461b633cbfad75283a2" } ], "blockNumber": 2, @@ -776,7 +776,7 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "865f8451b79a875f15c7120a0497c47b", + "solcInputHash": "e037150c05e743a0afcdb8bf195f828d", "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"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\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_initialSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"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.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"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/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes, Ownable {\\n uint256 public s_initialSupply = 1000000e18;\\n\\n event TokenTransfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n _mint(msg.sender, s_initialSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n emit TokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount)\\n internal\\n override(ERC20Votes)\\n onlyOwner\\n {\\n super._mint(to, amount);\\n }\\n\\n function mintToken(address to, uint256 amount) external {\\n _mint(to, amount);\\n }\\n\\n function burnToken(address account, uint256 amount) external {\\n _burn(account, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xa092abf2f4621743762f91889e716f2f475be65a32165fca151a4741f2c58ca3\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x61014060405269d3c21bcecceda1000000600b553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000fea565b5080600490816200011d919062000fea565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001898184846200020d60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505050620001f3620001e76200024960201b60201c565b6200025160201b60201c565b6200020733600b546200031760201b60201c565b6200157a565b600083838346306040516020016200022a95949392919062001142565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003276200034260201b60201c565b6200033e8282620003d360201b6200107a1760201c565b5050565b620003526200024960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003786200049160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c89062001200565b60405180910390fd5b565b620003ea8282620004bb60201b620011071760201c565b620003fa6200063360201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620004286200065760201b60201c565b11156200046c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004639062001298565b60405180910390fd5b6200048b60096200066160201b6200126617836200067960201b60201c565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000524906200130a565b60405180910390fd5b62000541600083836200092a60201b60201c565b80600260008282546200055591906200135b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005ac91906200135b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000613919062001396565b60405180910390a36200062f600083836200092f60201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b600081836200067191906200135b565b905092915050565b60008060008580549050905060008114620006ee57856001826200069e9190620013b3565b81548110620006b257620006b1620013ee565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620006f1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200071d83858760201c565b915060008111801562000776575043866001836200073c9190620013b3565b8154811062000750576200074f620013ee565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1562000817576200079282620009b360201b6200127c1760201c565b86600183620007a29190620013b3565b81548110620007b657620007b5620013ee565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000921565b856040518060400160405280620008394362000a2160201b620012e71760201c565b63ffffffff1681526020016200085a85620009b360201b6200127c1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b6200094783838362000a7760201b6200133a1760201c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051620009a6919062001396565b60405180910390a3505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a109062001493565b60405180910390fd5b819050919050565b600063ffffffff801682111562000a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a66906200152b565b60405180910390fd5b819050919050565b62000a8f83838362000ac760201b620013651760201c565b62000ac262000aa48462000acc60201b60201c565b62000ab58462000acc60201b60201c565b8362000b3560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000b725750600081115b1562000d5357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000c655760008062000c0c600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000d5860201b6200136a17856200067960201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c5a9291906200154d565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000d525760008062000cf9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200066160201b6200126617856200067960201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000d479291906200154d565b60405180910390a250505b5b505050565b6000818362000d689190620013b3565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000df257607f821691505b60208210810362000e085762000e0762000daa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000e727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000e33565b62000e7e868362000e33565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ecb62000ec562000ebf8462000e96565b62000ea0565b62000e96565b9050919050565b6000819050919050565b62000ee78362000eaa565b62000eff62000ef68262000ed2565b84845462000e40565b825550505050565b600090565b62000f1662000f07565b62000f2381848462000edc565b505050565b5b8181101562000f4b5762000f3f60008262000f0c565b60018101905062000f29565b5050565b601f82111562000f9a5762000f648162000e0e565b62000f6f8462000e23565b8101602085101562000f7f578190505b62000f9762000f8e8562000e23565b83018262000f28565b50505b505050565b600082821c905092915050565b600062000fbf6000198460080262000f9f565b1980831691505092915050565b600062000fda838362000fac565b9150826002028217905092915050565b62000ff58262000d70565b67ffffffffffffffff81111562001011576200101062000d7b565b5b6200101d825462000dd9565b6200102a82828562000f4f565b600060209050601f8311600181146200106257600084156200104d578287015190505b62001059858262000fcc565b865550620010c9565b601f198416620010728662000e0e565b60005b828110156200109c5784890151825560018201915060208501945060208101905062001075565b86831015620010bc5784890151620010b8601f89168262000fac565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b620010e681620010d1565b82525050565b620010f78162000e96565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200112a82620010fd565b9050919050565b6200113c816200111d565b82525050565b600060a082019050620011596000830188620010db565b620011686020830187620010db565b620011776040830186620010db565b620011866060830185620010ec565b62001195608083018462001131565b9695505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620011e86020836200119f565b9150620011f582620011b0565b602082019050919050565b600060208201905081810360008301526200121b81620011d9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000620012806030836200119f565b91506200128d8262001222565b604082019050919050565b60006020820190508181036000830152620012b38162001271565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620012f2601f836200119f565b9150620012ff82620012ba565b602082019050919050565b600060208201905081810360008301526200132581620012e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013688262000e96565b9150620013758362000e96565b925082820190508082111562001390576200138f6200132c565b5b92915050565b6000602082019050620013ad6000830184620010ec565b92915050565b6000620013c08262000e96565b9150620013cd8362000e96565b9250828203905081811115620013e857620013e76200132c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200147b6027836200119f565b915062001488826200141d565b604082019050919050565b60006020820190508181036000830152620014ae816200146c565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620015136026836200119f565b91506200152082620014b5565b604082019050919050565b60006020820190508181036000830152620015468162001504565b9050919050565b6000604082019050620015646000830185620010ec565b620015736020830184620010ec565b9392505050565b60805160a05160c05160e0516101005161012051613ed6620015ca600039600061190a0152600061194c0152600061192b01526000611860015260006118b6015260006118df0152613ed66000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610555578063dd62ed3e14610571578063f1127ed8146105a1578063f2fde38b146105d1576101c4565b8063a9059cbb146104ed578063c3cda5201461051d578063d1df306c14610539576101c4565b80638e539e8c116100d35780638e539e8c1461043f57806395d89b411461046f5780639ab24eb01461048d578063a457c2d7146104bd576101c4565b806379c65068146103d55780637ecebe00146103f15780638da5cb5b14610421576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461034f5780636fcfff451461036b57806370a082311461039b578063715018a6146103cb576101c4565b806339509351146102bf5780633a46b1a8146102ef578063587cde1e1461031f576101c4565b806318160ddd116101a257806318160ddd1461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf14610217575b600080fd5b6101d16105ed565b6040516101de9190612907565b60405180910390f35b61020160048036038101906101fc91906129c2565b61067f565b60405161020e9190612a1d565b60405180910390f35b61021f6106a2565b60405161022c9190612a47565b60405180910390f35b61023d6106a8565b60405161024a9190612a47565b60405180910390f35b61026d60048036038101906102689190612a62565b6106b2565b60405161027a9190612a1d565b60405180910390f35b61028b6106e1565b6040516102989190612ad1565b60405180910390f35b6102a96106ea565b6040516102b69190612b05565b60405180910390f35b6102d960048036038101906102d491906129c2565b6106f9565b6040516102e69190612a1d565b60405180910390f35b610309600480360381019061030491906129c2565b610730565b6040516103169190612a47565b60405180910390f35b61033960048036038101906103349190612b20565b6107c4565b6040516103469190612b5c565b60405180910390f35b61036960048036038101906103649190612b20565b61082d565b005b61038560048036038101906103809190612b20565b610841565b6040516103929190612b96565b60405180910390f35b6103b560048036038101906103b09190612b20565b610895565b6040516103c29190612a47565b60405180910390f35b6103d36108dd565b005b6103ef60048036038101906103ea91906129c2565b6108f1565b005b61040b60048036038101906104069190612b20565b6108ff565b6040516104189190612a47565b60405180910390f35b61042961094f565b6040516104369190612b5c565b60405180910390f35b61045960048036038101906104549190612bb1565b610979565b6040516104669190612a47565b60405180910390f35b6104776109cf565b6040516104849190612907565b60405180910390f35b6104a760048036038101906104a29190612b20565b610a61565b6040516104b49190612a47565b60405180910390f35b6104d760048036038101906104d291906129c2565b610b72565b6040516104e49190612a1d565b60405180910390f35b610507600480360381019061050291906129c2565b610be9565b6040516105149190612a1d565b60405180910390f35b61053760048036038101906105329190612c36565b610c0c565b005b610553600480360381019061054e91906129c2565b610d10565b005b61056f600480360381019061056a9190612cc3565b610d1e565b005b61058b60048036038101906105869190612d65565b610e60565b6040516105989190612a47565b60405180910390f35b6105bb60048036038101906105b69190612dd1565b610ee7565b6040516105c89190612e86565b60405180910390f35b6105eb60048036038101906105e69190612b20565b610ff7565b005b6060600380546105fc90612ed0565b80601f016020809104026020016040519081016040528092919081815260200182805461062890612ed0565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60008061068a611380565b9050610697818585611388565b600191505092915050565b600b5481565b6000600254905090565b6000806106bd611380565b90506106ca858285611551565b6106d58585856115dd565b60019150509392505050565b60006012905090565b60006106f461185c565b905090565b600080610704611380565b90506107258185856107168589610e60565b6107209190612f30565b611388565b600191505092915050565b6000438210610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90612fb0565b60405180910390fd5b6107bc600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611976565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61083e610838611380565b82611a82565b50565b600061088e600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506112e7565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108e5611b9c565b6108ef6000611c1a565b565b6108fb8282611ce0565b5050565b6000610948600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cf6565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612fb0565b60405180910390fd5b6109c8600983611976565b9050919050565b6060600480546109de90612ed0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90612ed0565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b4957600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610afd9190612fd0565b81548110610b0e57610b0d613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b4c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610b7d611380565b90506000610b8b8286610e60565b905083811015610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906130a5565b60405180910390fd5b610bdd8286868403611388565b60019250505092915050565b600080610bf4611380565b9050610c018185856115dd565b600191505092915050565b83421115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613111565b60405180910390fd5b6000610cb1610ca97fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610c8e9493929190613131565b60405160208183030381529060405280519060200120611d04565b858585611d1e565b9050610cbc81611d49565b8614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906131c2565b60405180910390fd5b610d078188611a82565b50505050505050565b610d1a8282611da7565b5050565b83421115610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061322e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d908c611d49565b89604051602001610da69695949392919061324e565b6040516020818303038152906040528051906020012090506000610dc982611d04565b90506000610dd982878787611d1e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906132fb565b60405180910390fd5b610e548a8a8a611388565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610eef612839565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f4657610f45613004565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610fff611b9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110659061338d565b60405180910390fd5b61107781611c1a565b50565b6110848282611107565b61108c611db5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110b26106a8565b11156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061341f565b60405180910390fd5b611101600961126683611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061348b565b60405180910390fd5b61118260008383612051565b80600260008282546111949190612f30565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e99190612f30565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124e9190612a47565b60405180910390a361126260008383612056565b5050565b600081836112749190612f30565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061351d565b60405180910390fd5b819050919050565b600063ffffffff8016821115611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906135af565b60405180910390fd5b819050919050565b611345838383611365565b611360611351846107c4565b61135a846107c4565b836120cb565b505050565b505050565b600081836113789190612fd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90613641565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906136d3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115449190612a47565b60405180910390a3505050565b600061155d8484610e60565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115d757818110156115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061373f565b60405180910390fd5b6115d68484848403611388565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906137d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613863565b60405180910390fd5b6116c6838383612051565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906138f5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117df9190612f30565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118439190612a47565b60405180910390a3611856848484612056565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156118d857507f000000000000000000000000000000000000000000000000000000000000000046145b15611905577f00000000000000000000000000000000000000000000000000000000000000009050611973565b6119707f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122c4565b90505b90565b6000808380549050905060005b818110156119f557600061199782846122fe565b9050848682815481106119ad576119ac613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156119df578092506119ef565b6001816119ec9190612f30565b91505b50611983565b60008214611a575784600183611a0b9190612fd0565b81548110611a1c57611a1b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611a5a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000611a8d836107c4565b90506000611a9a84610895565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b968284836120cb565b50505050565b611ba4611380565b73ffffffffffffffffffffffffffffffffffffffff16611bc261094f565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613961565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ce8611b9c565b611cf2828261107a565b5050565b600081600001549050919050565b6000611d17611d1161185c565b83612324565b9050919050565b6000806000611d2f87878787612357565b91509150611d3c81612463565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9681611cf6565b9150611da18161262f565b50919050565b611db18282612645565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611e475785600182611dfb9190612fd0565b81548110611e0c57611e0b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611e4a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611e7883858763ffffffff16565b9150600081118015611ecb57504386600183611e949190612fd0565b81548110611ea557611ea4613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f5857611ed98261127c565b86600183611ee79190612fd0565b81548110611ef857611ef7613004565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612048565b856040518060400160405280611f6d436112e7565b63ffffffff168152602001611f818561127c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b61206183838361133a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516120be9190612a47565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121075750600081115b156122bf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121e55760008061218e600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136a85611dd9565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121da929190613981565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122be57600080612267600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061126685611dd9565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122b3929190613981565b60405180910390a250505b5b505050565b600083838346306040516020016122df9594939291906139aa565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861230f9190613a2c565b82841661231c9190612f30565b905092915050565b60008282604051602001612339929190613ad5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561239257600060039150915061245a565b601b8560ff16141580156123aa5750601c8560ff1614155b156123bc57600060049150915061245a565b6000600187878787604051600081526020016040526040516123e19493929190613b0c565b6020604051602081039080840390855afa158015612403573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124515760006001925092505061245a565b80600092509250505b94509492505050565b6000600481111561247757612476613b51565b5b81600481111561248a57612489613b51565b5b031561262c57600160048111156124a4576124a3613b51565b5b8160048111156124b7576124b6613b51565b5b036124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90613bcc565b60405180910390fd5b6002600481111561250b5761250a613b51565b5b81600481111561251e5761251d613b51565b5b0361255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613c38565b60405180910390fd5b6003600481111561257257612571613b51565b5b81600481111561258557612584613b51565b5b036125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc90613cca565b60405180910390fd5b6004808111156125d8576125d7613b51565b5b8160048111156125eb576125ea613b51565b5b0361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290613d5c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61264f8282612663565b61265d600961136a83611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990613dee565b60405180910390fd5b6126de82600083612051565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613e80565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127bb9190612fd0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128209190612a47565b60405180910390a361283483600084612056565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b1578082015181840152602081019050612896565b60008484015250505050565b6000601f19601f8301169050919050565b60006128d982612877565b6128e38185612882565b93506128f3818560208601612893565b6128fc816128bd565b840191505092915050565b6000602082019050818103600083015261292181846128ce565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129598261292e565b9050919050565b6129698161294e565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b6000819050919050565b61299f8161298c565b81146129aa57600080fd5b50565b6000813590506129bc81612996565b92915050565b600080604083850312156129d9576129d8612929565b5b60006129e785828601612977565b92505060206129f8858286016129ad565b9150509250929050565b60008115159050919050565b612a1781612a02565b82525050565b6000602082019050612a326000830184612a0e565b92915050565b612a418161298c565b82525050565b6000602082019050612a5c6000830184612a38565b92915050565b600080600060608486031215612a7b57612a7a612929565b5b6000612a8986828701612977565b9350506020612a9a86828701612977565b9250506040612aab868287016129ad565b9150509250925092565b600060ff82169050919050565b612acb81612ab5565b82525050565b6000602082019050612ae66000830184612ac2565b92915050565b6000819050919050565b612aff81612aec565b82525050565b6000602082019050612b1a6000830184612af6565b92915050565b600060208284031215612b3657612b35612929565b5b6000612b4484828501612977565b91505092915050565b612b568161294e565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600063ffffffff82169050919050565b612b9081612b77565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b600060208284031215612bc757612bc6612929565b5b6000612bd5848285016129ad565b91505092915050565b612be781612ab5565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b612c1381612aec565b8114612c1e57600080fd5b50565b600081359050612c3081612c0a565b92915050565b60008060008060008060c08789031215612c5357612c52612929565b5b6000612c6189828a01612977565b9650506020612c7289828a016129ad565b9550506040612c8389828a016129ad565b9450506060612c9489828a01612bf5565b9350506080612ca589828a01612c21565b92505060a0612cb689828a01612c21565b9150509295509295509295565b600080600080600080600060e0888a031215612ce257612ce1612929565b5b6000612cf08a828b01612977565b9750506020612d018a828b01612977565b9650506040612d128a828b016129ad565b9550506060612d238a828b016129ad565b9450506080612d348a828b01612bf5565b93505060a0612d458a828b01612c21565b92505060c0612d568a828b01612c21565b91505092959891949750929550565b60008060408385031215612d7c57612d7b612929565b5b6000612d8a85828601612977565b9250506020612d9b85828601612977565b9150509250929050565b612dae81612b77565b8114612db957600080fd5b50565b600081359050612dcb81612da5565b92915050565b60008060408385031215612de857612de7612929565b5b6000612df685828601612977565b9250506020612e0785828601612dbc565b9150509250929050565b612e1a81612b77565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612e5181612e20565b82525050565b604082016000820151612e6d6000850182612e11565b506020820151612e806020850182612e48565b50505050565b6000604082019050612e9b6000830184612e57565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ee857607f821691505b602082108103612efb57612efa612ea1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f3b8261298c565b9150612f468361298c565b9250828201905080821115612f5e57612f5d612f01565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612f9a601f83612882565b9150612fa582612f64565b602082019050919050565b60006020820190508181036000830152612fc981612f8d565b9050919050565b6000612fdb8261298c565b9150612fe68361298c565b9250828203905081811115612ffe57612ffd612f01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061308f602583612882565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006130fb601d83612882565b9150613106826130c5565b602082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b60006080820190506131466000830187612af6565b6131536020830186612b4d565b6131606040830185612a38565b61316d6060830184612a38565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006131ac601983612882565b91506131b782613176565b602082019050919050565b600060208201905081810360008301526131db8161319f565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613218601d83612882565b9150613223826131e2565b602082019050919050565b600060208201905081810360008301526132478161320b565b9050919050565b600060c0820190506132636000830189612af6565b6132706020830188612b4d565b61327d6040830187612b4d565b61328a6060830186612a38565b6132976080830185612a38565b6132a460a0830184612a38565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006132e5601e83612882565b91506132f0826132af565b602082019050919050565b60006020820190508181036000830152613314816132d8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613377602683612882565b91506133828261331b565b604082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613409603083612882565b9150613414826133ad565b604082019050919050565b60006020820190508181036000830152613438816133fc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613475601f83612882565b91506134808261343f565b602082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000613507602783612882565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613599602683612882565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362b602483612882565b9150613636826135cf565b604082019050919050565b6000602082019050818103600083015261365a8161361e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136bd602283612882565b91506136c882613661565b604082019050919050565b600060208201905081810360008301526136ec816136b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613729601d83612882565b9150613734826136f3565b602082019050919050565b600060208201905081810360008301526137588161371c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bb602583612882565b91506137c68261375f565b604082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061384d602383612882565b9150613858826137f1565b604082019050919050565b6000602082019050818103600083015261387c81613840565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138df602683612882565b91506138ea82613883565b604082019050919050565b6000602082019050818103600083015261390e816138d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061394b602083612882565b915061395682613915565b602082019050919050565b6000602082019050818103600083015261397a8161393e565b9050919050565b60006040820190506139966000830185612a38565b6139a36020830184612a38565b9392505050565b600060a0820190506139bf6000830188612af6565b6139cc6020830187612af6565b6139d96040830186612af6565b6139e66060830185612a38565b6139f36080830184612b4d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a378261298c565b9150613a428361298c565b925082613a5257613a516139fd565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a9e600283613a5d565b9150613aa982613a68565b600282019050919050565b6000819050919050565b613acf613aca82612aec565b613ab4565b82525050565b6000613ae082613a91565b9150613aec8285613abe565b602082019150613afc8284613abe565b6020820191508190509392505050565b6000608082019050613b216000830187612af6565b613b2e6020830186612ac2565b613b3b6040830185612af6565b613b486060830184612af6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bb6601883612882565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c22601f83612882565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cb4602283612882565b9150613cbf82613c58565b604082019050919050565b60006020820190508181036000830152613ce381613ca7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d46602283612882565b9150613d5182613cea565b604082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd8602183612882565b9150613de382613d7c565b604082019050919050565b60006020820190508181036000830152613e0781613dcb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6a602283612882565b9150613e7582613e0e565b604082019050919050565b60006020820190508181036000830152613e9981613e5d565b905091905056fea264697066735822122017be51580e499600e196331255d1b51b80dc95152f4ab3928e0760c4b3acb21e64736f6c63430008110033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610555578063dd62ed3e14610571578063f1127ed8146105a1578063f2fde38b146105d1576101c4565b8063a9059cbb146104ed578063c3cda5201461051d578063d1df306c14610539576101c4565b80638e539e8c116100d35780638e539e8c1461043f57806395d89b411461046f5780639ab24eb01461048d578063a457c2d7146104bd576101c4565b806379c65068146103d55780637ecebe00146103f15780638da5cb5b14610421576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461034f5780636fcfff451461036b57806370a082311461039b578063715018a6146103cb576101c4565b806339509351146102bf5780633a46b1a8146102ef578063587cde1e1461031f576101c4565b806318160ddd116101a257806318160ddd1461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf14610217575b600080fd5b6101d16105ed565b6040516101de9190612907565b60405180910390f35b61020160048036038101906101fc91906129c2565b61067f565b60405161020e9190612a1d565b60405180910390f35b61021f6106a2565b60405161022c9190612a47565b60405180910390f35b61023d6106a8565b60405161024a9190612a47565b60405180910390f35b61026d60048036038101906102689190612a62565b6106b2565b60405161027a9190612a1d565b60405180910390f35b61028b6106e1565b6040516102989190612ad1565b60405180910390f35b6102a96106ea565b6040516102b69190612b05565b60405180910390f35b6102d960048036038101906102d491906129c2565b6106f9565b6040516102e69190612a1d565b60405180910390f35b610309600480360381019061030491906129c2565b610730565b6040516103169190612a47565b60405180910390f35b61033960048036038101906103349190612b20565b6107c4565b6040516103469190612b5c565b60405180910390f35b61036960048036038101906103649190612b20565b61082d565b005b61038560048036038101906103809190612b20565b610841565b6040516103929190612b96565b60405180910390f35b6103b560048036038101906103b09190612b20565b610895565b6040516103c29190612a47565b60405180910390f35b6103d36108dd565b005b6103ef60048036038101906103ea91906129c2565b6108f1565b005b61040b60048036038101906104069190612b20565b6108ff565b6040516104189190612a47565b60405180910390f35b61042961094f565b6040516104369190612b5c565b60405180910390f35b61045960048036038101906104549190612bb1565b610979565b6040516104669190612a47565b60405180910390f35b6104776109cf565b6040516104849190612907565b60405180910390f35b6104a760048036038101906104a29190612b20565b610a61565b6040516104b49190612a47565b60405180910390f35b6104d760048036038101906104d291906129c2565b610b72565b6040516104e49190612a1d565b60405180910390f35b610507600480360381019061050291906129c2565b610be9565b6040516105149190612a1d565b60405180910390f35b61053760048036038101906105329190612c36565b610c0c565b005b610553600480360381019061054e91906129c2565b610d10565b005b61056f600480360381019061056a9190612cc3565b610d1e565b005b61058b60048036038101906105869190612d65565b610e60565b6040516105989190612a47565b60405180910390f35b6105bb60048036038101906105b69190612dd1565b610ee7565b6040516105c89190612e86565b60405180910390f35b6105eb60048036038101906105e69190612b20565b610ff7565b005b6060600380546105fc90612ed0565b80601f016020809104026020016040519081016040528092919081815260200182805461062890612ed0565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60008061068a611380565b9050610697818585611388565b600191505092915050565b600b5481565b6000600254905090565b6000806106bd611380565b90506106ca858285611551565b6106d58585856115dd565b60019150509392505050565b60006012905090565b60006106f461185c565b905090565b600080610704611380565b90506107258185856107168589610e60565b6107209190612f30565b611388565b600191505092915050565b6000438210610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90612fb0565b60405180910390fd5b6107bc600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611976565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61083e610838611380565b82611a82565b50565b600061088e600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506112e7565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108e5611b9c565b6108ef6000611c1a565b565b6108fb8282611ce0565b5050565b6000610948600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cf6565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612fb0565b60405180910390fd5b6109c8600983611976565b9050919050565b6060600480546109de90612ed0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90612ed0565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b4957600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610afd9190612fd0565b81548110610b0e57610b0d613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b4c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610b7d611380565b90506000610b8b8286610e60565b905083811015610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906130a5565b60405180910390fd5b610bdd8286868403611388565b60019250505092915050565b600080610bf4611380565b9050610c018185856115dd565b600191505092915050565b83421115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613111565b60405180910390fd5b6000610cb1610ca97fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610c8e9493929190613131565b60405160208183030381529060405280519060200120611d04565b858585611d1e565b9050610cbc81611d49565b8614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906131c2565b60405180910390fd5b610d078188611a82565b50505050505050565b610d1a8282611da7565b5050565b83421115610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061322e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d908c611d49565b89604051602001610da69695949392919061324e565b6040516020818303038152906040528051906020012090506000610dc982611d04565b90506000610dd982878787611d1e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906132fb565b60405180910390fd5b610e548a8a8a611388565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610eef612839565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f4657610f45613004565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610fff611b9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110659061338d565b60405180910390fd5b61107781611c1a565b50565b6110848282611107565b61108c611db5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110b26106a8565b11156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061341f565b60405180910390fd5b611101600961126683611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061348b565b60405180910390fd5b61118260008383612051565b80600260008282546111949190612f30565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e99190612f30565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124e9190612a47565b60405180910390a361126260008383612056565b5050565b600081836112749190612f30565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061351d565b60405180910390fd5b819050919050565b600063ffffffff8016821115611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906135af565b60405180910390fd5b819050919050565b611345838383611365565b611360611351846107c4565b61135a846107c4565b836120cb565b505050565b505050565b600081836113789190612fd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90613641565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906136d3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115449190612a47565b60405180910390a3505050565b600061155d8484610e60565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115d757818110156115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061373f565b60405180910390fd5b6115d68484848403611388565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906137d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613863565b60405180910390fd5b6116c6838383612051565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906138f5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117df9190612f30565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118439190612a47565b60405180910390a3611856848484612056565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156118d857507f000000000000000000000000000000000000000000000000000000000000000046145b15611905577f00000000000000000000000000000000000000000000000000000000000000009050611973565b6119707f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122c4565b90505b90565b6000808380549050905060005b818110156119f557600061199782846122fe565b9050848682815481106119ad576119ac613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156119df578092506119ef565b6001816119ec9190612f30565b91505b50611983565b60008214611a575784600183611a0b9190612fd0565b81548110611a1c57611a1b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611a5a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000611a8d836107c4565b90506000611a9a84610895565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b968284836120cb565b50505050565b611ba4611380565b73ffffffffffffffffffffffffffffffffffffffff16611bc261094f565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613961565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ce8611b9c565b611cf2828261107a565b5050565b600081600001549050919050565b6000611d17611d1161185c565b83612324565b9050919050565b6000806000611d2f87878787612357565b91509150611d3c81612463565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9681611cf6565b9150611da18161262f565b50919050565b611db18282612645565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611e475785600182611dfb9190612fd0565b81548110611e0c57611e0b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611e4a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611e7883858763ffffffff16565b9150600081118015611ecb57504386600183611e949190612fd0565b81548110611ea557611ea4613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f5857611ed98261127c565b86600183611ee79190612fd0565b81548110611ef857611ef7613004565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612048565b856040518060400160405280611f6d436112e7565b63ffffffff168152602001611f818561127c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b61206183838361133a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516120be9190612a47565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121075750600081115b156122bf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121e55760008061218e600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136a85611dd9565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121da929190613981565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122be57600080612267600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061126685611dd9565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122b3929190613981565b60405180910390a250505b5b505050565b600083838346306040516020016122df9594939291906139aa565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861230f9190613a2c565b82841661231c9190612f30565b905092915050565b60008282604051602001612339929190613ad5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561239257600060039150915061245a565b601b8560ff16141580156123aa5750601c8560ff1614155b156123bc57600060049150915061245a565b6000600187878787604051600081526020016040526040516123e19493929190613b0c565b6020604051602081039080840390855afa158015612403573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124515760006001925092505061245a565b80600092509250505b94509492505050565b6000600481111561247757612476613b51565b5b81600481111561248a57612489613b51565b5b031561262c57600160048111156124a4576124a3613b51565b5b8160048111156124b7576124b6613b51565b5b036124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90613bcc565b60405180910390fd5b6002600481111561250b5761250a613b51565b5b81600481111561251e5761251d613b51565b5b0361255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613c38565b60405180910390fd5b6003600481111561257257612571613b51565b5b81600481111561258557612584613b51565b5b036125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc90613cca565b60405180910390fd5b6004808111156125d8576125d7613b51565b5b8160048111156125eb576125ea613b51565b5b0361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290613d5c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61264f8282612663565b61265d600961136a83611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990613dee565b60405180910390fd5b6126de82600083612051565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613e80565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127bb9190612fd0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128209190612a47565b60405180910390a361283483600084612056565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b1578082015181840152602081019050612896565b60008484015250505050565b6000601f19601f8301169050919050565b60006128d982612877565b6128e38185612882565b93506128f3818560208601612893565b6128fc816128bd565b840191505092915050565b6000602082019050818103600083015261292181846128ce565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129598261292e565b9050919050565b6129698161294e565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b6000819050919050565b61299f8161298c565b81146129aa57600080fd5b50565b6000813590506129bc81612996565b92915050565b600080604083850312156129d9576129d8612929565b5b60006129e785828601612977565b92505060206129f8858286016129ad565b9150509250929050565b60008115159050919050565b612a1781612a02565b82525050565b6000602082019050612a326000830184612a0e565b92915050565b612a418161298c565b82525050565b6000602082019050612a5c6000830184612a38565b92915050565b600080600060608486031215612a7b57612a7a612929565b5b6000612a8986828701612977565b9350506020612a9a86828701612977565b9250506040612aab868287016129ad565b9150509250925092565b600060ff82169050919050565b612acb81612ab5565b82525050565b6000602082019050612ae66000830184612ac2565b92915050565b6000819050919050565b612aff81612aec565b82525050565b6000602082019050612b1a6000830184612af6565b92915050565b600060208284031215612b3657612b35612929565b5b6000612b4484828501612977565b91505092915050565b612b568161294e565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600063ffffffff82169050919050565b612b9081612b77565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b600060208284031215612bc757612bc6612929565b5b6000612bd5848285016129ad565b91505092915050565b612be781612ab5565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b612c1381612aec565b8114612c1e57600080fd5b50565b600081359050612c3081612c0a565b92915050565b60008060008060008060c08789031215612c5357612c52612929565b5b6000612c6189828a01612977565b9650506020612c7289828a016129ad565b9550506040612c8389828a016129ad565b9450506060612c9489828a01612bf5565b9350506080612ca589828a01612c21565b92505060a0612cb689828a01612c21565b9150509295509295509295565b600080600080600080600060e0888a031215612ce257612ce1612929565b5b6000612cf08a828b01612977565b9750506020612d018a828b01612977565b9650506040612d128a828b016129ad565b9550506060612d238a828b016129ad565b9450506080612d348a828b01612bf5565b93505060a0612d458a828b01612c21565b92505060c0612d568a828b01612c21565b91505092959891949750929550565b60008060408385031215612d7c57612d7b612929565b5b6000612d8a85828601612977565b9250506020612d9b85828601612977565b9150509250929050565b612dae81612b77565b8114612db957600080fd5b50565b600081359050612dcb81612da5565b92915050565b60008060408385031215612de857612de7612929565b5b6000612df685828601612977565b9250506020612e0785828601612dbc565b9150509250929050565b612e1a81612b77565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612e5181612e20565b82525050565b604082016000820151612e6d6000850182612e11565b506020820151612e806020850182612e48565b50505050565b6000604082019050612e9b6000830184612e57565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ee857607f821691505b602082108103612efb57612efa612ea1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f3b8261298c565b9150612f468361298c565b9250828201905080821115612f5e57612f5d612f01565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612f9a601f83612882565b9150612fa582612f64565b602082019050919050565b60006020820190508181036000830152612fc981612f8d565b9050919050565b6000612fdb8261298c565b9150612fe68361298c565b9250828203905081811115612ffe57612ffd612f01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061308f602583612882565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006130fb601d83612882565b9150613106826130c5565b602082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b60006080820190506131466000830187612af6565b6131536020830186612b4d565b6131606040830185612a38565b61316d6060830184612a38565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006131ac601983612882565b91506131b782613176565b602082019050919050565b600060208201905081810360008301526131db8161319f565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613218601d83612882565b9150613223826131e2565b602082019050919050565b600060208201905081810360008301526132478161320b565b9050919050565b600060c0820190506132636000830189612af6565b6132706020830188612b4d565b61327d6040830187612b4d565b61328a6060830186612a38565b6132976080830185612a38565b6132a460a0830184612a38565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006132e5601e83612882565b91506132f0826132af565b602082019050919050565b60006020820190508181036000830152613314816132d8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613377602683612882565b91506133828261331b565b604082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613409603083612882565b9150613414826133ad565b604082019050919050565b60006020820190508181036000830152613438816133fc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613475601f83612882565b91506134808261343f565b602082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000613507602783612882565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613599602683612882565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362b602483612882565b9150613636826135cf565b604082019050919050565b6000602082019050818103600083015261365a8161361e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136bd602283612882565b91506136c882613661565b604082019050919050565b600060208201905081810360008301526136ec816136b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613729601d83612882565b9150613734826136f3565b602082019050919050565b600060208201905081810360008301526137588161371c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bb602583612882565b91506137c68261375f565b604082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061384d602383612882565b9150613858826137f1565b604082019050919050565b6000602082019050818103600083015261387c81613840565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138df602683612882565b91506138ea82613883565b604082019050919050565b6000602082019050818103600083015261390e816138d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061394b602083612882565b915061395682613915565b602082019050919050565b6000602082019050818103600083015261397a8161393e565b9050919050565b60006040820190506139966000830185612a38565b6139a36020830184612a38565b9392505050565b600060a0820190506139bf6000830188612af6565b6139cc6020830187612af6565b6139d96040830186612af6565b6139e66060830185612a38565b6139f36080830184612b4d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a378261298c565b9150613a428361298c565b925082613a5257613a516139fd565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a9e600283613a5d565b9150613aa982613a68565b600282019050919050565b6000819050919050565b613acf613aca82612aec565b613ab4565b82525050565b6000613ae082613a91565b9150613aec8285613abe565b602082019150613afc8284613abe565b6020820191508190509392505050565b6000608082019050613b216000830187612af6565b613b2e6020830186612ac2565b613b3b6040830185612af6565b613b486060830184612af6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bb6601883612882565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c22601f83612882565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cb4602283612882565b9150613cbf82613c58565b604082019050919050565b60006020820190508181036000830152613ce381613ca7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d46602283612882565b9150613d5182613cea565b604082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd8602183612882565b9150613de382613d7c565b604082019050919050565b60006020820190508181036000830152613e0781613dcb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6a602283612882565b9150613e7582613e0e565b604082019050919050565b60006020820190508181036000830152613e9981613e5d565b905091905056fea264697066735822122017be51580e499600e196331255d1b51b80dc95152f4ab3928e0760c4b3acb21e64736f6c63430008110033", @@ -957,7 +957,7 @@ "type": "t_address" }, { - "astId": 10706, + "astId": 10749, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "s_initialSupply", "offset": 0, diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json index 0afdc6d..885b564 100644 --- a/deployments/localhost/GovernerContract.json +++ b/deployments/localhost/GovernerContract.json @@ -1963,7 +1963,7 @@ "transactionIndex": 0, "gasUsed": "8012021", "logsBloom": "0x00000000000000000100000000001000000000000000000000800000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000001000000000000000010000000000000000000020000080002000100000800000000000000000000000000000000401000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000200000000000000000000000003000000000080000800020000000000000000000000000000000000000000000000000000000000000002000", - "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475", + "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46", "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", "logs": [ { @@ -1976,7 +1976,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 0, - "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" + "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" }, { "transactionIndex": 0, @@ -1988,7 +1988,7 @@ ], "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8", "logIndex": 1, - "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" + "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" }, { "transactionIndex": 0, @@ -2000,7 +2000,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 2, - "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" + "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" }, { "transactionIndex": 0, @@ -2012,7 +2012,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 3, - "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" + "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" }, { "transactionIndex": 0, @@ -2024,7 +2024,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3", "logIndex": 4, - "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" + "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" }, { "transactionIndex": 0, @@ -2038,7 +2038,7 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0x4aaaed3c215ae2131f0c286eea7bdb0cefe52c981d745a31761373a4a9970475" + "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" } ], "blockNumber": 4, @@ -2056,7 +2056,7 @@ "10" ], "numDeployments": 1, - "solcInputHash": "3cf270c0d0efd91caec1ecd679be00ea", + "solcInputHash": "edf7a7fc578491be0baac88ac737a638", "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enteranceFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_daoPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__EnteranceFeeNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotEnoughPayment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"FundProject__TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__UpkeepNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__WithdrawTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__withdrawFund\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NeedEnteranceFee\",\"type\":\"error\"},{\"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\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_projectOwner\",\"type\":\"address\"}],\"name\":\"enteranceFeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectFundingFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectGoesToFunding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectSuccessfullyFunded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_ProjectFundingStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getBalanceOfProject\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"_getProjectStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isApporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_fundingGoalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_projectOwnerAddress\",\"type\":\"address\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEnteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"is_funding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paySubmitFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectToTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"withdrawFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"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.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/AutomationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract AutomationBase {\\n error OnlySimulatedBackend();\\n\\n /**\\n * @notice method that allows it to be simulated via eth_call by checking that\\n * the sender is the zero address.\\n */\\n function preventExecution() internal view {\\n if (tx.origin != address(0)) {\\n revert OnlySimulatedBackend();\\n }\\n }\\n\\n /**\\n * @notice modifier that allows it to be simulated via eth_call by checking\\n * that the sender is the zero address.\\n */\\n modifier cannotExecute() {\\n preventExecution();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x5d354afa1a97dffe66094397cdcbb0c14713cf3d609d88fd8f9891010e9a351a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AutomationBase.sol\\\";\\nimport \\\"./interfaces/AutomationCompatibleInterface.sol\\\";\\n\\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\\n\",\"keccak256\":\"0x40e5ae0eff4edd0740c1b5590d09c344f84dee031e82d5294563e99603774f80\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\\\";\\n\\nerror FundProject__NotApporovedByDao();\\nerror FundProject__UpkeepNeeded();\\nerror FundProject__TransferFailed(uint256 _projectId);\\nerror FundProject__NotEnoughPayment();\\nerror FundProject__withdrawFund();\\nerror FundProject__WithdrawTransferFailed();\\nerror FundProject__EnteranceFeeNeeded();\\n\\ncontract FundProject is Ownable, AutomationCompatibleInterface {\\n enum ProjectFundingStatus {\\n ONPROGRESS,\\n SUCCESS,\\n FAILED,\\n CANCELED\\n }\\n\\n uint256 public projectId = 1;\\n\\n uint public lastTimeStamp;\\n uint256 public daoPercentage;\\n uint256 public enteranceFee;\\n\\n mapping(uint256 => bool) public _isFunding;\\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\\n mapping(uint256 => uint256) public time;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders;\\n mapping(uint256 => uint256) public projectFunds;\\n mapping(uint256 => uint256) public projectFundingGoalAmount;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n mapping(uint256 => address) public projectOwnerAddress;\\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\\n mapping(address => bool) public _isEnteranceFeePaid;\\n\\n event projectSuccessfullyFunded(uint256 indexed _projectId);\\n event projectFundingFailed(uint256 indexed _projectId);\\n event enteranceFeePaid(address indexed _projectOwner);\\n event projectGoesToFunding(uint256 indexed _projectId);\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\\n lastTimeStamp = block.timestamp;\\n daoPercentage = _daoPercentage;\\n enteranceFee = _enteranceFee;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n projectFunds[_projecID] += msg.value;\\n }\\n\\n function apporoveFundingByDao(\\n string memory _ipfsHash,\\n uint256 _fundingGoalAmount,\\n uint256 _time,\\n address _projectOwnerAddress\\n ) external onlyOwner {\\n // only dao can call it\\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\\n revert FundProject__EnteranceFeeNeeded();\\n } else {\\n projectToTime[projectId][_time] = block.timestamp;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\\n time[projectId] = _time;\\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n projectOwnerAddress[projectId] = _projectOwnerAddress;\\n _isApporovedByDao[projectId] = true;\\n _isFunding[projectId] = true;\\n emit projectGoesToFunding(projectId);\\n projectId++;\\n }\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call it\\n _isApporovedByDao[_projecID] = false;\\n _isFunding[projectId] = false;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\\n }\\n\\n function checkUpkeep(\\n bytes memory /* checkData */\\n )\\n public\\n view\\n override\\n returns (\\n bool upkeepNeeded,\\n bytes memory /* performData */\\n )\\n {\\n upkeepNeeded = (_isFunding[projectId] &&\\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\\n projectToTime[projectId][time[projectId]]);\\n }\\n\\n function performUpkeep(\\n bytes calldata /* performData */\\n ) external override {\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\n if (!upkeepNeeded) {\\n revert FundProject__UpkeepNeeded();\\n }\\n _isFunding[projectId] = false;\\n _isApporovedByDao[projectId] = false;\\n\\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\\n 100;\\n (bool success, ) = (projectOwnerAddress[projectId]).call{\\n value: fundsToSent\\n }(\\\"\\\");\\n if (!success) {\\n revert FundProject__TransferFailed(projectFunds[projectId]);\\n }\\n\\n emit projectSuccessfullyFunded(projectId);\\n } else {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\\n emit projectFundingFailed(projectId);\\n }\\n }\\n\\n function paySubmitFee() public payable {\\n if (msg.value < enteranceFee) {\\n revert FundProject__NotEnoughPayment();\\n } else {\\n _isEnteranceFeePaid[msg.sender] = true;\\n emit enteranceFeePaid(msg.sender);\\n }\\n }\\n\\n function withdrawFund(uint256 _projectID) public {\\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\\n uint256 fundToSent = funders[_projectID][msg.sender];\\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\\n \\\"\\\"\\n );\\n if (!success) {\\n revert FundProject__WithdrawTransferFailed();\\n }\\n } else {\\n revert FundProject__withdrawFund();\\n }\\n }\\n\\n function _isApporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n\\n function _getBalanceOfProject(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFunds[_projecID];\\n }\\n\\n function _getFundingGoalAmount(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFundingGoalAmount[_projecID];\\n }\\n\\n function is_funding(uint256 _projectID) public view returns (bool) {\\n return _isFunding[_projectID];\\n }\\n\\n function _getProjectStatus(uint256 _projectID)\\n public\\n view\\n returns (ProjectFundingStatus)\\n {\\n return _ProjectFundingStatus[_projectID];\\n }\\n\\n function getEnteranceFee() public view returns (uint256) {\\n return enteranceFee;\\n }\\n\\n function isEnteranceFeePaid(address account) public view returns (bool) {\\n return _isEnteranceFeePaid[account];\\n }\\n}\\n\",\"keccak256\":\"0x7d2d6bff2be12dc301152566f3eb52b2fcede1f35d28b494928f530da9dac90a\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\nimport \\\"./FundProject.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl,\\n FundProject\\n{\\n error GovernerContract__NeedEnteranceFee();\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage,\\n uint256 _enteranceFee,\\n uint256 _daoPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n FundProject(_enteranceFee, _daoPercentage)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n if (!_isEnteranceFeePaid[msg.sender]) {\\n revert GovernerContract__NeedEnteranceFee();\\n }\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x1713670032ac0e6e45120b9ea97b9727a23883448ec04fc1f6722a7c8520c8be\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x6101606040526001600d553480156200001757600080fd5b5060405162009f4f38038062009f4f83398181016040528101906200003d919062000bff565b818187858a898960006040518060400160405280601081526020017f476f7665726e6572436f6e747261637400000000000000000000000000000000815250806200008d6200022660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f68184846200026360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000150919062000f22565b505062000163836200029f60201b60201c565b6200017482620002e660201b60201c565b62000185816200037360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001cf81620003ba60201b60201c565b50620001e1816200059960201b60201c565b5062000202620001f66200063a60201b60201c565b6200064260201b60201c565b42600e8190555080600f81905550816010819055505050505050505050506200142d565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200028095949392919062001046565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051620002d4929190620010a3565b60405180910390a18060048190555050565b600081116200032c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003239062001157565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405162000361929190620010a3565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051620003a8929190620010a3565b60405180910390a18060068190555050565b620003ca6200070860201b60201c565b8111156200040f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004069062001215565b60405180910390fd5b6000620004216200071160201b60201c565b9050600081141580156200043d57506000600960000180549050145b156200053d5760096000016040518060400160405280600063ffffffff16815260200162000476846200074960201b620036951760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000558826009620007b760201b620037001790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200058d929190620010a3565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ee92919062001237565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064905090565b6000806009600001805490501462000740576200073a6009620009f560201b620039021760201c565b62000744565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a690620012da565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620007d986620009f560201b60201c565b90506000821180156200083557504386600001600184620007fb91906200132b565b815481106200080f576200080e62001366565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008d95762000851856200074960201b620036951760201c565b866000016001846200086491906200132b565b8154811062000878576200087762001366565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009e6565b856000016040518060400160405280620008fe4362000a9760201b6200399d1760201c565b63ffffffff1681526020016200091f886200074960201b620036951760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811462000a6e578260000160018262000a1e91906200132b565b8154811062000a325762000a3162001366565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000a71565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff801682111562000ae5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000adc906200140b565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b1f8262000af2565b9050919050565b600062000b338262000b12565b9050919050565b62000b458162000b26565b811462000b5157600080fd5b50565b60008151905062000b658162000b3a565b92915050565b600062000b788262000af2565b9050919050565b600062000b8c8262000b6b565b9050919050565b62000b9e8162000b7f565b811462000baa57600080fd5b50565b60008151905062000bbe8162000b93565b92915050565b6000819050919050565b62000bd98162000bc4565b811462000be557600080fd5b50565b60008151905062000bf98162000bce565b92915050565b600080600080600080600060e0888a03121562000c215762000c2062000aed565b5b600062000c318a828b0162000b54565b975050602062000c448a828b0162000bad565b965050604062000c578a828b0162000be8565b955050606062000c6a8a828b0162000be8565b945050608062000c7d8a828b0162000be8565b93505060a062000c908a828b0162000be8565b92505060c062000ca38a828b0162000be8565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d3457607f821691505b60208210810362000d4a5762000d4962000cec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000db47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d75565b62000dc0868362000d75565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000e0362000dfd62000df78462000bc4565b62000dd8565b62000bc4565b9050919050565b6000819050919050565b62000e1f8362000de2565b62000e3762000e2e8262000e0a565b84845462000d82565b825550505050565b600090565b62000e4e62000e3f565b62000e5b81848462000e14565b505050565b5b8181101562000e835762000e7760008262000e44565b60018101905062000e61565b5050565b601f82111562000ed25762000e9c8162000d50565b62000ea78462000d65565b8101602085101562000eb7578190505b62000ecf62000ec68562000d65565b83018262000e60565b50505b505050565b600082821c905092915050565b600062000ef76000198460080262000ed7565b1980831691505092915050565b600062000f12838362000ee4565b9150826002028217905092915050565b62000f2d8262000cb2565b67ffffffffffffffff81111562000f495762000f4862000cbd565b5b62000f55825462000d1b565b62000f6282828562000e87565b600060209050601f83116001811462000f9a576000841562000f85578287015190505b62000f91858262000f04565b86555062001001565b601f19841662000faa8662000d50565b60005b8281101562000fd45784890151825560018201915060208501945060208101905062000fad565b8683101562000ff4578489015162000ff0601f89168262000ee4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6200101e8162001009565b82525050565b6200102f8162000bc4565b82525050565b620010408162000b12565b82525050565b600060a0820190506200105d600083018862001013565b6200106c602083018762001013565b6200107b604083018662001013565b6200108a606083018562001024565b62001099608083018462001035565b9695505050505050565b6000604082019050620010ba600083018562001024565b620010c9602083018462001024565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200113f602783620010d0565b91506200114c82620010e1565b604082019050919050565b60006020820190508181036000830152620011728162001130565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620011fd604383620010d0565b91506200120a8262001179565b606082019050919050565b600060208201905081810360008301526200123081620011ee565b9050919050565b60006040820190506200124e600083018562001035565b6200125d602083018462001035565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620012c2602783620010d0565b9150620012cf8262001264565b604082019050919050565b60006020820190508181036000830152620012f581620012b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013388262000bc4565b9150620013458362000bc4565b925082820390508181111562001360576200135f620012fc565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620013f3602683620010d0565b9150620014008262001395565b604082019050919050565b600060208201905081810360008301526200142681620013e4565b9050919050565b60805160a05160c05160e051610100516101205161014051618ab9620014966000396000818161359a0152818161488d0152614b0101526000614dc701526000614e0901526000614de801526000614d1d01526000614d7301526000614d9c0152618ab96000f3fe60806040526004361061044b5760003560e01c80637b3c71d311610234578063c01f9e371161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e6114611336578063f2fde38b14611373578063f8ce560a1461139c578063fc0c546a146113d9578063fea856a11461140457610491565b8063deaaa7cc1461123f578063e0c410cc1461126a578063ea0217cf146112a7578063eb9019d4146112d0578063ece40cc11461130d57610491565b8063ca1d209d116100fd578063ca1d209d14611153578063cf6862591461116f578063d33219b4146111ac578063dc73204b146111d7578063dd4e2ba51461121457610491565b8063c01f9e3714611073578063c0d55329146110b0578063c28bc2fa146110ed578063c59057e41461111657610491565b806397c3d334116101bc578063abe1aae611610180578063abe1aae614610f54578063b58131b014610f91578063b59d18a014610fbc578063bba9c21914610ff9578063bc197c811461103657610491565b806397c3d33414610e5b5780639a802a6d14610e86578063a7713a7014610ec3578063a890c91014610eee578063ab58fb8e14610f1757610491565b806387030f4d1161020357806387030f4d14610d625780638da5cb5b14610d8b5780638fb5548f14610db6578063902bfa2414610df357806396aa167e14610e3057610491565b80637b3c71d314610c805780637d5e81e214610cbd578063809b268e14610cfa578063868661cb14610d3757610491565b80633fafa127116103455780635b6b4652116102cd5780636ee8e8ef116102915780636ee8e8ef14610b8957806370084d7a14610bc657806370b0f66014610c03578063715018a614610c2c578063794d556014610c4357610491565b80635b6b465214610a575780635ced7d4014610a945780635f398a1414610ad157806360c4247f14610b0e5780636e04ff0d14610b4b57610491565b80634fac2bb7116103145780634fac2bb714610948578063535bf50f14610985578063544ffc9c146109b057806354fd4d50146109ef5780635678138814610a1a57610491565b80633fafa1271461087a57806343859632146108a5578063446a156f146108e25780634585e33b1461091f57610491565b8063156277be116103d35780633932abb1116103975780633932abb1146107815780633bccf4fd146107ac5780633be2f2a3146107e95780633e4f49e6146108125780633f3b3b271461084f57610491565b8063156277be1461066f578063160cbed7146106ac5780632656227d146106e95780632d63f693146107195780632fe3e2611461075657610491565b806306fdde031161041a57806306fdde03146105645780630cee17251461058f578063141a6c22146105b8578063148038b0146105f5578063150b7a021461063257610491565b806301ffc9a71461049657806302a251a3146104d357806303420181146104fe57806306f3f9e61461053b57610491565b36610491573073ffffffffffffffffffffffffffffffffffffffff1661046f61140e565b73ffffffffffffffffffffffffffffffffffffffff161461048f57600080fd5b005b600080fd5b3480156104a257600080fd5b506104bd60048036038101906104b89190615a0c565b61141d565b6040516104ca9190615a54565b60405180910390f35b3480156104df57600080fd5b506104e861142f565b6040516104f59190615a88565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190615ce4565b61143e565b6040516105329190615a88565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190615dc2565b611523565b005b34801561057057600080fd5b5061057961161a565b6040516105869190615e6e565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190615dc2565b6116ac565b005b3480156105c457600080fd5b506105df60048036038101906105da9190615f31565b61182c565b6040516105ec9190615a88565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190615fd8565b611854565b6040516106299190615a88565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190616018565b611879565b60405161066691906160aa565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190615dc2565b61188d565b6040516106a391906160d4565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190616356565b6118c0565b6040516106e09190615a88565b60405180910390f35b61070360048036038101906106fe9190616356565b611b7a565b6040516107109190615a88565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190615dc2565b611cc7565b60405161074d9190615a88565b60405180910390f35b34801561076257600080fd5b5061076b611d35565b6040516107789190616420565b60405180910390f35b34801561078d57600080fd5b50610796611d59565b6040516107a39190615a88565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061643b565b611d68565b6040516107e09190615a88565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906164b6565b611df2565b005b34801561081e57600080fd5b5061083960048036038101906108349190615dc2565b61205f565b60405161084691906165b0565b60405180910390f35b34801561085b57600080fd5b50610864612071565b6040516108719190615a88565b60405180910390f35b34801561088657600080fd5b5061088f612077565b60405161089c9190615a88565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190615fd8565b61207d565b6040516108d99190615a54565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190615dc2565b6120e8565b6040516109169190616613565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190616684565b612112565b005b34801561095457600080fd5b5061096f600480360381019061096a9190615dc2565b612406565b60405161097c9190615a54565b60405180910390f35b34801561099157600080fd5b5061099a612426565b6040516109a79190615a88565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d29190615dc2565b612430565b6040516109e6939291906166d1565b60405180910390f35b3480156109fb57600080fd5b50610a04612468565b604051610a119190615e6e565b60405180910390f35b348015610a2657600080fd5b50610a416004803603810190610a3c9190616708565b6124a5565b604051610a4e9190615a88565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190615dc2565b6124d6565b604051610a8b9190615a88565b60405180910390f35b348015610aa057600080fd5b50610abb6004803603810190610ab69190615dc2565b6124ee565b604051610ac89190615a88565b60405180910390f35b348015610add57600080fd5b50610af86004803603810190610af39190616748565b612506565b604051610b059190615a88565b60405180910390f35b348015610b1a57600080fd5b50610b356004803603810190610b309190615dc2565b612570565b604051610b429190615a88565b60405180910390f35b348015610b5757600080fd5b50610b726004803603810190610b6d91906167ec565b6126bc565b604051610b8092919061688a565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab91906168ba565b612776565b604051610bbd9190615a54565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be89190615dc2565b612796565b604051610bfa9190616613565b60405180910390f35b348015610c0f57600080fd5b50610c2a6004803603810190610c259190615dc2565b6127b6565b005b348015610c3857600080fd5b50610c416128ad565b005b348015610c4f57600080fd5b50610c6a6004803603810190610c659190615dc2565b6128c1565b604051610c779190615a88565b60405180910390f35b348015610c8c57600080fd5b50610ca76004803603810190610ca291906168e7565b6128d9565b604051610cb49190615a88565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf919061695b565b612941565b604051610cf19190615a88565b60405180910390f35b348015610d0657600080fd5b50610d216004803603810190610d1c9190615dc2565b6129dc565b604051610d2e9190615a54565b60405180910390f35b348015610d4357600080fd5b50610d4c612a06565b604051610d599190615a88565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d849190615dc2565b612a0c565b005b348015610d9757600080fd5b50610da0612aaf565b604051610dad91906160d4565b60405180910390f35b348015610dc257600080fd5b50610ddd6004803603810190610dd89190615dc2565b612ad9565b604051610dea9190615e6e565b60405180910390f35b348015610dff57600080fd5b50610e1a6004803603810190610e159190615dc2565b612b79565b604051610e279190615a54565b60405180910390f35b348015610e3c57600080fd5b50610e45612b99565b604051610e529190615a88565b60405180910390f35b348015610e6757600080fd5b50610e70612b9f565b604051610e7d9190615a88565b60405180910390f35b348015610e9257600080fd5b50610ead6004803603810190610ea89190616a32565b612ba8565b604051610eba9190615a88565b60405180910390f35b348015610ecf57600080fd5b50610ed8612bbe565b604051610ee59190615a88565b60405180910390f35b348015610efa57600080fd5b50610f156004803603810190610f109190616af1565b612be7565b005b348015610f2357600080fd5b50610f3e6004803603810190610f399190615dc2565b612cde565b604051610f4b9190615a88565b60405180910390f35b348015610f6057600080fd5b50610f7b6004803603810190610f769190615dc2565b612dab565b604051610f889190615e6e565b60405180910390f35b348015610f9d57600080fd5b50610fa6612e50565b604051610fb39190615a88565b60405180910390f35b348015610fc857600080fd5b50610fe36004803603810190610fde9190615dc2565b612e5f565b604051610ff09190615a88565b60405180910390f35b34801561100557600080fd5b50611020600480360381019061101b9190615dc2565b612e7c565b60405161102d9190615a88565b60405180910390f35b34801561104257600080fd5b5061105d60048036038101906110589190616b1e565b612e99565b60405161106a91906160aa565b60405180910390f35b34801561107f57600080fd5b5061109a60048036038101906110959190615dc2565b612eae565b6040516110a79190615a88565b60405180910390f35b3480156110bc57600080fd5b506110d760048036038101906110d291906168ba565b612f1c565b6040516110e49190615a54565b60405180910390f35b3480156110f957600080fd5b50611114600480360381019061110f9190616bed565b612f72565b005b34801561112257600080fd5b5061113d60048036038101906111389190616356565b6130b3565b60405161114a9190615a88565b60405180910390f35b61116d60048036038101906111689190615dc2565b6130ef565b005b34801561117b57600080fd5b5061119660048036038101906111919190615f31565b6131dc565b6040516111a39190615a88565b60405180910390f35b3480156111b857600080fd5b506111c161320a565b6040516111ce91906160d4565b60405180910390f35b3480156111e357600080fd5b506111fe60048036038101906111f99190616c61565b613234565b60405161120b9190615a88565b60405180910390f35b34801561122057600080fd5b50611229613259565b6040516112369190615e6e565b60405180910390f35b34801561124b57600080fd5b50611254613296565b6040516112619190616420565b60405180910390f35b34801561127657600080fd5b50611291600480360381019061128c9190615dc2565b6132ba565b60405161129e9190615a54565b60405180910390f35b3480156112b357600080fd5b506112ce60048036038101906112c99190615dc2565b6132e4565b005b3480156112dc57600080fd5b506112f760048036038101906112f29190616ca1565b6133db565b6040516113049190615a88565b60405180910390f35b34801561131957600080fd5b50611334600480360381019061132f9190615dc2565b6133f7565b005b34801561134257600080fd5b5061135d60048036038101906113589190616ce1565b6134ee565b60405161136a91906160aa565b60405180910390f35b34801561137f57600080fd5b5061139a600480360381019061139591906168ba565b613503565b005b3480156113a857600080fd5b506113c360048036038101906113be9190615dc2565b613586565b6040516113d09190615a88565b60405180910390f35b3480156113e557600080fd5b506113ee613598565b6040516113fb9190616dd7565b60405180910390f35b61140c6135bc565b005b60006114186139f0565b905090565b600061142882613a1a565b9050919050565b6000611439613a94565b905090565b6000806114c16114b97fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c60405161147a929190616e22565b60405180910390208b8051906020012060405160200161149e959493929190616e4a565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b90506115148a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613ae3565b91505098975050505050505050565b61152b61140e565b73ffffffffffffffffffffffffffffffffffffffff16611549613c9f565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115be61140e565b73ffffffffffffffffffffffffffffffffffffffff161461160e5760006115e3613ca7565b6040516115f1929190616e22565b604051809103902090505b806116076002613cb4565b036115fc57505b61161781613d90565b50565b60606000805461162990616f38565b80601f016020809104026020016040519081016040528092919081815260200182805461165590616f38565b80156116a25780601f10611677576101008083540402835291602001916116a2565b820191906000526020600020905b81548152906001019060200180831161168557829003601f168201915b5050505050905090565b600260038111156116c0576116bf616539565b5b601b600083815260200190815260200160002060009054906101000a900460ff1660038111156116f3576116f2616539565b5b036117f75760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161177390616f8f565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50509050806117f0576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611829565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600060148260405161183e9190616fe0565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806118cf868686866130b3565b9050600460078111156118e5576118e4616539565b5b6118ee8261205f565b6007811115611900576118ff616539565b5b14611940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193790617069565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d3919061709e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611a3995949392919061739b565b602060405180830381865afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a9190617418565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611af796959493929190617445565b600060405180830381600087803b158015611b1157600080fd5b505af1158015611b25573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b5791906174ea565b604051611b6592919061751e565b60405180910390a18192505050949350505050565b600080611b89868686866130b3565b90506000611b968261205f565b905060046007811115611bac57611bab616539565b5b816007811115611bbf57611bbe616539565b5b1480611bef575060056007811115611bda57611bd9616539565b5b816007811115611bed57611bec616539565b5b145b611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590617069565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c8b9190615a88565b60405180910390a1611ca08288888888613f44565b611cad8288888888614027565b611cba828888888861403b565b8192505050949350505050565b6000611d24600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d636140a4565b905090565b600080611dc9611dc17f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611da693929190617547565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b9050611de6878288604051806020016040528060008152506140ae565b91505095945050505050565b611dfa6140ce565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e7d576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611ee157611ee0616539565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d54601485604051611f2d9190616fe0565b9081526020016040518091039020819055508360156000600d5481526020019081526020016000209081611f619190617720565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d6000815480929190612054906177f2565b919050555050505050565b600061206a8261414c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061212c604051806020016040528060008152506126bc565b50905080612166576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600060196000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060186000600d5481526020019081526020016000205460176000600d548152602001908152602001600020541115612393576001601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561222d5761222c616539565b5b021790555060006064600f5460176000600d54815260200190815260200160002054612259919061783a565b61226391906178ab565b90506000601a6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516122c090616f8f565b60006040518083038185875af1925050503d80600081146122fd576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b606091505b505090508061235d5760176000600d548152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016123549190615a88565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612401565b6002601b6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156123cc576123cb616539565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806124b0613c9f565b90506124cd848285604051806020016040528060008152506140ae565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b600080612511613c9f565b905061256487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613ae3565b91505095945050505050565b600080600960000180549050905060008103612591576008549150506126b7565b600060096000016001836125a591906178dc565b815481106125b6576125b5617910565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161269e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506126b7565b6126b284600961431f90919063ffffffff16565b925050505b919050565b6000606060116000600d54815260200190815260200160002060009054906101000a900460ff16801561276f575060126000600d548152602001908152602001600020600060136000600d5481526020019081526020016000205481526020019081526020016000205460126000600d548152602001908152602001600020600060136000600d548152602001908152602001600020548152602001908152602001600020544261276d91906178dc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b6127be61140e565b73ffffffffffffffffffffffffffffffffffffffff166127dc613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661285161140e565b73ffffffffffffffffffffffffffffffffffffffff16146128a1576000612876613ca7565b604051612884929190616e22565b604051809103902090505b8061289a6002613cb4565b0361288f57505b6128aa81614477565b50565b6128b56140ce565b6128bf60006144bc565b565b60176020528060005260406000206000915090505481565b6000806128e4613c9f565b905061293686828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506140ae565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129c6576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129d285858585614582565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612a146140ce565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612aa757612aa6616539565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612af890616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2490616f38565b8015612b715780601f10612b4657610100808354040283529160200191612b71565b820191906000526020600020905b815481529060010190602001808311612b5457829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612bb5848484614889565b90509392505050565b60008060096000018054905014612bde57612bd96009613902565b612be2565b6008545b905090565b612bef61140e565b73ffffffffffffffffffffffffffffffffffffffff16612c0d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612c8261140e565b73ffffffffffffffffffffffffffffffffffffffff1614612cd2576000612ca7613ca7565b604051612cb5929190616e22565b604051809103902090505b80612ccb6002613cb4565b03612cc057505b612cdb81614930565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612d4f9190616420565b602060405180830381865afa158015612d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d90919061709e565b905060018114612da05780612da3565b60005b915050919050565b6060601560008381526020019081526020016000208054612dcb90616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612df790616f38565b8015612e445780601f10612e1957610100808354040283529160200191612e44565b820191906000526020600020905b815481529060010190602001808311612e2757829003601f168201915b50505050509050919050565b6000612e5a6149cf565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612f0b600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612f7a61140e565b73ffffffffffffffffffffffffffffffffffffffff16612f98613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661300d61140e565b73ffffffffffffffffffffffffffffffffffffffff161461305d576000613032613ca7565b604051613040929190616e22565b604051809103902090505b806130566002613cb4565b0361304b57505b6130ac8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856149d9565b5050505050565b6000848484846040516020016130cc949392919061793f565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff16613147576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a791906174ea565b92505081905550346017600084815260200190815260200160002060008282546131d191906174ea565b925050819055505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6132ec61140e565b73ffffffffffffffffffffffffffffffffffffffff1661330a613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335790616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661337f61140e565b73ffffffffffffffffffffffffffffffffffffffff16146133cf5760006133a4613ca7565b6040516133b2929190616e22565b604051809103902090505b806133c86002613cb4565b036133bd57505b6133d881614a08565b50565b60006133ef83836133ea614a90565b614889565b905092915050565b6133ff61140e565b73ffffffffffffffffffffffffffffffffffffffff1661341d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661349261140e565b73ffffffffffffffffffffffffffffffffffffffff16146134e25760006134b7613ca7565b6040516134c5929190616e22565b604051809103902090505b806134db6002613cb4565b036134d057505b6134eb81614aa7565b50565b600063f23a6e6160e01b905095945050505050565b61350b6140ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361357a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357190617a0b565b60405180910390fd5b613583816144bc565b50565b600061359182614aec565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543410156135f8576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156136f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ef90617a9d565b60405180910390fd5b819050919050565b600080600084600001805490509050600061371a86613902565b90506000821180156137705750438660000160018461373991906178dc565b8154811061374a57613749617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156138005761377e85613695565b8660000160018461378f91906178dc565b815481106137a05761379f617910565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506138f3565b8560000160405180604001604052806138184361399d565b63ffffffff16815260200161382c88613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613974578260000160018261392891906178dc565b8154811061393957613938617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613977565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156139e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139df90617b2f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a8d5750613a8c82614bb4565b5b9050919050565b6000600554905090565b6000613ab1613aab614d19565b83614e33565b9050919050565b6000806000613ac987878787614e66565b91509150613ad681614f72565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613b0f57613b0e616539565b5b613b188861205f565b6007811115613b2a57613b29616539565b5b14613b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6190617bc1565b60405180910390fd5b6000613bc987613bb9846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff1686614889565b9050613bd8888888848861513e565b6000845103613c3a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613c2d9493929190617be1565b60405180910390a2613c91565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613c88959493929190617c2d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613cbf82615342565b15613cf6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613d98612b9f565b811115613dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd190617d26565b60405180910390fd5b6000613de4612bbe565b905060008114158015613dff57506000600960000180549050145b15613ef15760096000016040518060400160405280600063ffffffff168152602001613e2a84613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613f0582600961370090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613f3892919061751e565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613f6361140e565b73ffffffffffffffffffffffffffffffffffffffff16146140205760005b845181101561401e573073ffffffffffffffffffffffffffffffffffffffff16858281518110613fb457613fb3617910565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361400d5761400c838281518110613fed57613fec617910565b5b602002602001015180519060200120600261537790919063ffffffff16565b5b80614017906177f2565b9050613f81565b505b5050505050565b61403485858585856153f3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661405a61140e565b73ffffffffffffffffffffffffffffffffffffffff161461408f5761407f6002615342565b61408e5761408d6002615491565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006140c4858585856140bf614a90565b613ae3565b9050949350505050565b6140d6613c9f565b73ffffffffffffffffffffffffffffffffffffffff166140f4612aaf565b73ffffffffffffffffffffffffffffffffffffffff161461414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161414190617d92565b60405180910390fd5b565b60008061415883615512565b90506004600781111561416e5761416d616539565b5b81600781111561418157614180616539565b5b1461418f578091505061431a565b6000600b60008581526020019081526020016000205490506000801b81036141bb57819250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016142169190616420565b602060405180830381865afa158015614233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142579190617dde565b156142675760079250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016142c29190616420565b602060405180830381865afa1580156142df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143039190617dde565b156143135760059250505061431a565b6002925050505b919050565b6000438210614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90617e57565b60405180910390fd5b60008360000180549050905060005b818110156143e75760006143868284615626565b90508486600001828154811061439f5761439e617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156143d1578092506143e1565b6001816143de91906174ea565b91505b50614372565b6000821461444c578460000160018361440091906178dc565b8154811061441157614410617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661444f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516144aa92919061751e565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061458c612e50565b6145a9614597613c9f565b6001436145a491906178dc565b6133db565b10156145ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145e190617ee9565b60405180910390fd5b60006145ff86868686805190602001206130b3565b90508451865114614645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161463c90617f7b565b60405180910390fd5b8351865114614689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468090617f7b565b60405180910390fd5b60008651116146cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146c490617fe7565b60405180910390fd5b600060016000838152602001908152602001600020905061472d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061564c565b61476c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161476390618079565b60405180910390fd5b600061477e614779611d59565b615666565b61478743615666565b61479191906180ad565b905060006147a56147a061142f565b615666565b826147b091906180ad565b90506147c882846000016156bd90919063ffffffff16565b6147de81846001016156bd90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614808613c9f565b8b8b8d5167ffffffffffffffff81111561482557614824615b83565b5b60405190808252806020026020018201604052801561485857816020015b60608152602001906001900390816148435790505b508c88888e60405161487299989796959493929190618226565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016148e69291906182d6565b602060405180830381865afa158015614903573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614927919061709e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516149839291906182ff565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606149ff848484604051806060016040528060298152602001618a5b602991396156ec565b90509392505050565b60008111614a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a429061839a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614a7e92919061751e565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614ada92919061751e565b60405180910390a18060068190555050565b6000614af6612b9f565b614aff83612570565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614b589190615a88565b602060405180830381865afa158015614b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b99919061709e565b614ba3919061783a565b614bad91906178ab565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614c9a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d0257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d125750614d1182615800565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614d9557507f000000000000000000000000000000000000000000000000000000000000000046145b15614dc2577f00000000000000000000000000000000000000000000000000000000000000009050614e30565b614e2d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061586a565b90505b90565b60008282604051602001614e48929190618427565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614ea1576000600391509150614f69565b601b8560ff1614158015614eb95750601c8560ff1614155b15614ecb576000600491509150614f69565b600060018787878760405160008152602001604052604051614ef0949392919061845e565b6020604051602081039080840390855afa158015614f12573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614f6057600060019250925050614f69565b80600092509250505b94509492505050565b60006004811115614f8657614f85616539565b5b816004811115614f9957614f98616539565b5b031561513b5760016004811115614fb357614fb2616539565b5b816004811115614fc657614fc5616539565b5b03615006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ffd906184ef565b60405180910390fd5b6002600481111561501a57615019616539565b5b81600481111561502d5761502c616539565b5b0361506d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150649061855b565b60405180910390fd5b6003600481111561508157615080616539565b5b81600481111561509457615093616539565b5b036150d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150cb906185ed565b60405180910390fd5b6004808111156150e7576150e6616539565b5b8160048111156150fa576150f9616539565b5b0361513a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151319061867f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156151e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151db90618711565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561525257615251616539565b5b60ff168460ff160361527e578281600001600082825461527291906174ea565b9250508190555061533a565b6001600281111561529257615291616539565b5b60ff168460ff16036152be57828160010160008282546152b291906174ea565b92505081905550615339565b6002808111156152d1576152d0616539565b5b60ff168460ff16036152fd57828160020160008282546152f191906174ea565b92505081905550615338565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161532f906187a3565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161545895949392919061739b565b6000604051808303818588803b15801561547157600080fd5b505af1158015615485573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561554b576007915050615621565b8060020160019054906101000a900460ff161561556c576002915050615621565b600061557784611cc7565b9050600081036155bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155b39061880f565b60405180910390fd5b4381106155ce57600092505050615621565b60006155d985612eae565b90504381106155ee5760019350505050615621565b6155f7856158a4565b80156156085750615607856158eb565b5b156156195760049350505050615621565b600393505050505b919050565b6000600282841861563791906178ab565b82841661564491906174ea565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff80168211156156b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016156ac906188a1565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161572890618933565b60405180910390fd5b61573a85615916565b615779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709061899f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516157a291906189f0565b60006040518083038185875af1925050503d80600081146157df576040519150601f19603f3d011682016040523d82523d6000602084013e6157e4565b606091505b50915091506157f4828286615939565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615885959493929190618a07565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546158d091906174ea565b6158e16158dc85611cc7565b613586565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561594957829050615999565b60008351111561595c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159909190615e6e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6159e9816159b4565b81146159f457600080fd5b50565b600081359050615a06816159e0565b92915050565b600060208284031215615a2257615a216159aa565b5b6000615a30848285016159f7565b91505092915050565b60008115159050919050565b615a4e81615a39565b82525050565b6000602082019050615a696000830184615a45565b92915050565b6000819050919050565b615a8281615a6f565b82525050565b6000602082019050615a9d6000830184615a79565b92915050565b615aac81615a6f565b8114615ab757600080fd5b50565b600081359050615ac981615aa3565b92915050565b600060ff82169050919050565b615ae581615acf565b8114615af057600080fd5b50565b600081359050615b0281615adc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615b2d57615b2c615b08565b5b8235905067ffffffffffffffff811115615b4a57615b49615b0d565b5b602083019150836001820283011115615b6657615b65615b12565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615bbb82615b72565b810181811067ffffffffffffffff82111715615bda57615bd9615b83565b5b80604052505050565b6000615bed6159a0565b9050615bf98282615bb2565b919050565b600067ffffffffffffffff821115615c1957615c18615b83565b5b615c2282615b72565b9050602081019050919050565b82818337600083830152505050565b6000615c51615c4c84615bfe565b615be3565b905082815260208101848484011115615c6d57615c6c615b6d565b5b615c78848285615c2f565b509392505050565b600082601f830112615c9557615c94615b08565b5b8135615ca5848260208601615c3e565b91505092915050565b6000819050919050565b615cc181615cae565b8114615ccc57600080fd5b50565b600081359050615cde81615cb8565b92915050565b60008060008060008060008060e0898b031215615d0457615d036159aa565b5b6000615d128b828c01615aba565b9850506020615d238b828c01615af3565b975050604089013567ffffffffffffffff811115615d4457615d436159af565b5b615d508b828c01615b17565b9650965050606089013567ffffffffffffffff811115615d7357615d726159af565b5b615d7f8b828c01615c80565b9450506080615d908b828c01615af3565b93505060a0615da18b828c01615ccf565b92505060c0615db28b828c01615ccf565b9150509295985092959890939650565b600060208284031215615dd857615dd76159aa565b5b6000615de684828501615aba565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615e29578082015181840152602081019050615e0e565b60008484015250505050565b6000615e4082615def565b615e4a8185615dfa565b9350615e5a818560208601615e0b565b615e6381615b72565b840191505092915050565b60006020820190508181036000830152615e888184615e35565b905092915050565b600067ffffffffffffffff821115615eab57615eaa615b83565b5b615eb482615b72565b9050602081019050919050565b6000615ed4615ecf84615e90565b615be3565b905082815260208101848484011115615ef057615eef615b6d565b5b615efb848285615c2f565b509392505050565b600082601f830112615f1857615f17615b08565b5b8135615f28848260208601615ec1565b91505092915050565b600060208284031215615f4757615f466159aa565b5b600082013567ffffffffffffffff811115615f6557615f646159af565b5b615f7184828501615f03565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615fa582615f7a565b9050919050565b615fb581615f9a565b8114615fc057600080fd5b50565b600081359050615fd281615fac565b92915050565b60008060408385031215615fef57615fee6159aa565b5b6000615ffd85828601615aba565b925050602061600e85828601615fc3565b9150509250929050565b60008060008060808587031215616032576160316159aa565b5b600061604087828801615fc3565b945050602061605187828801615fc3565b935050604061606287828801615aba565b925050606085013567ffffffffffffffff811115616083576160826159af565b5b61608f87828801615c80565b91505092959194509250565b6160a4816159b4565b82525050565b60006020820190506160bf600083018461609b565b92915050565b6160ce81615f9a565b82525050565b60006020820190506160e960008301846160c5565b92915050565b600067ffffffffffffffff82111561610a57616109615b83565b5b602082029050602081019050919050565b600061612e616129846160ef565b615be3565b9050808382526020820190506020840283018581111561615157616150615b12565b5b835b8181101561617a57806161668882615fc3565b845260208401935050602081019050616153565b5050509392505050565b600082601f83011261619957616198615b08565b5b81356161a984826020860161611b565b91505092915050565b600067ffffffffffffffff8211156161cd576161cc615b83565b5b602082029050602081019050919050565b60006161f16161ec846161b2565b615be3565b9050808382526020820190506020840283018581111561621457616213615b12565b5b835b8181101561623d57806162298882615aba565b845260208401935050602081019050616216565b5050509392505050565b600082601f83011261625c5761625b615b08565b5b813561626c8482602086016161de565b91505092915050565b600067ffffffffffffffff8211156162905761628f615b83565b5b602082029050602081019050919050565b60006162b46162af84616275565b615be3565b905080838252602082019050602084028301858111156162d7576162d6615b12565b5b835b8181101561631e57803567ffffffffffffffff8111156162fc576162fb615b08565b5b8086016163098982615c80565b855260208501945050506020810190506162d9565b5050509392505050565b600082601f83011261633d5761633c615b08565b5b813561634d8482602086016162a1565b91505092915050565b600080600080608085870312156163705761636f6159aa565b5b600085013567ffffffffffffffff81111561638e5761638d6159af565b5b61639a87828801616184565b945050602085013567ffffffffffffffff8111156163bb576163ba6159af565b5b6163c787828801616247565b935050604085013567ffffffffffffffff8111156163e8576163e76159af565b5b6163f487828801616328565b925050606061640587828801615ccf565b91505092959194509250565b61641a81615cae565b82525050565b60006020820190506164356000830184616411565b92915050565b600080600080600060a08688031215616457576164566159aa565b5b600061646588828901615aba565b955050602061647688828901615af3565b945050604061648788828901615af3565b935050606061649888828901615ccf565b92505060806164a988828901615ccf565b9150509295509295909350565b600080600080608085870312156164d0576164cf6159aa565b5b600085013567ffffffffffffffff8111156164ee576164ed6159af565b5b6164fa87828801615f03565b945050602061650b87828801615aba565b935050604061651c87828801615aba565b925050606061652d87828801615fc3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061657957616578616539565b5b50565b600081905061658a82616568565b919050565b600061659a8261657c565b9050919050565b6165aa8161658f565b82525050565b60006020820190506165c560008301846165a1565b92915050565b600481106165dc576165db616539565b5b50565b60008190506165ed826165cb565b919050565b60006165fd826165df565b9050919050565b61660d816165f2565b82525050565b60006020820190506166286000830184616604565b92915050565b60008083601f84011261664457616643615b08565b5b8235905067ffffffffffffffff81111561666157616660615b0d565b5b60208301915083600182028301111561667d5761667c615b12565b5b9250929050565b6000806020838503121561669b5761669a6159aa565b5b600083013567ffffffffffffffff8111156166b9576166b86159af565b5b6166c58582860161662e565b92509250509250929050565b60006060820190506166e66000830186615a79565b6166f36020830185615a79565b6167006040830184615a79565b949350505050565b6000806040838503121561671f5761671e6159aa565b5b600061672d85828601615aba565b925050602061673e85828601615af3565b9150509250929050565b600080600080600060808688031215616764576167636159aa565b5b600061677288828901615aba565b955050602061678388828901615af3565b945050604086013567ffffffffffffffff8111156167a4576167a36159af565b5b6167b088828901615b17565b9350935050606086013567ffffffffffffffff8111156167d3576167d26159af565b5b6167df88828901615c80565b9150509295509295909350565b600060208284031215616802576168016159aa565b5b600082013567ffffffffffffffff8111156168205761681f6159af565b5b61682c84828501615c80565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061685c82616835565b6168668185616840565b9350616876818560208601615e0b565b61687f81615b72565b840191505092915050565b600060408201905061689f6000830185615a45565b81810360208301526168b18184616851565b90509392505050565b6000602082840312156168d0576168cf6159aa565b5b60006168de84828501615fc3565b91505092915050565b60008060008060608587031215616901576169006159aa565b5b600061690f87828801615aba565b945050602061692087828801615af3565b935050604085013567ffffffffffffffff811115616941576169406159af565b5b61694d87828801615b17565b925092505092959194509250565b60008060008060808587031215616975576169746159aa565b5b600085013567ffffffffffffffff811115616993576169926159af565b5b61699f87828801616184565b945050602085013567ffffffffffffffff8111156169c0576169bf6159af565b5b6169cc87828801616247565b935050604085013567ffffffffffffffff8111156169ed576169ec6159af565b5b6169f987828801616328565b925050606085013567ffffffffffffffff811115616a1a57616a196159af565b5b616a2687828801615f03565b91505092959194509250565b600080600060608486031215616a4b57616a4a6159aa565b5b6000616a5986828701615fc3565b9350506020616a6a86828701615aba565b925050604084013567ffffffffffffffff811115616a8b57616a8a6159af565b5b616a9786828701615c80565b9150509250925092565b6000616aac82615f7a565b9050919050565b6000616abe82616aa1565b9050919050565b616ace81616ab3565b8114616ad957600080fd5b50565b600081359050616aeb81616ac5565b92915050565b600060208284031215616b0757616b066159aa565b5b6000616b1584828501616adc565b91505092915050565b600080600080600060a08688031215616b3a57616b396159aa565b5b6000616b4888828901615fc3565b9550506020616b5988828901615fc3565b945050604086013567ffffffffffffffff811115616b7a57616b796159af565b5b616b8688828901616247565b935050606086013567ffffffffffffffff811115616ba757616ba66159af565b5b616bb388828901616247565b925050608086013567ffffffffffffffff811115616bd457616bd36159af565b5b616be088828901615c80565b9150509295509295909350565b60008060008060608587031215616c0757616c066159aa565b5b6000616c1587828801615fc3565b9450506020616c2687828801615aba565b935050604085013567ffffffffffffffff811115616c4757616c466159af565b5b616c538782880161662e565b925092505092959194509250565b60008060408385031215616c7857616c776159aa565b5b6000616c8685828601615aba565b9250506020616c9785828601615aba565b9150509250929050565b60008060408385031215616cb857616cb76159aa565b5b6000616cc685828601615fc3565b9250506020616cd785828601615aba565b9150509250929050565b600080600080600060a08688031215616cfd57616cfc6159aa565b5b6000616d0b88828901615fc3565b9550506020616d1c88828901615fc3565b9450506040616d2d88828901615aba565b9350506060616d3e88828901615aba565b925050608086013567ffffffffffffffff811115616d5f57616d5e6159af565b5b616d6b88828901615c80565b9150509295509295909350565b6000819050919050565b6000616d9d616d98616d9384615f7a565b616d78565b615f7a565b9050919050565b6000616daf82616d82565b9050919050565b6000616dc182616da4565b9050919050565b616dd181616db6565b82525050565b6000602082019050616dec6000830184616dc8565b92915050565b600081905092915050565b6000616e098385616df2565b9350616e16838584615c2f565b82840190509392505050565b6000616e2f828486616dfd565b91508190509392505050565b616e4481615acf565b82525050565b600060a082019050616e5f6000830188616411565b616e6c6020830187615a79565b616e796040830186616e3b565b616e866060830185616411565b616e936080830184616411565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616ed3601883615dfa565b9150616ede82616e9d565b602082019050919050565b60006020820190508181036000830152616f0281616ec6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616f5057607f821691505b602082108103616f6357616f62616f09565b5b50919050565b50565b6000616f79600083616df2565b9150616f8482616f69565b600082019050919050565b6000616f9a82616f6c565b9150819050919050565b600081905092915050565b6000616fba82615def565b616fc48185616fa4565b9350616fd4818560208601615e0b565b80840191505092915050565b6000616fec8284616faf565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000617053602183615dfa565b915061705e82616ff7565b604082019050919050565b6000602082019050818103600083015261708281617046565b9050919050565b60008151905061709881615aa3565b92915050565b6000602082840312156170b4576170b36159aa565b5b60006170c284828501617089565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61710081615f9a565b82525050565b600061711283836170f7565b60208301905092915050565b6000602082019050919050565b6000617136826170cb565b61714081856170d6565b935061714b836170e7565b8060005b8381101561717c5781516171638882617106565b975061716e8361711e565b92505060018101905061714f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6171be81615a6f565b82525050565b60006171d083836171b5565b60208301905092915050565b6000602082019050919050565b60006171f482617189565b6171fe8185617194565b9350617209836171a5565b8060005b8381101561723a57815161722188826171c4565b975061722c836171dc565b92505060018101905061720d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061728f82616835565b6172998185617273565b93506172a9818560208601615e0b565b6172b281615b72565b840191505092915050565b60006172c98383617284565b905092915050565b6000602082019050919050565b60006172e982617247565b6172f38185617252565b93508360208202850161730585617263565b8060005b85811015617341578484038952815161732285826172bd565b945061732d836172d1565b925060208a01995050600181019050617309565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061738561738061737b84617353565b61735d565b615cae565b9050919050565b6173958161736a565b82525050565b600060a08201905081810360008301526173b5818861712b565b905081810360208301526173c981876171e9565b905081810360408301526173dd81866172de565b90506173ec606083018561738c565b6173f96080830184616411565b9695505050505050565b60008151905061741281615cb8565b92915050565b60006020828403121561742e5761742d6159aa565b5b600061743c84828501617403565b91505092915050565b600060c082019050818103600083015261745f818961712b565b9050818103602083015261747381886171e9565b9050818103604083015261748781876172de565b9050617496606083018661738c565b6174a36080830185616411565b6174b060a0830184615a79565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006174f582615a6f565b915061750083615a6f565b9250828201905080821115617518576175176174bb565b5b92915050565b60006040820190506175336000830185615a79565b6175406020830184615a79565b9392505050565b600060608201905061755c6000830186616411565b6175696020830185615a79565b6175766040830184616e3b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026175e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826175a3565b6175ea86836175a3565b95508019841693508086168417925050509392505050565b600061761d61761861761384615a6f565b616d78565b615a6f565b9050919050565b6000819050919050565b61763783617602565b61764b61764382617624565b8484546175b0565b825550505050565b600090565b617660617653565b61766b81848461762e565b505050565b5b8181101561768f57617684600082617658565b600181019050617671565b5050565b601f8211156176d4576176a58161757e565b6176ae84617593565b810160208510156176bd578190505b6176d16176c985617593565b830182617670565b50505b505050565b600082821c905092915050565b60006176f7600019846008026176d9565b1980831691505092915050565b600061771083836176e6565b9150826002028217905092915050565b61772982615def565b67ffffffffffffffff81111561774257617741615b83565b5b61774c8254616f38565b617757828285617693565b600060209050601f83116001811461778a5760008415617778578287015190505b6177828582617704565b8655506177ea565b601f1984166177988661757e565b60005b828110156177c05784890151825560018201915060208501945060208101905061779b565b868310156177dd57848901516177d9601f8916826176e6565b8355505b6001600288020188555050505b505050505050565b60006177fd82615a6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361782f5761782e6174bb565b5b600182019050919050565b600061784582615a6f565b915061785083615a6f565b925082820261785e81615a6f565b91508282048414831517617875576178746174bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006178b682615a6f565b91506178c183615a6f565b9250826178d1576178d061787c565b5b828204905092915050565b60006178e782615a6f565b91506178f283615a6f565b925082820390508181111561790a576179096174bb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152617959818761712b565b9050818103602083015261796d81866171e9565b9050818103604083015261798181856172de565b90506179906060830184616411565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006179f5602683615dfa565b9150617a0082617999565b604082019050919050565b60006020820190508181036000830152617a24816179e8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617a87602783615dfa565b9150617a9282617a2b565b604082019050919050565b60006020820190508181036000830152617ab681617a7a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000617b19602683615dfa565b9150617b2482617abd565b604082019050919050565b60006020820190508181036000830152617b4881617b0c565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000617bab602383615dfa565b9150617bb682617b4f565b604082019050919050565b60006020820190508181036000830152617bda81617b9e565b9050919050565b6000608082019050617bf66000830187615a79565b617c036020830186616e3b565b617c106040830185615a79565b8181036060830152617c228184615e35565b905095945050505050565b600060a082019050617c426000830188615a79565b617c4f6020830187616e3b565b617c5c6040830186615a79565b8181036060830152617c6e8185615e35565b90508181036080830152617c828184616851565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617d10604383615dfa565b9150617d1b82617c8e565b606082019050919050565b60006020820190508181036000830152617d3f81617d03565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617d7c602083615dfa565b9150617d8782617d46565b602082019050919050565b60006020820190508181036000830152617dab81617d6f565b9050919050565b617dbb81615a39565b8114617dc657600080fd5b50565b600081519050617dd881617db2565b92915050565b600060208284031215617df457617df36159aa565b5b6000617e0284828501617dc9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617e41602083615dfa565b9150617e4c82617e0b565b602082019050919050565b60006020820190508181036000830152617e7081617e34565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617ed3603183615dfa565b9150617ede82617e77565b604082019050919050565b60006020820190508181036000830152617f0281617ec6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617f65602183615dfa565b9150617f7082617f09565b604082019050919050565b60006020820190508181036000830152617f9481617f58565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617fd1601883615dfa565b9150617fdc82617f9b565b602082019050919050565b6000602082019050818103600083015261800081617fc4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000618063602183615dfa565b915061806e82618007565b604082019050919050565b6000602082019050818103600083015261809281618056565b9050919050565b600067ffffffffffffffff82169050919050565b60006180b882618099565b91506180c383618099565b9250828201905067ffffffffffffffff8111156180e3576180e26174bb565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061813182615def565b61813b8185618115565b935061814b818560208601615e0b565b61815481615b72565b840191505092915050565b600061816b8383618126565b905092915050565b6000602082019050919050565b600061818b826180e9565b61819581856180f4565b9350836020820285016181a785618105565b8060005b858110156181e357848403895281516181c4858261815f565b94506181cf83618173565b925060208a019950506001810190506181ab565b50829750879550505050505092915050565b600061821061820b61820684618099565b616d78565b615a6f565b9050919050565b618220816181f5565b82525050565b60006101208201905061823c600083018c615a79565b618249602083018b6160c5565b818103604083015261825b818a61712b565b9050818103606083015261826f81896171e9565b905081810360808301526182838188618180565b905081810360a083015261829781876172de565b90506182a660c0830186618217565b6182b360e0830185618217565b8181036101008301526182c68184615e35565b90509a9950505050505050505050565b60006040820190506182eb60008301856160c5565b6182f86020830184615a79565b9392505050565b600060408201905061831460008301856160c5565b61832160208301846160c5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618384602783615dfa565b915061838f82618328565b604082019050919050565b600060208201905081810360008301526183b381618377565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006183f0600283616fa4565b91506183fb826183ba565b600282019050919050565b6000819050919050565b61842161841c82615cae565b618406565b82525050565b6000618432826183e3565b915061843e8285618410565b60208201915061844e8284618410565b6020820191508190509392505050565b60006080820190506184736000830187616411565b6184806020830186616e3b565b61848d6040830185616411565b61849a6060830184616411565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006184d9601883615dfa565b91506184e4826184a3565b602082019050919050565b60006020820190508181036000830152618508816184cc565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618545601f83615dfa565b91506185508261850f565b602082019050919050565b6000602082019050818103600083015261857481618538565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006185d7602283615dfa565b91506185e28261857b565b604082019050919050565b60006020820190508181036000830152618606816185ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618669602283615dfa565b91506186748261860d565b604082019050919050565b600060208201905081810360008301526186988161865c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006186fb602783615dfa565b91506187068261869f565b604082019050919050565b6000602082019050818103600083015261872a816186ee565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061878d603583615dfa565b915061879882618731565b604082019050919050565b600060208201905081810360008301526187bc81618780565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006187f9601d83615dfa565b9150618804826187c3565b602082019050919050565b60006020820190508181036000830152618828816187ec565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061888b602683615dfa565b91506188968261882f565b604082019050919050565b600060208201905081810360008301526188ba8161887e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061891d602683615dfa565b9150618928826188c1565b604082019050919050565b6000602082019050818103600083015261894c81618910565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618989601d83615dfa565b915061899482618953565b602082019050919050565b600060208201905081810360008301526189b88161897c565b9050919050565b60006189ca82616835565b6189d48185616df2565b93506189e4818560208601615e0b565b80840191505092915050565b60006189fc82846189bf565b915081905092915050565b600060a082019050618a1c6000830188616411565b618a296020830187616411565b618a366040830186616411565b618a436060830185615a79565b618a5060808301846160c5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220dd4edfac69a6afd6aeac0d468ddba6cc40c7263f1a78654ed0f9586c5980bfef64736f6c63430008110033", "deployedBytecode": "0x60806040526004361061044b5760003560e01c80637b3c71d311610234578063c01f9e371161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e6114611336578063f2fde38b14611373578063f8ce560a1461139c578063fc0c546a146113d9578063fea856a11461140457610491565b8063deaaa7cc1461123f578063e0c410cc1461126a578063ea0217cf146112a7578063eb9019d4146112d0578063ece40cc11461130d57610491565b8063ca1d209d116100fd578063ca1d209d14611153578063cf6862591461116f578063d33219b4146111ac578063dc73204b146111d7578063dd4e2ba51461121457610491565b8063c01f9e3714611073578063c0d55329146110b0578063c28bc2fa146110ed578063c59057e41461111657610491565b806397c3d334116101bc578063abe1aae611610180578063abe1aae614610f54578063b58131b014610f91578063b59d18a014610fbc578063bba9c21914610ff9578063bc197c811461103657610491565b806397c3d33414610e5b5780639a802a6d14610e86578063a7713a7014610ec3578063a890c91014610eee578063ab58fb8e14610f1757610491565b806387030f4d1161020357806387030f4d14610d625780638da5cb5b14610d8b5780638fb5548f14610db6578063902bfa2414610df357806396aa167e14610e3057610491565b80637b3c71d314610c805780637d5e81e214610cbd578063809b268e14610cfa578063868661cb14610d3757610491565b80633fafa127116103455780635b6b4652116102cd5780636ee8e8ef116102915780636ee8e8ef14610b8957806370084d7a14610bc657806370b0f66014610c03578063715018a614610c2c578063794d556014610c4357610491565b80635b6b465214610a575780635ced7d4014610a945780635f398a1414610ad157806360c4247f14610b0e5780636e04ff0d14610b4b57610491565b80634fac2bb7116103145780634fac2bb714610948578063535bf50f14610985578063544ffc9c146109b057806354fd4d50146109ef5780635678138814610a1a57610491565b80633fafa1271461087a57806343859632146108a5578063446a156f146108e25780634585e33b1461091f57610491565b8063156277be116103d35780633932abb1116103975780633932abb1146107815780633bccf4fd146107ac5780633be2f2a3146107e95780633e4f49e6146108125780633f3b3b271461084f57610491565b8063156277be1461066f578063160cbed7146106ac5780632656227d146106e95780632d63f693146107195780632fe3e2611461075657610491565b806306fdde031161041a57806306fdde03146105645780630cee17251461058f578063141a6c22146105b8578063148038b0146105f5578063150b7a021461063257610491565b806301ffc9a71461049657806302a251a3146104d357806303420181146104fe57806306f3f9e61461053b57610491565b36610491573073ffffffffffffffffffffffffffffffffffffffff1661046f61140e565b73ffffffffffffffffffffffffffffffffffffffff161461048f57600080fd5b005b600080fd5b3480156104a257600080fd5b506104bd60048036038101906104b89190615a0c565b61141d565b6040516104ca9190615a54565b60405180910390f35b3480156104df57600080fd5b506104e861142f565b6040516104f59190615a88565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190615ce4565b61143e565b6040516105329190615a88565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190615dc2565b611523565b005b34801561057057600080fd5b5061057961161a565b6040516105869190615e6e565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190615dc2565b6116ac565b005b3480156105c457600080fd5b506105df60048036038101906105da9190615f31565b61182c565b6040516105ec9190615a88565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190615fd8565b611854565b6040516106299190615a88565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190616018565b611879565b60405161066691906160aa565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190615dc2565b61188d565b6040516106a391906160d4565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190616356565b6118c0565b6040516106e09190615a88565b60405180910390f35b61070360048036038101906106fe9190616356565b611b7a565b6040516107109190615a88565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190615dc2565b611cc7565b60405161074d9190615a88565b60405180910390f35b34801561076257600080fd5b5061076b611d35565b6040516107789190616420565b60405180910390f35b34801561078d57600080fd5b50610796611d59565b6040516107a39190615a88565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061643b565b611d68565b6040516107e09190615a88565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906164b6565b611df2565b005b34801561081e57600080fd5b5061083960048036038101906108349190615dc2565b61205f565b60405161084691906165b0565b60405180910390f35b34801561085b57600080fd5b50610864612071565b6040516108719190615a88565b60405180910390f35b34801561088657600080fd5b5061088f612077565b60405161089c9190615a88565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190615fd8565b61207d565b6040516108d99190615a54565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190615dc2565b6120e8565b6040516109169190616613565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190616684565b612112565b005b34801561095457600080fd5b5061096f600480360381019061096a9190615dc2565b612406565b60405161097c9190615a54565b60405180910390f35b34801561099157600080fd5b5061099a612426565b6040516109a79190615a88565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d29190615dc2565b612430565b6040516109e6939291906166d1565b60405180910390f35b3480156109fb57600080fd5b50610a04612468565b604051610a119190615e6e565b60405180910390f35b348015610a2657600080fd5b50610a416004803603810190610a3c9190616708565b6124a5565b604051610a4e9190615a88565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190615dc2565b6124d6565b604051610a8b9190615a88565b60405180910390f35b348015610aa057600080fd5b50610abb6004803603810190610ab69190615dc2565b6124ee565b604051610ac89190615a88565b60405180910390f35b348015610add57600080fd5b50610af86004803603810190610af39190616748565b612506565b604051610b059190615a88565b60405180910390f35b348015610b1a57600080fd5b50610b356004803603810190610b309190615dc2565b612570565b604051610b429190615a88565b60405180910390f35b348015610b5757600080fd5b50610b726004803603810190610b6d91906167ec565b6126bc565b604051610b8092919061688a565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab91906168ba565b612776565b604051610bbd9190615a54565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be89190615dc2565b612796565b604051610bfa9190616613565b60405180910390f35b348015610c0f57600080fd5b50610c2a6004803603810190610c259190615dc2565b6127b6565b005b348015610c3857600080fd5b50610c416128ad565b005b348015610c4f57600080fd5b50610c6a6004803603810190610c659190615dc2565b6128c1565b604051610c779190615a88565b60405180910390f35b348015610c8c57600080fd5b50610ca76004803603810190610ca291906168e7565b6128d9565b604051610cb49190615a88565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf919061695b565b612941565b604051610cf19190615a88565b60405180910390f35b348015610d0657600080fd5b50610d216004803603810190610d1c9190615dc2565b6129dc565b604051610d2e9190615a54565b60405180910390f35b348015610d4357600080fd5b50610d4c612a06565b604051610d599190615a88565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d849190615dc2565b612a0c565b005b348015610d9757600080fd5b50610da0612aaf565b604051610dad91906160d4565b60405180910390f35b348015610dc257600080fd5b50610ddd6004803603810190610dd89190615dc2565b612ad9565b604051610dea9190615e6e565b60405180910390f35b348015610dff57600080fd5b50610e1a6004803603810190610e159190615dc2565b612b79565b604051610e279190615a54565b60405180910390f35b348015610e3c57600080fd5b50610e45612b99565b604051610e529190615a88565b60405180910390f35b348015610e6757600080fd5b50610e70612b9f565b604051610e7d9190615a88565b60405180910390f35b348015610e9257600080fd5b50610ead6004803603810190610ea89190616a32565b612ba8565b604051610eba9190615a88565b60405180910390f35b348015610ecf57600080fd5b50610ed8612bbe565b604051610ee59190615a88565b60405180910390f35b348015610efa57600080fd5b50610f156004803603810190610f109190616af1565b612be7565b005b348015610f2357600080fd5b50610f3e6004803603810190610f399190615dc2565b612cde565b604051610f4b9190615a88565b60405180910390f35b348015610f6057600080fd5b50610f7b6004803603810190610f769190615dc2565b612dab565b604051610f889190615e6e565b60405180910390f35b348015610f9d57600080fd5b50610fa6612e50565b604051610fb39190615a88565b60405180910390f35b348015610fc857600080fd5b50610fe36004803603810190610fde9190615dc2565b612e5f565b604051610ff09190615a88565b60405180910390f35b34801561100557600080fd5b50611020600480360381019061101b9190615dc2565b612e7c565b60405161102d9190615a88565b60405180910390f35b34801561104257600080fd5b5061105d60048036038101906110589190616b1e565b612e99565b60405161106a91906160aa565b60405180910390f35b34801561107f57600080fd5b5061109a60048036038101906110959190615dc2565b612eae565b6040516110a79190615a88565b60405180910390f35b3480156110bc57600080fd5b506110d760048036038101906110d291906168ba565b612f1c565b6040516110e49190615a54565b60405180910390f35b3480156110f957600080fd5b50611114600480360381019061110f9190616bed565b612f72565b005b34801561112257600080fd5b5061113d60048036038101906111389190616356565b6130b3565b60405161114a9190615a88565b60405180910390f35b61116d60048036038101906111689190615dc2565b6130ef565b005b34801561117b57600080fd5b5061119660048036038101906111919190615f31565b6131dc565b6040516111a39190615a88565b60405180910390f35b3480156111b857600080fd5b506111c161320a565b6040516111ce91906160d4565b60405180910390f35b3480156111e357600080fd5b506111fe60048036038101906111f99190616c61565b613234565b60405161120b9190615a88565b60405180910390f35b34801561122057600080fd5b50611229613259565b6040516112369190615e6e565b60405180910390f35b34801561124b57600080fd5b50611254613296565b6040516112619190616420565b60405180910390f35b34801561127657600080fd5b50611291600480360381019061128c9190615dc2565b6132ba565b60405161129e9190615a54565b60405180910390f35b3480156112b357600080fd5b506112ce60048036038101906112c99190615dc2565b6132e4565b005b3480156112dc57600080fd5b506112f760048036038101906112f29190616ca1565b6133db565b6040516113049190615a88565b60405180910390f35b34801561131957600080fd5b50611334600480360381019061132f9190615dc2565b6133f7565b005b34801561134257600080fd5b5061135d60048036038101906113589190616ce1565b6134ee565b60405161136a91906160aa565b60405180910390f35b34801561137f57600080fd5b5061139a600480360381019061139591906168ba565b613503565b005b3480156113a857600080fd5b506113c360048036038101906113be9190615dc2565b613586565b6040516113d09190615a88565b60405180910390f35b3480156113e557600080fd5b506113ee613598565b6040516113fb9190616dd7565b60405180910390f35b61140c6135bc565b005b60006114186139f0565b905090565b600061142882613a1a565b9050919050565b6000611439613a94565b905090565b6000806114c16114b97fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c60405161147a929190616e22565b60405180910390208b8051906020012060405160200161149e959493929190616e4a565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b90506115148a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613ae3565b91505098975050505050505050565b61152b61140e565b73ffffffffffffffffffffffffffffffffffffffff16611549613c9f565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115be61140e565b73ffffffffffffffffffffffffffffffffffffffff161461160e5760006115e3613ca7565b6040516115f1929190616e22565b604051809103902090505b806116076002613cb4565b036115fc57505b61161781613d90565b50565b60606000805461162990616f38565b80601f016020809104026020016040519081016040528092919081815260200182805461165590616f38565b80156116a25780601f10611677576101008083540402835291602001916116a2565b820191906000526020600020905b81548152906001019060200180831161168557829003601f168201915b5050505050905090565b600260038111156116c0576116bf616539565b5b601b600083815260200190815260200160002060009054906101000a900460ff1660038111156116f3576116f2616539565b5b036117f75760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161177390616f8f565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50509050806117f0576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611829565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600060148260405161183e9190616fe0565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806118cf868686866130b3565b9050600460078111156118e5576118e4616539565b5b6118ee8261205f565b6007811115611900576118ff616539565b5b14611940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193790617069565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d3919061709e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611a3995949392919061739b565b602060405180830381865afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a9190617418565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611af796959493929190617445565b600060405180830381600087803b158015611b1157600080fd5b505af1158015611b25573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b5791906174ea565b604051611b6592919061751e565b60405180910390a18192505050949350505050565b600080611b89868686866130b3565b90506000611b968261205f565b905060046007811115611bac57611bab616539565b5b816007811115611bbf57611bbe616539565b5b1480611bef575060056007811115611bda57611bd9616539565b5b816007811115611bed57611bec616539565b5b145b611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590617069565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c8b9190615a88565b60405180910390a1611ca08288888888613f44565b611cad8288888888614027565b611cba828888888861403b565b8192505050949350505050565b6000611d24600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d636140a4565b905090565b600080611dc9611dc17f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611da693929190617547565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b9050611de6878288604051806020016040528060008152506140ae565b91505095945050505050565b611dfa6140ce565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e7d576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611ee157611ee0616539565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d54601485604051611f2d9190616fe0565b9081526020016040518091039020819055508360156000600d5481526020019081526020016000209081611f619190617720565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d6000815480929190612054906177f2565b919050555050505050565b600061206a8261414c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061212c604051806020016040528060008152506126bc565b50905080612166576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600060196000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060186000600d5481526020019081526020016000205460176000600d548152602001908152602001600020541115612393576001601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561222d5761222c616539565b5b021790555060006064600f5460176000600d54815260200190815260200160002054612259919061783a565b61226391906178ab565b90506000601a6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516122c090616f8f565b60006040518083038185875af1925050503d80600081146122fd576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b606091505b505090508061235d5760176000600d548152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016123549190615a88565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612401565b6002601b6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156123cc576123cb616539565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806124b0613c9f565b90506124cd848285604051806020016040528060008152506140ae565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b600080612511613c9f565b905061256487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613ae3565b91505095945050505050565b600080600960000180549050905060008103612591576008549150506126b7565b600060096000016001836125a591906178dc565b815481106125b6576125b5617910565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161269e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506126b7565b6126b284600961431f90919063ffffffff16565b925050505b919050565b6000606060116000600d54815260200190815260200160002060009054906101000a900460ff16801561276f575060126000600d548152602001908152602001600020600060136000600d5481526020019081526020016000205481526020019081526020016000205460126000600d548152602001908152602001600020600060136000600d548152602001908152602001600020548152602001908152602001600020544261276d91906178dc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b6127be61140e565b73ffffffffffffffffffffffffffffffffffffffff166127dc613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661285161140e565b73ffffffffffffffffffffffffffffffffffffffff16146128a1576000612876613ca7565b604051612884929190616e22565b604051809103902090505b8061289a6002613cb4565b0361288f57505b6128aa81614477565b50565b6128b56140ce565b6128bf60006144bc565b565b60176020528060005260406000206000915090505481565b6000806128e4613c9f565b905061293686828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506140ae565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129c6576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129d285858585614582565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612a146140ce565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612aa757612aa6616539565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612af890616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2490616f38565b8015612b715780601f10612b4657610100808354040283529160200191612b71565b820191906000526020600020905b815481529060010190602001808311612b5457829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612bb5848484614889565b90509392505050565b60008060096000018054905014612bde57612bd96009613902565b612be2565b6008545b905090565b612bef61140e565b73ffffffffffffffffffffffffffffffffffffffff16612c0d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612c8261140e565b73ffffffffffffffffffffffffffffffffffffffff1614612cd2576000612ca7613ca7565b604051612cb5929190616e22565b604051809103902090505b80612ccb6002613cb4565b03612cc057505b612cdb81614930565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612d4f9190616420565b602060405180830381865afa158015612d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d90919061709e565b905060018114612da05780612da3565b60005b915050919050565b6060601560008381526020019081526020016000208054612dcb90616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612df790616f38565b8015612e445780601f10612e1957610100808354040283529160200191612e44565b820191906000526020600020905b815481529060010190602001808311612e2757829003601f168201915b50505050509050919050565b6000612e5a6149cf565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612f0b600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612f7a61140e565b73ffffffffffffffffffffffffffffffffffffffff16612f98613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661300d61140e565b73ffffffffffffffffffffffffffffffffffffffff161461305d576000613032613ca7565b604051613040929190616e22565b604051809103902090505b806130566002613cb4565b0361304b57505b6130ac8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856149d9565b5050505050565b6000848484846040516020016130cc949392919061793f565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff16613147576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a791906174ea565b92505081905550346017600084815260200190815260200160002060008282546131d191906174ea565b925050819055505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6132ec61140e565b73ffffffffffffffffffffffffffffffffffffffff1661330a613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335790616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661337f61140e565b73ffffffffffffffffffffffffffffffffffffffff16146133cf5760006133a4613ca7565b6040516133b2929190616e22565b604051809103902090505b806133c86002613cb4565b036133bd57505b6133d881614a08565b50565b60006133ef83836133ea614a90565b614889565b905092915050565b6133ff61140e565b73ffffffffffffffffffffffffffffffffffffffff1661341d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661349261140e565b73ffffffffffffffffffffffffffffffffffffffff16146134e25760006134b7613ca7565b6040516134c5929190616e22565b604051809103902090505b806134db6002613cb4565b036134d057505b6134eb81614aa7565b50565b600063f23a6e6160e01b905095945050505050565b61350b6140ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361357a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357190617a0b565b60405180910390fd5b613583816144bc565b50565b600061359182614aec565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543410156135f8576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156136f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ef90617a9d565b60405180910390fd5b819050919050565b600080600084600001805490509050600061371a86613902565b90506000821180156137705750438660000160018461373991906178dc565b8154811061374a57613749617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156138005761377e85613695565b8660000160018461378f91906178dc565b815481106137a05761379f617910565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506138f3565b8560000160405180604001604052806138184361399d565b63ffffffff16815260200161382c88613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613974578260000160018261392891906178dc565b8154811061393957613938617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613977565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156139e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139df90617b2f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a8d5750613a8c82614bb4565b5b9050919050565b6000600554905090565b6000613ab1613aab614d19565b83614e33565b9050919050565b6000806000613ac987878787614e66565b91509150613ad681614f72565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613b0f57613b0e616539565b5b613b188861205f565b6007811115613b2a57613b29616539565b5b14613b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6190617bc1565b60405180910390fd5b6000613bc987613bb9846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff1686614889565b9050613bd8888888848861513e565b6000845103613c3a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613c2d9493929190617be1565b60405180910390a2613c91565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613c88959493929190617c2d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613cbf82615342565b15613cf6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613d98612b9f565b811115613dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd190617d26565b60405180910390fd5b6000613de4612bbe565b905060008114158015613dff57506000600960000180549050145b15613ef15760096000016040518060400160405280600063ffffffff168152602001613e2a84613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613f0582600961370090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613f3892919061751e565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613f6361140e565b73ffffffffffffffffffffffffffffffffffffffff16146140205760005b845181101561401e573073ffffffffffffffffffffffffffffffffffffffff16858281518110613fb457613fb3617910565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361400d5761400c838281518110613fed57613fec617910565b5b602002602001015180519060200120600261537790919063ffffffff16565b5b80614017906177f2565b9050613f81565b505b5050505050565b61403485858585856153f3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661405a61140e565b73ffffffffffffffffffffffffffffffffffffffff161461408f5761407f6002615342565b61408e5761408d6002615491565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006140c4858585856140bf614a90565b613ae3565b9050949350505050565b6140d6613c9f565b73ffffffffffffffffffffffffffffffffffffffff166140f4612aaf565b73ffffffffffffffffffffffffffffffffffffffff161461414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161414190617d92565b60405180910390fd5b565b60008061415883615512565b90506004600781111561416e5761416d616539565b5b81600781111561418157614180616539565b5b1461418f578091505061431a565b6000600b60008581526020019081526020016000205490506000801b81036141bb57819250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016142169190616420565b602060405180830381865afa158015614233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142579190617dde565b156142675760079250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016142c29190616420565b602060405180830381865afa1580156142df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143039190617dde565b156143135760059250505061431a565b6002925050505b919050565b6000438210614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90617e57565b60405180910390fd5b60008360000180549050905060005b818110156143e75760006143868284615626565b90508486600001828154811061439f5761439e617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156143d1578092506143e1565b6001816143de91906174ea565b91505b50614372565b6000821461444c578460000160018361440091906178dc565b8154811061441157614410617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661444f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516144aa92919061751e565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061458c612e50565b6145a9614597613c9f565b6001436145a491906178dc565b6133db565b10156145ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145e190617ee9565b60405180910390fd5b60006145ff86868686805190602001206130b3565b90508451865114614645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161463c90617f7b565b60405180910390fd5b8351865114614689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468090617f7b565b60405180910390fd5b60008651116146cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146c490617fe7565b60405180910390fd5b600060016000838152602001908152602001600020905061472d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061564c565b61476c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161476390618079565b60405180910390fd5b600061477e614779611d59565b615666565b61478743615666565b61479191906180ad565b905060006147a56147a061142f565b615666565b826147b091906180ad565b90506147c882846000016156bd90919063ffffffff16565b6147de81846001016156bd90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614808613c9f565b8b8b8d5167ffffffffffffffff81111561482557614824615b83565b5b60405190808252806020026020018201604052801561485857816020015b60608152602001906001900390816148435790505b508c88888e60405161487299989796959493929190618226565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016148e69291906182d6565b602060405180830381865afa158015614903573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614927919061709e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516149839291906182ff565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606149ff848484604051806060016040528060298152602001618a5b602991396156ec565b90509392505050565b60008111614a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a429061839a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614a7e92919061751e565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614ada92919061751e565b60405180910390a18060068190555050565b6000614af6612b9f565b614aff83612570565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614b589190615a88565b602060405180830381865afa158015614b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b99919061709e565b614ba3919061783a565b614bad91906178ab565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614c9a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d0257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d125750614d1182615800565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614d9557507f000000000000000000000000000000000000000000000000000000000000000046145b15614dc2577f00000000000000000000000000000000000000000000000000000000000000009050614e30565b614e2d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061586a565b90505b90565b60008282604051602001614e48929190618427565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614ea1576000600391509150614f69565b601b8560ff1614158015614eb95750601c8560ff1614155b15614ecb576000600491509150614f69565b600060018787878760405160008152602001604052604051614ef0949392919061845e565b6020604051602081039080840390855afa158015614f12573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614f6057600060019250925050614f69565b80600092509250505b94509492505050565b60006004811115614f8657614f85616539565b5b816004811115614f9957614f98616539565b5b031561513b5760016004811115614fb357614fb2616539565b5b816004811115614fc657614fc5616539565b5b03615006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ffd906184ef565b60405180910390fd5b6002600481111561501a57615019616539565b5b81600481111561502d5761502c616539565b5b0361506d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150649061855b565b60405180910390fd5b6003600481111561508157615080616539565b5b81600481111561509457615093616539565b5b036150d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150cb906185ed565b60405180910390fd5b6004808111156150e7576150e6616539565b5b8160048111156150fa576150f9616539565b5b0361513a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151319061867f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156151e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151db90618711565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561525257615251616539565b5b60ff168460ff160361527e578281600001600082825461527291906174ea565b9250508190555061533a565b6001600281111561529257615291616539565b5b60ff168460ff16036152be57828160010160008282546152b291906174ea565b92505081905550615339565b6002808111156152d1576152d0616539565b5b60ff168460ff16036152fd57828160020160008282546152f191906174ea565b92505081905550615338565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161532f906187a3565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161545895949392919061739b565b6000604051808303818588803b15801561547157600080fd5b505af1158015615485573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561554b576007915050615621565b8060020160019054906101000a900460ff161561556c576002915050615621565b600061557784611cc7565b9050600081036155bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155b39061880f565b60405180910390fd5b4381106155ce57600092505050615621565b60006155d985612eae565b90504381106155ee5760019350505050615621565b6155f7856158a4565b80156156085750615607856158eb565b5b156156195760049350505050615621565b600393505050505b919050565b6000600282841861563791906178ab565b82841661564491906174ea565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff80168211156156b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016156ac906188a1565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161572890618933565b60405180910390fd5b61573a85615916565b615779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709061899f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516157a291906189f0565b60006040518083038185875af1925050503d80600081146157df576040519150601f19603f3d011682016040523d82523d6000602084013e6157e4565b606091505b50915091506157f4828286615939565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615885959493929190618a07565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546158d091906174ea565b6158e16158dc85611cc7565b613586565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561594957829050615999565b60008351111561595c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159909190615e6e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6159e9816159b4565b81146159f457600080fd5b50565b600081359050615a06816159e0565b92915050565b600060208284031215615a2257615a216159aa565b5b6000615a30848285016159f7565b91505092915050565b60008115159050919050565b615a4e81615a39565b82525050565b6000602082019050615a696000830184615a45565b92915050565b6000819050919050565b615a8281615a6f565b82525050565b6000602082019050615a9d6000830184615a79565b92915050565b615aac81615a6f565b8114615ab757600080fd5b50565b600081359050615ac981615aa3565b92915050565b600060ff82169050919050565b615ae581615acf565b8114615af057600080fd5b50565b600081359050615b0281615adc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615b2d57615b2c615b08565b5b8235905067ffffffffffffffff811115615b4a57615b49615b0d565b5b602083019150836001820283011115615b6657615b65615b12565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615bbb82615b72565b810181811067ffffffffffffffff82111715615bda57615bd9615b83565b5b80604052505050565b6000615bed6159a0565b9050615bf98282615bb2565b919050565b600067ffffffffffffffff821115615c1957615c18615b83565b5b615c2282615b72565b9050602081019050919050565b82818337600083830152505050565b6000615c51615c4c84615bfe565b615be3565b905082815260208101848484011115615c6d57615c6c615b6d565b5b615c78848285615c2f565b509392505050565b600082601f830112615c9557615c94615b08565b5b8135615ca5848260208601615c3e565b91505092915050565b6000819050919050565b615cc181615cae565b8114615ccc57600080fd5b50565b600081359050615cde81615cb8565b92915050565b60008060008060008060008060e0898b031215615d0457615d036159aa565b5b6000615d128b828c01615aba565b9850506020615d238b828c01615af3565b975050604089013567ffffffffffffffff811115615d4457615d436159af565b5b615d508b828c01615b17565b9650965050606089013567ffffffffffffffff811115615d7357615d726159af565b5b615d7f8b828c01615c80565b9450506080615d908b828c01615af3565b93505060a0615da18b828c01615ccf565b92505060c0615db28b828c01615ccf565b9150509295985092959890939650565b600060208284031215615dd857615dd76159aa565b5b6000615de684828501615aba565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615e29578082015181840152602081019050615e0e565b60008484015250505050565b6000615e4082615def565b615e4a8185615dfa565b9350615e5a818560208601615e0b565b615e6381615b72565b840191505092915050565b60006020820190508181036000830152615e888184615e35565b905092915050565b600067ffffffffffffffff821115615eab57615eaa615b83565b5b615eb482615b72565b9050602081019050919050565b6000615ed4615ecf84615e90565b615be3565b905082815260208101848484011115615ef057615eef615b6d565b5b615efb848285615c2f565b509392505050565b600082601f830112615f1857615f17615b08565b5b8135615f28848260208601615ec1565b91505092915050565b600060208284031215615f4757615f466159aa565b5b600082013567ffffffffffffffff811115615f6557615f646159af565b5b615f7184828501615f03565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615fa582615f7a565b9050919050565b615fb581615f9a565b8114615fc057600080fd5b50565b600081359050615fd281615fac565b92915050565b60008060408385031215615fef57615fee6159aa565b5b6000615ffd85828601615aba565b925050602061600e85828601615fc3565b9150509250929050565b60008060008060808587031215616032576160316159aa565b5b600061604087828801615fc3565b945050602061605187828801615fc3565b935050604061606287828801615aba565b925050606085013567ffffffffffffffff811115616083576160826159af565b5b61608f87828801615c80565b91505092959194509250565b6160a4816159b4565b82525050565b60006020820190506160bf600083018461609b565b92915050565b6160ce81615f9a565b82525050565b60006020820190506160e960008301846160c5565b92915050565b600067ffffffffffffffff82111561610a57616109615b83565b5b602082029050602081019050919050565b600061612e616129846160ef565b615be3565b9050808382526020820190506020840283018581111561615157616150615b12565b5b835b8181101561617a57806161668882615fc3565b845260208401935050602081019050616153565b5050509392505050565b600082601f83011261619957616198615b08565b5b81356161a984826020860161611b565b91505092915050565b600067ffffffffffffffff8211156161cd576161cc615b83565b5b602082029050602081019050919050565b60006161f16161ec846161b2565b615be3565b9050808382526020820190506020840283018581111561621457616213615b12565b5b835b8181101561623d57806162298882615aba565b845260208401935050602081019050616216565b5050509392505050565b600082601f83011261625c5761625b615b08565b5b813561626c8482602086016161de565b91505092915050565b600067ffffffffffffffff8211156162905761628f615b83565b5b602082029050602081019050919050565b60006162b46162af84616275565b615be3565b905080838252602082019050602084028301858111156162d7576162d6615b12565b5b835b8181101561631e57803567ffffffffffffffff8111156162fc576162fb615b08565b5b8086016163098982615c80565b855260208501945050506020810190506162d9565b5050509392505050565b600082601f83011261633d5761633c615b08565b5b813561634d8482602086016162a1565b91505092915050565b600080600080608085870312156163705761636f6159aa565b5b600085013567ffffffffffffffff81111561638e5761638d6159af565b5b61639a87828801616184565b945050602085013567ffffffffffffffff8111156163bb576163ba6159af565b5b6163c787828801616247565b935050604085013567ffffffffffffffff8111156163e8576163e76159af565b5b6163f487828801616328565b925050606061640587828801615ccf565b91505092959194509250565b61641a81615cae565b82525050565b60006020820190506164356000830184616411565b92915050565b600080600080600060a08688031215616457576164566159aa565b5b600061646588828901615aba565b955050602061647688828901615af3565b945050604061648788828901615af3565b935050606061649888828901615ccf565b92505060806164a988828901615ccf565b9150509295509295909350565b600080600080608085870312156164d0576164cf6159aa565b5b600085013567ffffffffffffffff8111156164ee576164ed6159af565b5b6164fa87828801615f03565b945050602061650b87828801615aba565b935050604061651c87828801615aba565b925050606061652d87828801615fc3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061657957616578616539565b5b50565b600081905061658a82616568565b919050565b600061659a8261657c565b9050919050565b6165aa8161658f565b82525050565b60006020820190506165c560008301846165a1565b92915050565b600481106165dc576165db616539565b5b50565b60008190506165ed826165cb565b919050565b60006165fd826165df565b9050919050565b61660d816165f2565b82525050565b60006020820190506166286000830184616604565b92915050565b60008083601f84011261664457616643615b08565b5b8235905067ffffffffffffffff81111561666157616660615b0d565b5b60208301915083600182028301111561667d5761667c615b12565b5b9250929050565b6000806020838503121561669b5761669a6159aa565b5b600083013567ffffffffffffffff8111156166b9576166b86159af565b5b6166c58582860161662e565b92509250509250929050565b60006060820190506166e66000830186615a79565b6166f36020830185615a79565b6167006040830184615a79565b949350505050565b6000806040838503121561671f5761671e6159aa565b5b600061672d85828601615aba565b925050602061673e85828601615af3565b9150509250929050565b600080600080600060808688031215616764576167636159aa565b5b600061677288828901615aba565b955050602061678388828901615af3565b945050604086013567ffffffffffffffff8111156167a4576167a36159af565b5b6167b088828901615b17565b9350935050606086013567ffffffffffffffff8111156167d3576167d26159af565b5b6167df88828901615c80565b9150509295509295909350565b600060208284031215616802576168016159aa565b5b600082013567ffffffffffffffff8111156168205761681f6159af565b5b61682c84828501615c80565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061685c82616835565b6168668185616840565b9350616876818560208601615e0b565b61687f81615b72565b840191505092915050565b600060408201905061689f6000830185615a45565b81810360208301526168b18184616851565b90509392505050565b6000602082840312156168d0576168cf6159aa565b5b60006168de84828501615fc3565b91505092915050565b60008060008060608587031215616901576169006159aa565b5b600061690f87828801615aba565b945050602061692087828801615af3565b935050604085013567ffffffffffffffff811115616941576169406159af565b5b61694d87828801615b17565b925092505092959194509250565b60008060008060808587031215616975576169746159aa565b5b600085013567ffffffffffffffff811115616993576169926159af565b5b61699f87828801616184565b945050602085013567ffffffffffffffff8111156169c0576169bf6159af565b5b6169cc87828801616247565b935050604085013567ffffffffffffffff8111156169ed576169ec6159af565b5b6169f987828801616328565b925050606085013567ffffffffffffffff811115616a1a57616a196159af565b5b616a2687828801615f03565b91505092959194509250565b600080600060608486031215616a4b57616a4a6159aa565b5b6000616a5986828701615fc3565b9350506020616a6a86828701615aba565b925050604084013567ffffffffffffffff811115616a8b57616a8a6159af565b5b616a9786828701615c80565b9150509250925092565b6000616aac82615f7a565b9050919050565b6000616abe82616aa1565b9050919050565b616ace81616ab3565b8114616ad957600080fd5b50565b600081359050616aeb81616ac5565b92915050565b600060208284031215616b0757616b066159aa565b5b6000616b1584828501616adc565b91505092915050565b600080600080600060a08688031215616b3a57616b396159aa565b5b6000616b4888828901615fc3565b9550506020616b5988828901615fc3565b945050604086013567ffffffffffffffff811115616b7a57616b796159af565b5b616b8688828901616247565b935050606086013567ffffffffffffffff811115616ba757616ba66159af565b5b616bb388828901616247565b925050608086013567ffffffffffffffff811115616bd457616bd36159af565b5b616be088828901615c80565b9150509295509295909350565b60008060008060608587031215616c0757616c066159aa565b5b6000616c1587828801615fc3565b9450506020616c2687828801615aba565b935050604085013567ffffffffffffffff811115616c4757616c466159af565b5b616c538782880161662e565b925092505092959194509250565b60008060408385031215616c7857616c776159aa565b5b6000616c8685828601615aba565b9250506020616c9785828601615aba565b9150509250929050565b60008060408385031215616cb857616cb76159aa565b5b6000616cc685828601615fc3565b9250506020616cd785828601615aba565b9150509250929050565b600080600080600060a08688031215616cfd57616cfc6159aa565b5b6000616d0b88828901615fc3565b9550506020616d1c88828901615fc3565b9450506040616d2d88828901615aba565b9350506060616d3e88828901615aba565b925050608086013567ffffffffffffffff811115616d5f57616d5e6159af565b5b616d6b88828901615c80565b9150509295509295909350565b6000819050919050565b6000616d9d616d98616d9384615f7a565b616d78565b615f7a565b9050919050565b6000616daf82616d82565b9050919050565b6000616dc182616da4565b9050919050565b616dd181616db6565b82525050565b6000602082019050616dec6000830184616dc8565b92915050565b600081905092915050565b6000616e098385616df2565b9350616e16838584615c2f565b82840190509392505050565b6000616e2f828486616dfd565b91508190509392505050565b616e4481615acf565b82525050565b600060a082019050616e5f6000830188616411565b616e6c6020830187615a79565b616e796040830186616e3b565b616e866060830185616411565b616e936080830184616411565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616ed3601883615dfa565b9150616ede82616e9d565b602082019050919050565b60006020820190508181036000830152616f0281616ec6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616f5057607f821691505b602082108103616f6357616f62616f09565b5b50919050565b50565b6000616f79600083616df2565b9150616f8482616f69565b600082019050919050565b6000616f9a82616f6c565b9150819050919050565b600081905092915050565b6000616fba82615def565b616fc48185616fa4565b9350616fd4818560208601615e0b565b80840191505092915050565b6000616fec8284616faf565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000617053602183615dfa565b915061705e82616ff7565b604082019050919050565b6000602082019050818103600083015261708281617046565b9050919050565b60008151905061709881615aa3565b92915050565b6000602082840312156170b4576170b36159aa565b5b60006170c284828501617089565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61710081615f9a565b82525050565b600061711283836170f7565b60208301905092915050565b6000602082019050919050565b6000617136826170cb565b61714081856170d6565b935061714b836170e7565b8060005b8381101561717c5781516171638882617106565b975061716e8361711e565b92505060018101905061714f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6171be81615a6f565b82525050565b60006171d083836171b5565b60208301905092915050565b6000602082019050919050565b60006171f482617189565b6171fe8185617194565b9350617209836171a5565b8060005b8381101561723a57815161722188826171c4565b975061722c836171dc565b92505060018101905061720d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061728f82616835565b6172998185617273565b93506172a9818560208601615e0b565b6172b281615b72565b840191505092915050565b60006172c98383617284565b905092915050565b6000602082019050919050565b60006172e982617247565b6172f38185617252565b93508360208202850161730585617263565b8060005b85811015617341578484038952815161732285826172bd565b945061732d836172d1565b925060208a01995050600181019050617309565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061738561738061737b84617353565b61735d565b615cae565b9050919050565b6173958161736a565b82525050565b600060a08201905081810360008301526173b5818861712b565b905081810360208301526173c981876171e9565b905081810360408301526173dd81866172de565b90506173ec606083018561738c565b6173f96080830184616411565b9695505050505050565b60008151905061741281615cb8565b92915050565b60006020828403121561742e5761742d6159aa565b5b600061743c84828501617403565b91505092915050565b600060c082019050818103600083015261745f818961712b565b9050818103602083015261747381886171e9565b9050818103604083015261748781876172de565b9050617496606083018661738c565b6174a36080830185616411565b6174b060a0830184615a79565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006174f582615a6f565b915061750083615a6f565b9250828201905080821115617518576175176174bb565b5b92915050565b60006040820190506175336000830185615a79565b6175406020830184615a79565b9392505050565b600060608201905061755c6000830186616411565b6175696020830185615a79565b6175766040830184616e3b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026175e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826175a3565b6175ea86836175a3565b95508019841693508086168417925050509392505050565b600061761d61761861761384615a6f565b616d78565b615a6f565b9050919050565b6000819050919050565b61763783617602565b61764b61764382617624565b8484546175b0565b825550505050565b600090565b617660617653565b61766b81848461762e565b505050565b5b8181101561768f57617684600082617658565b600181019050617671565b5050565b601f8211156176d4576176a58161757e565b6176ae84617593565b810160208510156176bd578190505b6176d16176c985617593565b830182617670565b50505b505050565b600082821c905092915050565b60006176f7600019846008026176d9565b1980831691505092915050565b600061771083836176e6565b9150826002028217905092915050565b61772982615def565b67ffffffffffffffff81111561774257617741615b83565b5b61774c8254616f38565b617757828285617693565b600060209050601f83116001811461778a5760008415617778578287015190505b6177828582617704565b8655506177ea565b601f1984166177988661757e565b60005b828110156177c05784890151825560018201915060208501945060208101905061779b565b868310156177dd57848901516177d9601f8916826176e6565b8355505b6001600288020188555050505b505050505050565b60006177fd82615a6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361782f5761782e6174bb565b5b600182019050919050565b600061784582615a6f565b915061785083615a6f565b925082820261785e81615a6f565b91508282048414831517617875576178746174bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006178b682615a6f565b91506178c183615a6f565b9250826178d1576178d061787c565b5b828204905092915050565b60006178e782615a6f565b91506178f283615a6f565b925082820390508181111561790a576179096174bb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152617959818761712b565b9050818103602083015261796d81866171e9565b9050818103604083015261798181856172de565b90506179906060830184616411565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006179f5602683615dfa565b9150617a0082617999565b604082019050919050565b60006020820190508181036000830152617a24816179e8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617a87602783615dfa565b9150617a9282617a2b565b604082019050919050565b60006020820190508181036000830152617ab681617a7a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000617b19602683615dfa565b9150617b2482617abd565b604082019050919050565b60006020820190508181036000830152617b4881617b0c565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000617bab602383615dfa565b9150617bb682617b4f565b604082019050919050565b60006020820190508181036000830152617bda81617b9e565b9050919050565b6000608082019050617bf66000830187615a79565b617c036020830186616e3b565b617c106040830185615a79565b8181036060830152617c228184615e35565b905095945050505050565b600060a082019050617c426000830188615a79565b617c4f6020830187616e3b565b617c5c6040830186615a79565b8181036060830152617c6e8185615e35565b90508181036080830152617c828184616851565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617d10604383615dfa565b9150617d1b82617c8e565b606082019050919050565b60006020820190508181036000830152617d3f81617d03565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617d7c602083615dfa565b9150617d8782617d46565b602082019050919050565b60006020820190508181036000830152617dab81617d6f565b9050919050565b617dbb81615a39565b8114617dc657600080fd5b50565b600081519050617dd881617db2565b92915050565b600060208284031215617df457617df36159aa565b5b6000617e0284828501617dc9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617e41602083615dfa565b9150617e4c82617e0b565b602082019050919050565b60006020820190508181036000830152617e7081617e34565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617ed3603183615dfa565b9150617ede82617e77565b604082019050919050565b60006020820190508181036000830152617f0281617ec6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617f65602183615dfa565b9150617f7082617f09565b604082019050919050565b60006020820190508181036000830152617f9481617f58565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617fd1601883615dfa565b9150617fdc82617f9b565b602082019050919050565b6000602082019050818103600083015261800081617fc4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000618063602183615dfa565b915061806e82618007565b604082019050919050565b6000602082019050818103600083015261809281618056565b9050919050565b600067ffffffffffffffff82169050919050565b60006180b882618099565b91506180c383618099565b9250828201905067ffffffffffffffff8111156180e3576180e26174bb565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061813182615def565b61813b8185618115565b935061814b818560208601615e0b565b61815481615b72565b840191505092915050565b600061816b8383618126565b905092915050565b6000602082019050919050565b600061818b826180e9565b61819581856180f4565b9350836020820285016181a785618105565b8060005b858110156181e357848403895281516181c4858261815f565b94506181cf83618173565b925060208a019950506001810190506181ab565b50829750879550505050505092915050565b600061821061820b61820684618099565b616d78565b615a6f565b9050919050565b618220816181f5565b82525050565b60006101208201905061823c600083018c615a79565b618249602083018b6160c5565b818103604083015261825b818a61712b565b9050818103606083015261826f81896171e9565b905081810360808301526182838188618180565b905081810360a083015261829781876172de565b90506182a660c0830186618217565b6182b360e0830185618217565b8181036101008301526182c68184615e35565b90509a9950505050505050505050565b60006040820190506182eb60008301856160c5565b6182f86020830184615a79565b9392505050565b600060408201905061831460008301856160c5565b61832160208301846160c5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618384602783615dfa565b915061838f82618328565b604082019050919050565b600060208201905081810360008301526183b381618377565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006183f0600283616fa4565b91506183fb826183ba565b600282019050919050565b6000819050919050565b61842161841c82615cae565b618406565b82525050565b6000618432826183e3565b915061843e8285618410565b60208201915061844e8284618410565b6020820191508190509392505050565b60006080820190506184736000830187616411565b6184806020830186616e3b565b61848d6040830185616411565b61849a6060830184616411565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006184d9601883615dfa565b91506184e4826184a3565b602082019050919050565b60006020820190508181036000830152618508816184cc565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618545601f83615dfa565b91506185508261850f565b602082019050919050565b6000602082019050818103600083015261857481618538565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006185d7602283615dfa565b91506185e28261857b565b604082019050919050565b60006020820190508181036000830152618606816185ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618669602283615dfa565b91506186748261860d565b604082019050919050565b600060208201905081810360008301526186988161865c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006186fb602783615dfa565b91506187068261869f565b604082019050919050565b6000602082019050818103600083015261872a816186ee565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061878d603583615dfa565b915061879882618731565b604082019050919050565b600060208201905081810360008301526187bc81618780565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006187f9601d83615dfa565b9150618804826187c3565b602082019050919050565b60006020820190508181036000830152618828816187ec565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061888b602683615dfa565b91506188968261882f565b604082019050919050565b600060208201905081810360008301526188ba8161887e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061891d602683615dfa565b9150618928826188c1565b604082019050919050565b6000602082019050818103600083015261894c81618910565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618989601d83615dfa565b915061899482618953565b602082019050919050565b600060208201905081810360008301526189b88161897c565b9050919050565b60006189ca82616835565b6189d48185616df2565b93506189e4818560208601615e0b565b80840191505092915050565b60006189fc82846189bf565b915081905092915050565b600060a082019050618a1c6000830188616411565b618a296020830187616411565b618a366040830186616411565b618a436060830185615a79565b618a5060808301846160c5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220dd4edfac69a6afd6aeac0d468ddba6cc40c7263f1a78654ed0f9586c5980bfef64736f6c63430008110033", diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json index 89ec30a..77e97f0 100644 --- a/deployments/localhost/TimeLock.json +++ b/deployments/localhost/TimeLock.json @@ -875,7 +875,7 @@ "transactionIndex": 0, "gasUsed": "3021451", "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000000000001000000000000000000000200000010200000000000000000000000000010000000000000000000000000000000000001000000000040020000400000000100800800000004000000000000020000000000000000000000000000000000000000000000000000000000080000000200000000000000000020000000000000000000000000000000000000001000000000000000000040000000204000000000000000000200002008000100000100200020000000000000001000000000000000000000000000000000000000000000000000", - "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf", + "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c", "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", "logs": [ { @@ -891,7 +891,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" + "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" }, { "transactionIndex": 0, @@ -906,7 +906,7 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" + "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" }, { "transactionIndex": 0, @@ -921,7 +921,7 @@ ], "data": "0x", "logIndex": 2, - "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" + "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" }, { "transactionIndex": 0, @@ -936,7 +936,7 @@ ], "data": "0x", "logIndex": 3, - "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" + "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" }, { "transactionIndex": 0, @@ -951,7 +951,7 @@ ], "data": "0x", "logIndex": 4, - "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" + "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" }, { "transactionIndex": 0, @@ -966,7 +966,7 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" + "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" }, { "transactionIndex": 0, @@ -978,7 +978,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 6, - "blockHash": "0x290417d20f5e9b3672df394e55596738c7713e797b2696d5b55d0da56a0a9acf" + "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" } ], "blockNumber": 1, @@ -992,7 +992,7 @@ [] ], "numDeployments": 1, - "solcInputHash": "865f8451b79a875f15c7120a0497c47b", + "solcInputHash": "e037150c05e743a0afcdb8bf195f828d", "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minDelay\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"executers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"CallScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"Cancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDuration\",\"type\":\"uint256\"}],\"name\":\"MinDelayChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCELLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXECUTOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMELOCK_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"cancel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperationBatch\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationDone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationPending\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ready\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"schedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"scheduleBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDelay\",\"type\":\"uint256\"}],\"name\":\"updateDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancel(bytes32)\":{\"details\":\"Cancel an operation. Requirements: - the caller must have the 'canceller' role.\"},\"execute(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role.\"},\"executeBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role.\"},\"getMinDelay()\":{\"details\":\"Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations).\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hashOperation(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a single transaction.\"},\"hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a batch of transactions.\"},\"isOperation(bytes32)\":{\"details\":\"Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations.\"},\"isOperationDone(bytes32)\":{\"details\":\"Returns whether an operation is done or not.\"},\"isOperationPending(bytes32)\":{\"details\":\"Returns whether an operation is pending or not.\"},\"isOperationReady(bytes32)\":{\"details\":\"Returns whether an operation is ready or not.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"schedule(address,uint256,bytes,bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role.\"},\"scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"updateDelay(uint256)\":{\"details\":\"Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLock.sol\":\"TimeLock\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/TimeLock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/TimelockController.sol\\\";\\n\\ncontract TimeLock is TimelockController {\\n // minDelay: How long you have to wait before executing\\n // proposers is the list of addresses that can purpose\\n // executers: Who can execute when proposal passes\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executers\\n ) TimelockController(minDelay, proposers, executers) {}\\n}\\n\",\"keccak256\":\"0x6e48ab9ddd3998d94cdd53158d3d0d16984ac638fb4f685fae7fd734254e3c11\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523480156200001157600080fd5b5060405162003bd838038062003bd8833981810160405281019062000037919062000779565b8282826200006c7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5806200035560201b60201c565b620000be7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc17f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001107fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e637f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7837f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001a37f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca562000197620003b860201b60201c565b620003c060201b60201c565b620001d57f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca530620003c060201b60201c565b60005b82518110156200029457620002317fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc18483815181106200021d576200021c62000813565b5b6020026020010151620003c060201b60201c565b620002807ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7838483815181106200026c576200026b62000813565b5b6020026020010151620003c060201b60201c565b806200028c9062000871565b9050620001d8565b5060005b81518110156200030557620002f17fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63838381518110620002dd57620002dc62000813565b5b6020026020010151620003c060201b60201c565b80620002fd9062000871565b905062000298565b50826002819055507f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5600084604051620003419291906200091c565b60405180910390a150505050505062000949565b60006200036883620003d660201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b620003d28282620003f560201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b620004078282620004e660201b60201c565b620004e257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000487620003b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620005798162000564565b81146200058557600080fd5b50565b60008151905062000599816200056e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005ef82620005a4565b810181811067ffffffffffffffff82111715620006115762000610620005b5565b5b80604052505050565b60006200062662000550565b9050620006348282620005e4565b919050565b600067ffffffffffffffff821115620006575762000656620005b5565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200069a826200066d565b9050919050565b620006ac816200068d565b8114620006b857600080fd5b50565b600081519050620006cc81620006a1565b92915050565b6000620006e9620006e38462000639565b6200061a565b905080838252602082019050602084028301858111156200070f576200070e62000668565b5b835b818110156200073c5780620007278882620006bb565b84526020840193505060208101905062000711565b5050509392505050565b600082601f8301126200075e576200075d6200059f565b5b815162000770848260208601620006d2565b91505092915050565b6000806000606084860312156200079557620007946200055a565b5b6000620007a58682870162000588565b935050602084015167ffffffffffffffff811115620007c957620007c86200055f565b5b620007d78682870162000746565b925050604084015167ffffffffffffffff811115620007fb57620007fa6200055f565b5b620008098682870162000746565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200087e8262000564565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620008b357620008b262000842565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000620008f3620008ed620008e784620008be565b620008c8565b62000564565b9050919050565b6200090581620008d2565b82525050565b620009168162000564565b82525050565b6000604082019050620009336000830185620008fa565b6200094260208301846200090b565b9392505050565b61327f80620009596000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", "deployedBytecode": "0x6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", diff --git a/deployments/localhost/solcInputs/865f8451b79a875f15c7120a0497c47b.json b/deployments/localhost/solcInputs/e037150c05e743a0afcdb8bf195f828d.json similarity index 95% rename from deployments/localhost/solcInputs/865f8451b79a875f15c7120a0497c47b.json rename to deployments/localhost/solcInputs/e037150c05e743a0afcdb8bf195f828d.json index 186dbd7..234badc 100644 --- a/deployments/localhost/solcInputs/865f8451b79a875f15c7120a0497c47b.json +++ b/deployments/localhost/solcInputs/e037150c05e743a0afcdb8bf195f828d.json @@ -2,7 +2,7 @@ "language": "Solidity", "sources": { "contracts/FundProject.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n error FundProject__NotApporovedByDao();\n error FundProject__UpkeepNeeded();\n error FundProject__TransferFailed(uint256 _projectId);\n error FundProject__NotEnoughPayment();\n error FundProject__withdrawFund();\n error FundProject__WithdrawTransferFailed();\n\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n address payable projectOwners;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n projectId++;\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call this function (after deployement we will transfer ownership to dao)\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (\n bool upkeepNeeded,\n bytes memory /* performData */\n )\n {\n upkeepNeeded = (_isFunding[projectId] &&\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\n projectToTime[projectId][time[projectId]]);\n }\n\n function performUpkeep(\n bytes calldata /* performData */\n ) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n _isFunding[projectId] = false;\n _isApporovedByDao[projectId] = false;\n\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\n 100;\n (bool success, ) = (projectOwnerAddress[projectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[projectId]);\n }\n\n emit projectSuccessfullyFunded(projectId);\n } else {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(projectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value < enteranceFee) {\n revert FundProject__NotEnoughPayment();\n }\n projectOwners = payable(msg.sender);\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\n\nerror FundProject__NotApporovedByDao();\nerror FundProject__UpkeepNeeded();\nerror FundProject__TransferFailed(uint256 _projectId);\nerror FundProject__NotEnoughPayment();\nerror FundProject__withdrawFund();\nerror FundProject__WithdrawTransferFailed();\nerror FundProject__EnteranceFeeNeeded();\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n mapping(address => bool) public _isEnteranceFeePaid;\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n event enteranceFeePaid(address indexed _projectOwner);\n event projectGoesToFunding(uint256 indexed _projectId);\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call it\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\n revert FundProject__EnteranceFeeNeeded();\n } else {\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n emit projectGoesToFunding(projectId);\n projectId++;\n }\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call it\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (\n bool upkeepNeeded,\n bytes memory /* performData */\n )\n {\n upkeepNeeded = (_isFunding[projectId] &&\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\n projectToTime[projectId][time[projectId]]);\n }\n\n function performUpkeep(\n bytes calldata /* performData */\n ) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n _isFunding[projectId] = false;\n _isApporovedByDao[projectId] = false;\n\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\n 100;\n (bool success, ) = (projectOwnerAddress[projectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[projectId]);\n }\n\n emit projectSuccessfullyFunded(projectId);\n } else {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(projectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value < enteranceFee) {\n revert FundProject__NotEnoughPayment();\n } else {\n _isEnteranceFeePaid[msg.sender] = true;\n emit enteranceFeePaid(msg.sender);\n }\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n\n function isEnteranceFeePaid(address account) public view returns (bool) {\n return _isEnteranceFeePaid[account];\n }\n}\n" }, "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" @@ -20,7 +20,7 @@ "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AutomationCompatibleInterface {\n /**\n * @notice method that is simulated by the keepers to see if any work actually\n * needs to be performed. This method does does not actually need to be\n * executable, and since it is only ever simulated it can consume lots of gas.\n * @dev To ensure that it is never called, you may want to add the\n * cannotExecute modifier from KeeperBase to your implementation of this\n * method.\n * @param checkData specified in the upkeep registration so it is always the\n * same for a registered upkeep. This can easily be broken down into specific\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\n * same contract and easily differentiated by the contract.\n * @return upkeepNeeded boolean to indicate whether the keeper should call\n * performUpkeep or not.\n * @return performData bytes that the keeper should call performUpkeep with, if\n * upkeep is needed. If you would like to encode data to decode later, try\n * `abi.encode`.\n */\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\n\n /**\n * @notice method that is actually executed by the keepers, via the registry.\n * The data returned by the checkUpkeep simulation will be passed into\n * this method to actually be executed.\n * @dev The input to this method should not be trusted, and the caller of the\n * method should not even be restricted to any single registry. Anyone should\n * be able call it, and the input should be validated, there is no guarantee\n * that the data passed in is the performData returned from checkUpkeep. This\n * could happen due to malicious keepers, racing keepers, or simply a state\n * change while the performUpkeep transaction is waiting for confirmation.\n * Always validate the data passed in.\n * @param performData is the data which was passed back from the checkData\n * simulation. If it is encoded, it can easily be decoded into other types by\n * calling `abi.decode`. This data should not be trusted, and should be\n * validated against the contract's current state.\n */\n function performUpkeep(bytes calldata performData) external;\n}\n" }, "contracts/GovernerContract.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\nimport \"./FundProject.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl,\n FundProject\n{\n error GovernerContract__NotApporovedByDaoFoundation();\n\n mapping(address => bool) public inWhiteList;\n\n modifier isSubmitFeePaid() {\n paySubmitFee();\n _;\n }\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage,\n uint256 _enteranceFee,\n uint256 _daoPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n FundProject(_enteranceFee, _daoPercentage)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) isSubmitFeePaid returns (uint256) {\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\nimport \"./FundProject.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl,\n FundProject\n{\n error GovernerContract__NeedEnteranceFee();\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage,\n uint256 _enteranceFee,\n uint256 _daoPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n FundProject(_enteranceFee, _daoPercentage)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n if (!_isEnteranceFeePaid[msg.sender]) {\n revert GovernerContract__NeedEnteranceFee();\n }\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" }, "@openzeppelin/contracts/governance/Governor.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" @@ -28,47 +28,47 @@ "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" - }, "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" }, "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" }, "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" }, - "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, "@openzeppelin/contracts/utils/Timers.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" }, "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, + "@openzeppelin/contracts/governance/IGovernor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" + }, "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" }, - "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" + "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, "@openzeppelin/contracts/utils/math/SafeCast.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + }, + "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" }, "@openzeppelin/contracts/utils/introspection/IERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" @@ -76,6 +76,15 @@ "@openzeppelin/contracts/utils/Strings.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 Strings {\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" }, + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" + }, + "@openzeppelin/contracts/utils/Checkpoints.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" + }, "@openzeppelin/contracts/governance/TimelockController.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, @@ -88,41 +97,32 @@ "@openzeppelin/contracts/access/IAccessControl.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" - }, - "@openzeppelin/contracts/utils/Checkpoints.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" - }, "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" }, "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, "@openzeppelin/contracts/utils/Counters.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" }, "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" }, - "@openzeppelin/contracts/token/ERC20/ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" }, "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + "contracts/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract GovernanceToken is ERC20Votes, Ownable {\n uint256 public s_initialSupply = 1000000e18;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" }, "contracts/TimeLock.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/TimelockController.sol\";\n\ncontract TimeLock is TimelockController {\n // minDelay: How long you have to wait before executing\n // proposers is the list of addresses that can purpose\n // executers: Who can execute when proposal passes\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executers\n ) TimelockController(minDelay, proposers, executers) {}\n}\n" - }, - "contracts/GovernanceToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract GovernanceToken is ERC20Votes, Ownable {\n uint256 public s_initialSupply = 1000000e18;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" } }, "settings": { diff --git a/deployments/localhost/solcInputs/3cf270c0d0efd91caec1ecd679be00ea.json b/deployments/localhost/solcInputs/edf7a7fc578491be0baac88ac737a638.json similarity index 100% rename from deployments/localhost/solcInputs/3cf270c0d0efd91caec1ecd679be00ea.json rename to deployments/localhost/solcInputs/edf7a7fc578491be0baac88ac737a638.json index ee6eb20..26079d1 100644 --- a/deployments/localhost/solcInputs/3cf270c0d0efd91caec1ecd679be00ea.json +++ b/deployments/localhost/solcInputs/edf7a7fc578491be0baac88ac737a638.json @@ -25,35 +25,29 @@ "@openzeppelin/contracts/governance/Governor.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" }, "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" }, + "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" + }, "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" - }, "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" - }, "@openzeppelin/contracts/utils/Timers.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" }, - "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/SafeCast.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + "@openzeppelin/contracts/governance/IGovernor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" }, "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" @@ -64,11 +58,17 @@ "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + }, + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, "@openzeppelin/contracts/utils/introspection/ERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" }, "@openzeppelin/contracts/utils/introspection/IERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" @@ -76,6 +76,15 @@ "@openzeppelin/contracts/utils/Strings.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 Strings {\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" }, + "@openzeppelin/contracts/utils/Checkpoints.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" + }, "@openzeppelin/contracts/governance/TimelockController.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, @@ -87,15 +96,6 @@ }, "@openzeppelin/contracts/access/IAccessControl.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" - }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" - }, - "@openzeppelin/contracts/utils/Checkpoints.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" } }, "settings": { diff --git a/scripts/queue-and-execute-afterSubmit.js b/scripts/queue-and-execute-afterSubmit.js index d8ff972..4dea1a2 100644 --- a/scripts/queue-and-execute-afterSubmit.js +++ b/scripts/queue-and-execute-afterSubmit.js @@ -11,6 +11,7 @@ const { moveTime } = require("../utils/move-time"); const fs = require("fs"); async function queue_and_execute_afterSubmit() { + let projectId; const proposalDescription = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; const nodeAccount2 = "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"; // account2 from node @@ -21,6 +22,7 @@ async function queue_and_execute_afterSubmit() { FUNC_FUND, [args, s_fundRaisingGoalAmount, s_fundingTime, nodeAccount2] ); + console.log(encodedFunctionCall); const descriptionHash = ethers.utils.keccak256( ethers.utils.toUtf8Bytes(proposalDescription) ); @@ -40,6 +42,10 @@ async function queue_and_execute_afterSubmit() { await moveBlocks(1); } + projectId = await governor._getProjectId(args); + console.log(`Before ProjectID = ${projectId.toString()}`); + console.log(await governor._isApporoveFundingByDao(1)); + console.log("Executing..."); const executeTx = await governor.execute( [fundProjectContract.address], @@ -50,7 +56,7 @@ async function queue_and_execute_afterSubmit() { await executeTx.wait(1); console.log("Executed!"); - let projectId = await governor._getProjectId(args); + projectId = await governor._getProjectId(args); console.log(`ProjectID = ${projectId.toString()}`); console.log(await governor._isApporoveFundingByDao(projectId)); } diff --git a/test/unit/dao.test.js b/test/unit/dao.test.js index d3dd1d0..6342a4f 100644 --- a/test/unit/dao.test.js +++ b/test/unit/dao.test.js @@ -32,7 +32,7 @@ const fs = require("fs"); account3 = (await ethers.getSigners())[3]; projectOwner = (await ethers.getSigners())[4]; deployer = (await getNamedAccounts()).deployer; - + projectOwner = deployer; await deployments.fixture("all"); gtToken = await ethers.getContract("GovernanceToken"); governor = await ethers.getContract("GovernerContract"); @@ -43,7 +43,6 @@ const fs = require("fs"); it("was deployed", async () => { assert(gtToken.address); - assert(governor.address); assert(timeLock.address); }); @@ -134,19 +133,19 @@ const fs = require("fs"); const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; const encodedFunctionCall = governor.interface.encodeFunctionData( FUNC_FUND, - [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner.address] + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner] ); const enteranceFee = await governor.getEnteranceFee(); - /* await expect( + await expect( governor.propose( [governor.address], [0], [encodedFunctionCall], args ) - ).to.be.revertedWith(`GovernerContract__NeedEnteranceFee`); */ + ).to.be.revertedWith(`GovernerContract__NeedEnteranceFee`); const payFee = await governor.paySubmitFee({ value: enteranceFee }); await payFee.wait(1); @@ -278,11 +277,11 @@ const fs = require("fs"); assert.equal(proposalState.toString(), "4"); // its time to queue & execute - + governor = await ethers.getContract("GovernerContract"); const descriptionHash = ethers.utils.keccak256( ethers.utils.toUtf8Bytes(args) ); - governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); const queueTx = await governor.queue( [governor.address], @@ -291,6 +290,7 @@ const fs = require("fs"); descriptionHash ); await queueTx.wait(1); + console.log("Queued"); await moveTime(MIN_DELAY + 1); await moveBlocks(1); console.log("Executing..."); @@ -348,11 +348,20 @@ const fs = require("fs"); const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; const encodedFunctionCall = governor.interface.encodeFunctionData( FUNC_FUND, - [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner.address] + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner] ); const enteranceFee = await governor.getEnteranceFee(); + await expect( + governor.propose( + [governor.address], + [0], + [encodedFunctionCall], + args + ) + ).to.be.revertedWith(`GovernerContract__NeedEnteranceFee`); + const payFee = await governor.paySubmitFee({ value: enteranceFee }); await payFee.wait(1); diff --git a/test/unit/fundContract.test.js b/test/unit/fundContract.test.js new file mode 100644 index 0000000..ea5941d --- /dev/null +++ b/test/unit/fundContract.test.js @@ -0,0 +1,227 @@ +const { ethers, deployments, getNamedAccounts, network } = require("hardhat"); +const { assert, expect } = require("chai"); +const { + FUNC_FUND, + developmentChains, + VOTING_DELAY, + VOTING_PERIOD, + MIN_DELAY, + s_fundingTime, + s_fundRaisingGoalAmount, +} = require("../../helper-config"); +const { moveBlocks } = require("../../utils/move-blocks"); +const { moveTime } = require("../../utils/move-time"); +const fs = require("fs"); + +!developmentChains.includes(network.name) + ? describe.skip + : describe("FundProject Unit Tests", async () => { + let gtToken, + account1, + account2, + account3, + projectOwner, + governor, + timeLock, + proposalState, + projectId, + blockNumber, + investor; + beforeEach(async () => { + account1 = (await ethers.getSigners())[1]; + account2 = (await ethers.getSigners())[2]; + account3 = (await ethers.getSigners())[3]; + projectOwner = (await ethers.getSigners())[4]; + investor = (await ethers.getSigners())[5]; + deployer = (await getNamedAccounts()).deployer; + projectOwner = deployer; + + await deployments.fixture("all"); + gtToken = await ethers.getContract("GovernanceToken"); + governor = await ethers.getContract("GovernerContract"); + timeLock = await ethers.getContract("TimeLock"); + gtToken = await ethers.getContract("GovernanceToken", deployer); + + let tx1 = await gtToken.transfer( + account1.address, + ethers.utils.parseEther("500000") + ); + tx1 = await gtToken.transfer( + account2.address, + ethers.utils.parseEther("300000") + ); + tx1 = await gtToken.transfer( + account3.address, + ethers.utils.parseEther("100000") + ); + + await tx1.wait(1); + + gtToken = await ethers.getContract("GovernanceToken", account1.address); + tx1 = await gtToken.delegate(account1.address); + await tx1.wait(1); + gtToken = await ethers.getContract("GovernanceToken", account2.address); + tx1 = await gtToken.delegate(account2.address); + gtToken = await ethers.getContract("GovernanceToken", account3.address); + tx1 = await gtToken.delegate(account3.address); + await tx1.wait(1); + + moveBlocks(1); + + /* const { upkeepNeeded } = await governor.checkUpkeep([]); + assert(!upkeepNeeded); */ + + await ethers.getContract("GovernanceToken", projectOwner); + const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; + + const encodedFunctionCall = governor.interface.encodeFunctionData( + FUNC_FUND, + [args, s_fundRaisingGoalAmount, s_fundingTime, projectOwner] + ); + + const enteranceFee = await governor.getEnteranceFee(); + + await expect( + governor.propose([governor.address], [0], [encodedFunctionCall], args) + ).to.be.revertedWith("GovernerContract__NeedEnteranceFee"); + + const payFee = await governor.paySubmitFee({ value: enteranceFee }); + await payFee.wait(1); + + const proposalTx = await governor.propose( + [governor.address], + [0], + [encodedFunctionCall], + args + ); + const proposeReceipt = await proposalTx.wait(1); + + const proposalId = proposeReceipt.events[0].args.proposalId; + await moveBlocks(VOTING_DELAY + 1); + + governor = await ethers.getContract( + "GovernerContract", + account1.address + ); + let voteTxResponse = await governor.castVote(proposalId, 1); + await voteTxResponse.wait(1); + + const governor1 = await ethers.getContract( + "GovernerContract", + account2.address + ); + const voteTxResponse1 = await governor1.castVote(proposalId, 0); + await voteTxResponse1.wait(1); + + governor = await ethers.getContract( + "GovernerContract", + account3.address + ); + voteTxResponse = await governor.castVote(proposalId, 1); + await moveBlocks(VOTING_PERIOD + 1); + + proposalState = await governor.state(proposalId); + console.log(`End of voting: ${proposalState}`); + assert.equal(proposalState.toString(), "4"); + + // its time to queue & execute + + const descriptionHash = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes(args) + ); + governor = await ethers.getContract("GovernerContract"); + console.log("Queueing..."); + const queueTx = await governor.queue( + [governor.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + await queueTx.wait(1); + console.log("Queued"); + await moveTime(MIN_DELAY + 1); + await moveBlocks(1); + console.log("Executing..."); + + const executeTx = await governor.execute( + [governor.address], + [0], + [encodedFunctionCall], + descriptionHash + ); + expect(executeTx).to.emit(governor, "projectGoesToFunding"); + await executeTx.wait(1); + console.log("Executed!"); + + projectId = await governor._getProjectId(args); + console.log(`ProjectId = ${projectId.toString()}`); + }); + + it("constructorFund", async () => { + assert.equal( + (await governor.getEnteranceFee()).toString(), + "10000000000000000" + ); + + assert.equal((await governor.getDaoPercentage()).toString(), "10"); + }); + + it("test Funding project", async () => { + assert(await governor._isApporoveFundingByDao(projectId)); + const invest = ethers.utils.parseUnits("1", "ether"); + + await ethers.getContract("GovernerContract", investor); + const invTx = await governor.fund(projectId, { value: invest }); + expect().to.emit(governor, "enteranceFeePaid"); + await invTx.wait(1); + + assert.equal( + (await governor.getFunderBalance(projectId)).toString(), + invest.toString() + ); + + await expect(governor.withdrawFund(projectId)).to.be.revertedWith( + "FundProject__withdrawFund" + ); + await expect( + governor.cancelApporovelFundingByDao(projectId) + ).to.be.revertedWith("Ownable: caller is not the owner"); + + assert.equal(await governor._getProjectStatus(projectId), "0"); + assert(await governor.projectFundingGoalAmount(projectId)); + + assert.equal( + (await governor._getHashOfProjectData(projectId)).toString(), + "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu" + ); + + assert.equal( + ( + await governor._getProjectId( + "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu" + ) + ).toString(), + "1" + ); + assert(await governor._isApporoveFundingByDao(projectId)); + assert(await governor.is_funding(projectId)); + }); + + describe("checkUpkeep", async () => { + it("return false if project hasnt submit", async () => { + blockNumber = await ethers.provider.getBlockNumber(); + console.log(`Before ${blockNumber}`); + await moveTime(s_fundingTime + 1); + await moveBlocks(s_fundingTime + 1); + blockNumber = await ethers.provider.getBlockNumber(); + console.log(`Before ${blockNumber}`); + const { upkeepNeeded, performData } = await governor.checkUpkeep([]); + const { a, b } = await governor.getTimeleft(projectId); + console.log(`ProjectId = ${projectId}`); + console.log(await governor.is_funding(projectId)); + console.log(a.toString(), b.toString()); + console.log(performData); + // assert(!upkeepNeeded); + }); + }); + }); From b400b6dedfde7600cfb1c1e2196f184ecd4a3d27 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Thu, 10 Nov 2022 17:00:28 +0300 Subject: [PATCH 20/28] Add chainlink automation Fix big bug. Add tests V2 --- contracts/FundProject.sol | 13 +- coverage.json | 2 +- coverage/contracts/FundProject.sol.html | 207 ++++++++----- coverage/contracts/GovernanceToken.sol.html | 6 +- coverage/contracts/GovernerContract.sol.html | 20 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 40 +-- coverage/coverage-final.json | 6 +- coverage/index.html | 40 +-- .../contracts/FundProject.sol.html | 207 ++++++++----- .../contracts/GovernanceToken.sol.html | 6 +- .../contracts/GovernerContract.sol.html | 20 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 40 +-- coverage/lcov-report/index.html | 40 +-- coverage/lcov.info | 286 +++++++++--------- helper-config.js | 2 +- test/unit/fundContract.test.js | 98 +++++- 18 files changed, 608 insertions(+), 429 deletions(-) diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index 473301f..5f9442b 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -22,7 +22,6 @@ contract FundProject is Ownable, AutomationCompatibleInterface { } uint256 public projectId = 1; - uint256 public k_projectId = 1; uint public lastTimeStamp; uint256 public daoPercentage; @@ -47,6 +46,10 @@ contract FundProject is Ownable, AutomationCompatibleInterface { event projectFundingFailed(uint256 indexed _projectId); event enteranceFeePaid(address indexed _projectOwner); event projectGoesToFunding(uint256 indexed _projectId); + event withdrawFundSuccessfully( + address indexed __investor, + uint256 indexed __projectId + ); modifier isApporovedByDao(uint256 _projecID) { if (!_isApporovedByDao[_projecID]) @@ -111,15 +114,11 @@ contract FundProject is Ownable, AutomationCompatibleInterface { { for (uint i = 1; i <= projectId; i++) { bool isFunded = _isFunding[i]; - - console.log("_isFunding= ", _isFunding[i], i); - bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) > time[i]; upkeepNeeded = (isFunded && timePassed); if (upkeepNeeded) { performData = abi.encodePacked(i); - console.log(uint256(bytes32(performData))); break; } } @@ -130,6 +129,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { if (!upkeepNeeded) { revert FundProject__UpkeepNeeded(); } + uint256 ProjectId = uint256(bytes32(performData)); _isFunding[ProjectId] = false; _isApporovedByDao[ProjectId] = false; @@ -138,6 +138,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS; uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) / 100; + projectFunds[ProjectId] = 0; (bool success, ) = (projectOwnerAddress[ProjectId]).call{ value: fundsToSent }(""); @@ -164,12 +165,14 @@ contract FundProject is Ownable, AutomationCompatibleInterface { function withdrawFund(uint256 _projectID) public { if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) { uint256 fundToSent = funders[_projectID][msg.sender]; + funders[_projectID][msg.sender] = 0; (bool success, ) = (payable(msg.sender)).call{value: fundToSent}( "" ); if (!success) { revert FundProject__WithdrawTransferFailed(); } + emit withdrawFundSuccessfully(msg.sender, projectId); } else { revert FundProject__withdrawFund(); } diff --git a/coverage.json b/coverage.json index 6f162f8..0b74a58 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/FundProject.sol":{"l":{"50":1,"51":0,"52":1,"56":3,"57":3,"58":3,"66":1,"67":1,"68":1,"78":3,"79":0,"81":3,"82":3,"83":3,"84":3,"85":3,"86":3,"87":3,"88":3,"89":3,"90":3,"91":3,"97":0,"98":0,"99":0,"113":0,"121":0,"122":0,"123":0,"125":0,"126":0,"128":0,"129":0,"130":0,"132":0,"135":0,"136":0,"139":0,"141":0,"142":0,"147":4,"148":0,"150":4,"151":4,"156":1,"157":0,"158":0,"161":0,"162":0,"165":1,"174":2,"182":1,"190":3,"198":0,"206":0,"210":1,"218":1,"222":5,"226":0,"234":1,"242":0,"246":1},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":1,"2":3,"3":3,"4":3,"5":1,"6":1,"7":1,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3,"18":3,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":4,"36":4,"37":4,"38":1,"39":0,"40":0,"41":0,"42":2,"43":1,"44":3,"45":0,"46":0,"47":1,"48":1,"49":5,"50":0,"51":1,"52":0,"53":1},"b":{"1":[0,1],"2":[0,3],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,4],"7":[0,1],"8":[0,0]},"f":{"1":1,"2":3,"3":1,"4":3,"5":0,"6":0,"7":0,"8":4,"9":1,"10":2,"11":1,"12":3,"13":0,"14":0,"15":1,"16":1,"17":5,"18":0,"19":1,"20":0,"21":1},"fnMap":{"1":{"name":"isApporovedByDao","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":53,"column":4}}},"2":{"name":"constructor","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"3":{"name":"fund","line":64,"loc":{"start":{"line":61,"column":4},"end":{"line":69,"column":4}}},"4":{"name":"apporoveFundingByDao","line":76,"loc":{"start":{"line":71,"column":4},"end":{"line":93,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":95,"loc":{"start":{"line":95,"column":4},"end":{"line":100,"column":4}}},"6":{"name":"checkUpkeep","line":102,"loc":{"start":{"line":102,"column":4},"end":{"line":116,"column":4}}},"7":{"name":"performUpkeep","line":118,"loc":{"start":{"line":118,"column":4},"end":{"line":144,"column":4}}},"8":{"name":"paySubmitFee","line":146,"loc":{"start":{"line":146,"column":4},"end":{"line":153,"column":4}}},"9":{"name":"withdrawFund","line":155,"loc":{"start":{"line":155,"column":4},"end":{"line":167,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":169,"loc":{"start":{"line":169,"column":4},"end":{"line":175,"column":4}}},"11":{"name":"_getHashOfProjectData","line":177,"loc":{"start":{"line":177,"column":4},"end":{"line":183,"column":4}}},"12":{"name":"_getProjectId","line":185,"loc":{"start":{"line":185,"column":4},"end":{"line":191,"column":4}}},"13":{"name":"_getBalanceOfProject","line":193,"loc":{"start":{"line":193,"column":4},"end":{"line":199,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":201,"loc":{"start":{"line":201,"column":4},"end":{"line":207,"column":4}}},"15":{"name":"is_funding","line":209,"loc":{"start":{"line":209,"column":4},"end":{"line":211,"column":4}}},"16":{"name":"_getProjectStatus","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"17":{"name":"getEnteranceFee","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":227,"column":4}}},"19":{"name":"getFunderBalance","line":229,"loc":{"start":{"line":229,"column":4},"end":{"line":235,"column":4}}},"20":{"name":"getInvestedProjects","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":243,"column":4}}},"21":{"name":"getDaoPercentage","line":245,"loc":{"start":{"line":245,"column":4},"end":{"line":247,"column":4}}}},"statementMap":{"1":{"start":{"line":50,"column":8},"end":{"line":50,"column":2037}},"2":{"start":{"line":56,"column":8},"end":{"line":56,"column":38}},"3":{"start":{"line":57,"column":8},"end":{"line":57,"column":37}},"4":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}},"5":{"start":{"line":66,"column":8},"end":{"line":66,"column":50}},"6":{"start":{"line":67,"column":8},"end":{"line":67,"column":43}},"7":{"start":{"line":68,"column":8},"end":{"line":68,"column":49}},"8":{"start":{"line":78,"column":8},"end":{"line":78,"column":2806}},"9":{"start":{"line":81,"column":12},"end":{"line":81,"column":60}},"10":{"start":{"line":82,"column":12},"end":{"line":82,"column":77}},"11":{"start":{"line":83,"column":12},"end":{"line":83,"column":34}},"12":{"start":{"line":84,"column":12},"end":{"line":84,"column":67}},"13":{"start":{"line":85,"column":12},"end":{"line":85,"column":49}},"14":{"start":{"line":86,"column":12},"end":{"line":86,"column":42}},"15":{"start":{"line":87,"column":12},"end":{"line":87,"column":64}},"16":{"start":{"line":88,"column":12},"end":{"line":88,"column":46}},"17":{"start":{"line":89,"column":12},"end":{"line":89,"column":39}},"18":{"start":{"line":90,"column":12},"end":{"line":90,"column":48}},"19":{"start":{"line":97,"column":8},"end":{"line":97,"column":43}},"20":{"start":{"line":98,"column":8},"end":{"line":98,"column":36}},"21":{"start":{"line":99,"column":8},"end":{"line":99,"column":71}},"22":{"start":{"line":113,"column":8},"end":{"line":113,"column":4078}},"23":{"start":{"line":121,"column":8},"end":{"line":121,"column":47}},"24":{"start":{"line":122,"column":8},"end":{"line":122,"column":4365}},"25":{"start":{"line":125,"column":8},"end":{"line":125,"column":36}},"26":{"start":{"line":126,"column":8},"end":{"line":126,"column":43}},"27":{"start":{"line":128,"column":8},"end":{"line":128,"column":4538}},"28":{"start":{"line":129,"column":12},"end":{"line":129,"column":74}},"29":{"start":{"line":130,"column":12},"end":{"line":130,"column":4707}},"30":{"start":{"line":132,"column":12},"end":{"line":132,"column":4804}},"31":{"start":{"line":135,"column":12},"end":{"line":135,"column":4923}},"32":{"start":{"line":139,"column":12},"end":{"line":139,"column":53}},"33":{"start":{"line":141,"column":12},"end":{"line":141,"column":73}},"34":{"start":{"line":142,"column":12},"end":{"line":142,"column":48}},"35":{"start":{"line":147,"column":8},"end":{"line":147,"column":5295}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":49}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":45}},"38":{"start":{"line":156,"column":8},"end":{"line":156,"column":5575}},"39":{"start":{"line":157,"column":12},"end":{"line":157,"column":64}},"40":{"start":{"line":158,"column":12},"end":{"line":158,"column":5730}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":5841}},"42":{"start":{"line":174,"column":8},"end":{"line":174,"column":43}},"43":{"start":{"line":182,"column":8},"end":{"line":182,"column":34}},"44":{"start":{"line":190,"column":8},"end":{"line":190,"column":41}},"45":{"start":{"line":198,"column":8},"end":{"line":198,"column":38}},"46":{"start":{"line":206,"column":8},"end":{"line":206,"column":50}},"47":{"start":{"line":210,"column":8},"end":{"line":210,"column":37}},"48":{"start":{"line":218,"column":8},"end":{"line":218,"column":48}},"49":{"start":{"line":222,"column":8},"end":{"line":222,"column":27}},"50":{"start":{"line":226,"column":8},"end":{"line":226,"column":43}},"51":{"start":{"line":234,"column":8},"end":{"line":234,"column":46}},"52":{"start":{"line":242,"column":8},"end":{"line":242,"column":41}},"53":{"start":{"line":246,"column":8},"end":{"line":246,"column":28}}},"branchMap":{"1":{"line":50,"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":50,"column":8}},{"start":{"line":50,"column":8},"end":{"line":50,"column":8}}]},"2":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":8}},{"start":{"line":78,"column":8},"end":{"line":78,"column":8}}]},"3":{"line":122,"type":"if","locations":[{"start":{"line":122,"column":8},"end":{"line":122,"column":8}},{"start":{"line":122,"column":8},"end":{"line":122,"column":8}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":8},"end":{"line":128,"column":8}},{"start":{"line":128,"column":8},"end":{"line":128,"column":8}}]},"5":{"line":135,"type":"if","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":12}},{"start":{"line":135,"column":12},"end":{"line":135,"column":12}}]},"6":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":8},"end":{"line":147,"column":8}},{"start":{"line":147,"column":8},"end":{"line":147,"column":8}}]},"7":{"line":156,"type":"if","locations":[{"start":{"line":156,"column":8},"end":{"line":156,"column":8}},{"start":{"line":156,"column":8},"end":{"line":156,"column":8}}]},"8":{"line":161,"type":"if","locations":[{"start":{"line":161,"column":12},"end":{"line":161,"column":12}},{"start":{"line":161,"column":12},"end":{"line":161,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":19,"29":19,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":19,"3":19,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":19,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":4,"61":4,"70":12,"79":26,"88":8,"89":4,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":4,"2":4,"3":12,"4":26,"5":8,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[4,4]},"f":{"1":3,"2":4,"3":4,"4":12,"5":26,"6":8,"7":4,"8":3,"9":0,"10":6,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/FundProject.sol":{"l":{"51":3,"52":0,"53":3,"57":3,"58":3,"59":3,"67":3,"68":3,"69":3,"79":7,"80":0,"82":7,"83":7,"84":7,"85":7,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"98":0,"99":0,"100":0,"111":12,"112":14,"113":14,"115":14,"116":14,"117":4,"118":4,"124":4,"125":4,"126":1,"129":3,"130":3,"131":3,"133":3,"134":1,"135":1,"137":1,"138":1,"141":1,"142":0,"145":1,"147":2,"148":2,"153":8,"154":0,"156":8,"157":8,"162":1,"163":0,"164":0,"167":0,"168":0,"171":1,"180":4,"188":1,"196":7,"204":1,"212":0,"216":3,"224":2,"228":9,"232":0,"240":2,"248":0,"252":1,"260":0,"261":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":1,"46":0,"47":0,"48":0,"49":4,"50":1,"51":7,"52":1,"53":0,"54":3,"55":2,"56":9,"57":0,"58":2,"59":0,"60":1,"61":0,"62":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[0,1],"9":[0,0]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":1,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":2,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":54,"column":4}}},"2":{"name":"constructor","line":56,"loc":{"start":{"line":56,"column":4},"end":{"line":60,"column":4}}},"3":{"name":"fund","line":65,"loc":{"start":{"line":62,"column":4},"end":{"line":70,"column":4}}},"4":{"name":"apporoveFundingByDao","line":77,"loc":{"start":{"line":72,"column":4},"end":{"line":94,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":101,"column":4}}},"6":{"name":"checkUpkeep","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":121,"column":4}}},"7":{"name":"performUpkeep","line":123,"loc":{"start":{"line":123,"column":4},"end":{"line":150,"column":4}}},"8":{"name":"paySubmitFee","line":152,"loc":{"start":{"line":152,"column":4},"end":{"line":159,"column":4}}},"9":{"name":"withdrawFund","line":161,"loc":{"start":{"line":161,"column":4},"end":{"line":173,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":181,"column":4}}},"11":{"name":"_getHashOfProjectData","line":183,"loc":{"start":{"line":183,"column":4},"end":{"line":189,"column":4}}},"12":{"name":"_getProjectId","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"13":{"name":"_getBalanceOfProject","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"15":{"name":"is_funding","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":217,"column":4}}},"16":{"name":"_getProjectStatus","line":219,"loc":{"start":{"line":219,"column":4},"end":{"line":225,"column":4}}},"17":{"name":"getEnteranceFee","line":227,"loc":{"start":{"line":227,"column":4},"end":{"line":229,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"19":{"name":"getFunderBalance","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"20":{"name":"getInvestedProjects","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":249,"column":4}}},"21":{"name":"getDaoPercentage","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":253,"column":4}}},"22":{"name":"getTimeleft","line":255,"loc":{"start":{"line":255,"column":4},"end":{"line":262,"column":4}}}},"statementMap":{"1":{"start":{"line":51,"column":8},"end":{"line":51,"column":2067}},"2":{"start":{"line":57,"column":8},"end":{"line":57,"column":38}},"3":{"start":{"line":58,"column":8},"end":{"line":58,"column":37}},"4":{"start":{"line":59,"column":8},"end":{"line":59,"column":35}},"5":{"start":{"line":67,"column":8},"end":{"line":67,"column":50}},"6":{"start":{"line":68,"column":8},"end":{"line":68,"column":43}},"7":{"start":{"line":69,"column":8},"end":{"line":69,"column":49}},"8":{"start":{"line":79,"column":8},"end":{"line":79,"column":2836}},"9":{"start":{"line":82,"column":12},"end":{"line":82,"column":60}},"10":{"start":{"line":83,"column":12},"end":{"line":83,"column":77}},"11":{"start":{"line":84,"column":12},"end":{"line":84,"column":34}},"12":{"start":{"line":85,"column":12},"end":{"line":85,"column":67}},"13":{"start":{"line":86,"column":12},"end":{"line":86,"column":49}},"14":{"start":{"line":87,"column":12},"end":{"line":87,"column":42}},"15":{"start":{"line":88,"column":12},"end":{"line":88,"column":64}},"16":{"start":{"line":89,"column":12},"end":{"line":89,"column":46}},"17":{"start":{"line":90,"column":12},"end":{"line":90,"column":39}},"18":{"start":{"line":91,"column":12},"end":{"line":91,"column":48}},"19":{"start":{"line":98,"column":8},"end":{"line":98,"column":43}},"20":{"start":{"line":99,"column":8},"end":{"line":99,"column":36}},"21":{"start":{"line":100,"column":8},"end":{"line":100,"column":71}},"22":{"start":{"line":111,"column":8},"end":{"line":111,"column":4023}},"23":{"start":{"line":112,"column":12},"end":{"line":112,"column":41}},"24":{"start":{"line":113,"column":12},"end":{"line":113,"column":4133}},"25":{"start":{"line":115,"column":12},"end":{"line":115,"column":50}},"26":{"start":{"line":116,"column":12},"end":{"line":116,"column":4280}},"27":{"start":{"line":117,"column":16},"end":{"line":117,"column":48}},"28":{"start":{"line":124,"column":8},"end":{"line":124,"column":47}},"29":{"start":{"line":125,"column":8},"end":{"line":125,"column":4533}},"30":{"start":{"line":129,"column":8},"end":{"line":129,"column":57}},"31":{"start":{"line":130,"column":8},"end":{"line":130,"column":36}},"32":{"start":{"line":131,"column":8},"end":{"line":131,"column":43}},"33":{"start":{"line":133,"column":8},"end":{"line":133,"column":4766}},"34":{"start":{"line":134,"column":12},"end":{"line":134,"column":74}},"35":{"start":{"line":135,"column":12},"end":{"line":135,"column":4935}},"36":{"start":{"line":137,"column":12},"end":{"line":137,"column":38}},"37":{"start":{"line":138,"column":12},"end":{"line":138,"column":5073}},"38":{"start":{"line":141,"column":12},"end":{"line":141,"column":5192}},"39":{"start":{"line":145,"column":12},"end":{"line":145,"column":53}},"40":{"start":{"line":147,"column":12},"end":{"line":147,"column":73}},"41":{"start":{"line":148,"column":12},"end":{"line":148,"column":48}},"42":{"start":{"line":153,"column":8},"end":{"line":153,"column":5564}},"43":{"start":{"line":156,"column":12},"end":{"line":156,"column":49}},"44":{"start":{"line":157,"column":12},"end":{"line":157,"column":45}},"45":{"start":{"line":162,"column":8},"end":{"line":162,"column":5844}},"46":{"start":{"line":163,"column":12},"end":{"line":163,"column":64}},"47":{"start":{"line":164,"column":12},"end":{"line":164,"column":5999}},"48":{"start":{"line":167,"column":12},"end":{"line":167,"column":6110}},"49":{"start":{"line":180,"column":8},"end":{"line":180,"column":43}},"50":{"start":{"line":188,"column":8},"end":{"line":188,"column":34}},"51":{"start":{"line":196,"column":8},"end":{"line":196,"column":41}},"52":{"start":{"line":204,"column":8},"end":{"line":204,"column":38}},"53":{"start":{"line":212,"column":8},"end":{"line":212,"column":50}},"54":{"start":{"line":216,"column":8},"end":{"line":216,"column":37}},"55":{"start":{"line":224,"column":8},"end":{"line":224,"column":48}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":27}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":43}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":46}},"59":{"start":{"line":248,"column":8},"end":{"line":248,"column":41}},"60":{"start":{"line":252,"column":8},"end":{"line":252,"column":28}},"61":{"start":{"line":260,"column":8},"end":{"line":260,"column":72}},"62":{"start":{"line":261,"column":8},"end":{"line":261,"column":27}}},"branchMap":{"1":{"line":51,"type":"if","locations":[{"start":{"line":51,"column":8},"end":{"line":51,"column":8}},{"start":{"line":51,"column":8},"end":{"line":51,"column":8}}]},"2":{"line":79,"type":"if","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":8}},{"start":{"line":79,"column":8},"end":{"line":79,"column":8}}]},"3":{"line":116,"type":"if","locations":[{"start":{"line":116,"column":12},"end":{"line":116,"column":12}},{"start":{"line":116,"column":12},"end":{"line":116,"column":12}}]},"4":{"line":125,"type":"if","locations":[{"start":{"line":125,"column":8},"end":{"line":125,"column":8}},{"start":{"line":125,"column":8},"end":{"line":125,"column":8}}]},"5":{"line":133,"type":"if","locations":[{"start":{"line":133,"column":8},"end":{"line":133,"column":8}},{"start":{"line":133,"column":8},"end":{"line":133,"column":8}}]},"6":{"line":141,"type":"if","locations":[{"start":{"line":141,"column":12},"end":{"line":141,"column":12}},{"start":{"line":141,"column":12},"end":{"line":141,"column":12}}]},"7":{"line":153,"type":"if","locations":[{"start":{"line":153,"column":8},"end":{"line":153,"column":8}},{"start":{"line":153,"column":8},"end":{"line":153,"column":8}}]},"8":{"line":162,"type":"if","locations":[{"start":{"line":162,"column":8},"end":{"line":162,"column":8}},{"start":{"line":162,"column":8},"end":{"line":162,"column":8}}]},"9":{"line":167,"type":"if","locations":[{"start":{"line":167,"column":12},"end":{"line":167,"column":12}},{"start":{"line":167,"column":12},"end":{"line":167,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html index 5dbf873..21910d1 100644 --- a/coverage/contracts/FundProject.sol.html +++ b/coverage/contracts/FundProject.sol.html @@ -20,28 +20,28 @@

- 56.6% + 82.26% Statements - 30/53 + 51/62
- 25% + 61.11% Branches - 4/16 + 11/18
- 66.67% + 77.27% Functions - 14/21 + 17/22
- 53.23% + 77.78% Lines - 33/62 + 56/72
-
+

contracts/
91.67%33/3666.67%4/690.32%28/3188.1%37/42contracts/
63.38%45/7133.33%6/1874.36%29/3960.49%49/81
1 2 @@ -291,7 +291,22 @@

246 247 248 -249

  +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264        @@ -340,9 +355,10 @@

      - +  +   - +       @@ -356,9 +372,9 @@

      - - - + + +       @@ -368,20 +384,20 @@

      - +     - - - - - - - - - - - + + + + + + + + + + +       @@ -400,48 +416,53 @@

      +12× +14× +14×   -  -  -  -  +14× +14× + +           + + +   -  -  -    -  -  + + +   -  -  -  + + +   -  + +     -  +       -  +   -  -  + +         - +     - - + +       @@ -464,7 +485,7 @@

      - +       @@ -480,7 +501,7 @@

      - +       @@ -488,7 +509,7 @@

      -  +       @@ -500,7 +521,7 @@

      - +       @@ -508,11 +529,11 @@

      - +       - +       @@ -524,7 +545,7 @@

      - +       @@ -539,11 +560,21 @@

    +  +  +  +  +  +  +  +  +   

// SPDX-License-Identifier: MIT
 pragma solidity ^0.8.0;
  
 import "@openzeppelin/contracts/access/Ownable.sol";
 import "@chainlink/contracts/src/v0.8/AutomationCompatible.sol";
+import "hardhat/console.sol";
  
 error FundProject__NotApporovedByDao();
 error FundProject__UpkeepNeeded();
@@ -640,47 +671,52 @@ 

_ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; }   - function checkUpkeep( + function checkUpkeep( bytes memory /* checkData */ ) public view override - returns ( - bool upkeepNeeded, - bytes memory /* performData */ - ) + returns (bool upkeepNeeded, bytes memory performData) { - upkeepNeeded = (_isFunding[projectId] && - (block.timestamp - projectToTime[projectId][time[projectId]]) > - projectToTime[projectId][time[projectId]]); + for (uint i = 1; i <= projectId; i++) { + bool isFunded = _isFunding[i]; + bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) > + time[i]; + upkeepNeeded = (isFunded && timePassed); + if (upkeepNeeded) { + performData = abi.encodePacked(i); + break; + } + } }   - function performUpkeep( - bytes calldata /* performData */ - ) external override { - (bool upkeepNeeded, ) = checkUpkeep(""); - if (!upkeepNeeded) { + function performUpkeep(bytes calldata performData) external override { + (bool upkeepNeeded, ) = checkUpkeep(""); + if (!upkeepNeeded) { revert FundProject__UpkeepNeeded(); } - _isFunding[projectId] = false; - _isApporovedByDao[projectId] = false;   - if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) { - _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS; - uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) / + uint256 ProjectId = uint256(bytes32(performData)); + _isFunding[ProjectId] = false; + _isApporovedByDao[ProjectId] = false; +  + if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) { + _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS; + uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) / 100; - (bool success, ) = (projectOwnerAddress[projectId]).call{ + projectFunds[ProjectId] = 0; + (bool success, ) = (projectOwnerAddress[ProjectId]).call{ value: fundsToSent }(""); - if (!success) { - revert FundProject__TransferFailed(projectFunds[projectId]); + Iif (!success) { + revert FundProject__TransferFailed(projectFunds[ProjectId]); }   - emit projectSuccessfullyFunded(projectId); + emit projectSuccessfullyFunded(ProjectId); } else { - _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED; - emit projectFundingFailed(projectId); + _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.FAILED; + emit projectFundingFailed(ProjectId); } }   @@ -731,12 +767,12 @@

return hashToProjectId[_ipfsHash]; }   - function _getBalanceOfProject(uint256 _projecID) + function _getBalanceOfProject(uint256 _projecID) public view returns (uint256) { - return projectFunds[_projecID]; + return projectFunds[_projecID]; }   function _getFundingGoalAmount(uint256 _projecID) @@ -786,6 +822,15 @@

function getDaoPercentage() public view returns (uint256) { return daoPercentage; } +  + function getTimeleft(uint256 _projectID) + public + view + returns (uint256 a, uint256 b) + { + a = block.timestamp - projectToTime[_projectID][time[_projectID]]; + b = time[_projectID]; + } }  

@@ -793,7 +838,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index 458d3d2..78cc782 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -124,8 +124,8 @@

      -19× -19× +31× +31×       @@ -211,7 +211,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 89cc827..57f7299 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -233,7 +233,7 @@

      - +       @@ -242,7 +242,7 @@

      - +       @@ -251,7 +251,7 @@

      -12× +24×       @@ -260,7 +260,7 @@

      -26× +50×       @@ -269,10 +269,10 @@

      +16× -   - +       @@ -281,7 +281,7 @@

      - +       @@ -291,7 +291,7 @@

      - +       @@ -309,7 +309,7 @@

      - +14×       @@ -466,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index da321e1..c0b1896 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index ea2e6f8..728ba18 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,28 +20,28 @@

- 63.38% + 82.5% Statements - 45/71 + 66/80
- 33.33% + 65% Branches - 6/18 + 13/20
- 74.36% + 80% Functions - 29/39 + 32/40
- 60.49% + 79.12% Lines - 49/81 + 72/91
-
+
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 1b9d731..747b77d 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,5 @@ { -"contracts/FundProject.sol":{"l":{"50":1,"51":0,"52":1,"56":3,"57":3,"58":3,"66":1,"67":1,"68":1,"78":3,"79":0,"81":3,"82":3,"83":3,"84":3,"85":3,"86":3,"87":3,"88":3,"89":3,"90":3,"91":3,"97":0,"98":0,"99":0,"113":0,"121":0,"122":0,"123":0,"125":0,"126":0,"128":0,"129":0,"130":0,"132":0,"135":0,"136":0,"139":0,"141":0,"142":0,"147":4,"148":0,"150":4,"151":4,"156":1,"157":0,"158":0,"161":0,"162":0,"165":1,"174":2,"182":1,"190":3,"198":0,"206":0,"210":1,"218":1,"222":5,"226":0,"234":1,"242":0,"246":1},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":1,"2":3,"3":3,"4":3,"5":1,"6":1,"7":1,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3,"18":3,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":4,"36":4,"37":4,"38":1,"39":0,"40":0,"41":0,"42":2,"43":1,"44":3,"45":0,"46":0,"47":1,"48":1,"49":5,"50":0,"51":1,"52":0,"53":1},"b":{"1":[0,1],"2":[0,3],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,4],"7":[0,1],"8":[0,0]},"f":{"1":1,"2":3,"3":1,"4":3,"5":0,"6":0,"7":0,"8":4,"9":1,"10":2,"11":1,"12":3,"13":0,"14":0,"15":1,"16":1,"17":5,"18":0,"19":1,"20":0,"21":1},"fnMap":{"1":{"name":"isApporovedByDao","line":49,"loc":{"start":{"line":49,"column":4},"end":{"line":53,"column":4}}},"2":{"name":"constructor","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"3":{"name":"fund","line":64,"loc":{"start":{"line":61,"column":4},"end":{"line":69,"column":4}}},"4":{"name":"apporoveFundingByDao","line":76,"loc":{"start":{"line":71,"column":4},"end":{"line":93,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":95,"loc":{"start":{"line":95,"column":4},"end":{"line":100,"column":4}}},"6":{"name":"checkUpkeep","line":102,"loc":{"start":{"line":102,"column":4},"end":{"line":116,"column":4}}},"7":{"name":"performUpkeep","line":118,"loc":{"start":{"line":118,"column":4},"end":{"line":144,"column":4}}},"8":{"name":"paySubmitFee","line":146,"loc":{"start":{"line":146,"column":4},"end":{"line":153,"column":4}}},"9":{"name":"withdrawFund","line":155,"loc":{"start":{"line":155,"column":4},"end":{"line":167,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":169,"loc":{"start":{"line":169,"column":4},"end":{"line":175,"column":4}}},"11":{"name":"_getHashOfProjectData","line":177,"loc":{"start":{"line":177,"column":4},"end":{"line":183,"column":4}}},"12":{"name":"_getProjectId","line":185,"loc":{"start":{"line":185,"column":4},"end":{"line":191,"column":4}}},"13":{"name":"_getBalanceOfProject","line":193,"loc":{"start":{"line":193,"column":4},"end":{"line":199,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":201,"loc":{"start":{"line":201,"column":4},"end":{"line":207,"column":4}}},"15":{"name":"is_funding","line":209,"loc":{"start":{"line":209,"column":4},"end":{"line":211,"column":4}}},"16":{"name":"_getProjectStatus","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"17":{"name":"getEnteranceFee","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":227,"column":4}}},"19":{"name":"getFunderBalance","line":229,"loc":{"start":{"line":229,"column":4},"end":{"line":235,"column":4}}},"20":{"name":"getInvestedProjects","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":243,"column":4}}},"21":{"name":"getDaoPercentage","line":245,"loc":{"start":{"line":245,"column":4},"end":{"line":247,"column":4}}}},"statementMap":{"1":{"start":{"line":50,"column":8},"end":{"line":50,"column":2037}},"2":{"start":{"line":56,"column":8},"end":{"line":56,"column":38}},"3":{"start":{"line":57,"column":8},"end":{"line":57,"column":37}},"4":{"start":{"line":58,"column":8},"end":{"line":58,"column":35}},"5":{"start":{"line":66,"column":8},"end":{"line":66,"column":50}},"6":{"start":{"line":67,"column":8},"end":{"line":67,"column":43}},"7":{"start":{"line":68,"column":8},"end":{"line":68,"column":49}},"8":{"start":{"line":78,"column":8},"end":{"line":78,"column":2806}},"9":{"start":{"line":81,"column":12},"end":{"line":81,"column":60}},"10":{"start":{"line":82,"column":12},"end":{"line":82,"column":77}},"11":{"start":{"line":83,"column":12},"end":{"line":83,"column":34}},"12":{"start":{"line":84,"column":12},"end":{"line":84,"column":67}},"13":{"start":{"line":85,"column":12},"end":{"line":85,"column":49}},"14":{"start":{"line":86,"column":12},"end":{"line":86,"column":42}},"15":{"start":{"line":87,"column":12},"end":{"line":87,"column":64}},"16":{"start":{"line":88,"column":12},"end":{"line":88,"column":46}},"17":{"start":{"line":89,"column":12},"end":{"line":89,"column":39}},"18":{"start":{"line":90,"column":12},"end":{"line":90,"column":48}},"19":{"start":{"line":97,"column":8},"end":{"line":97,"column":43}},"20":{"start":{"line":98,"column":8},"end":{"line":98,"column":36}},"21":{"start":{"line":99,"column":8},"end":{"line":99,"column":71}},"22":{"start":{"line":113,"column":8},"end":{"line":113,"column":4078}},"23":{"start":{"line":121,"column":8},"end":{"line":121,"column":47}},"24":{"start":{"line":122,"column":8},"end":{"line":122,"column":4365}},"25":{"start":{"line":125,"column":8},"end":{"line":125,"column":36}},"26":{"start":{"line":126,"column":8},"end":{"line":126,"column":43}},"27":{"start":{"line":128,"column":8},"end":{"line":128,"column":4538}},"28":{"start":{"line":129,"column":12},"end":{"line":129,"column":74}},"29":{"start":{"line":130,"column":12},"end":{"line":130,"column":4707}},"30":{"start":{"line":132,"column":12},"end":{"line":132,"column":4804}},"31":{"start":{"line":135,"column":12},"end":{"line":135,"column":4923}},"32":{"start":{"line":139,"column":12},"end":{"line":139,"column":53}},"33":{"start":{"line":141,"column":12},"end":{"line":141,"column":73}},"34":{"start":{"line":142,"column":12},"end":{"line":142,"column":48}},"35":{"start":{"line":147,"column":8},"end":{"line":147,"column":5295}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":49}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":45}},"38":{"start":{"line":156,"column":8},"end":{"line":156,"column":5575}},"39":{"start":{"line":157,"column":12},"end":{"line":157,"column":64}},"40":{"start":{"line":158,"column":12},"end":{"line":158,"column":5730}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":5841}},"42":{"start":{"line":174,"column":8},"end":{"line":174,"column":43}},"43":{"start":{"line":182,"column":8},"end":{"line":182,"column":34}},"44":{"start":{"line":190,"column":8},"end":{"line":190,"column":41}},"45":{"start":{"line":198,"column":8},"end":{"line":198,"column":38}},"46":{"start":{"line":206,"column":8},"end":{"line":206,"column":50}},"47":{"start":{"line":210,"column":8},"end":{"line":210,"column":37}},"48":{"start":{"line":218,"column":8},"end":{"line":218,"column":48}},"49":{"start":{"line":222,"column":8},"end":{"line":222,"column":27}},"50":{"start":{"line":226,"column":8},"end":{"line":226,"column":43}},"51":{"start":{"line":234,"column":8},"end":{"line":234,"column":46}},"52":{"start":{"line":242,"column":8},"end":{"line":242,"column":41}},"53":{"start":{"line":246,"column":8},"end":{"line":246,"column":28}}},"branchMap":{"1":{"line":50,"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":50,"column":8}},{"start":{"line":50,"column":8},"end":{"line":50,"column":8}}]},"2":{"line":78,"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":8}},{"start":{"line":78,"column":8},"end":{"line":78,"column":8}}]},"3":{"line":122,"type":"if","locations":[{"start":{"line":122,"column":8},"end":{"line":122,"column":8}},{"start":{"line":122,"column":8},"end":{"line":122,"column":8}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":8},"end":{"line":128,"column":8}},{"start":{"line":128,"column":8},"end":{"line":128,"column":8}}]},"5":{"line":135,"type":"if","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":12}},{"start":{"line":135,"column":12},"end":{"line":135,"column":12}}]},"6":{"line":147,"type":"if","locations":[{"start":{"line":147,"column":8},"end":{"line":147,"column":8}},{"start":{"line":147,"column":8},"end":{"line":147,"column":8}}]},"7":{"line":156,"type":"if","locations":[{"start":{"line":156,"column":8},"end":{"line":156,"column":8}},{"start":{"line":156,"column":8},"end":{"line":156,"column":8}}]},"8":{"line":161,"type":"if","locations":[{"start":{"line":161,"column":12},"end":{"line":161,"column":12}},{"start":{"line":161,"column":12},"end":{"line":161,"column":12}}]}}}, -"contracts/GovernanceToken.sol":{"l":{"20":3,"28":19,"29":19,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":19,"3":19,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":19,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}}, -"contracts/GovernerContract.sol":{"l":{"52":4,"61":4,"70":12,"79":26,"88":8,"89":4,"91":4,"100":4,"110":3,"119":0,"128":6,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":4,"2":4,"3":12,"4":26,"5":8,"6":4,"7":4,"8":3,"9":0,"10":6,"11":0},"b":{"1":[4,4]},"f":{"1":3,"2":4,"3":4,"4":12,"5":26,"6":8,"7":4,"8":3,"9":0,"10":6,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, +"contracts/FundProject.sol":{"l":{"51":3,"52":0,"53":3,"57":3,"58":3,"59":3,"67":3,"68":3,"69":3,"79":7,"80":0,"82":7,"83":7,"84":7,"85":7,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"98":0,"99":0,"100":0,"111":12,"112":14,"113":14,"115":14,"116":14,"117":4,"118":4,"124":4,"125":4,"126":1,"129":3,"130":3,"131":3,"133":3,"134":1,"135":1,"137":1,"138":1,"141":1,"142":0,"145":1,"147":2,"148":2,"153":8,"154":0,"156":8,"157":8,"162":1,"163":0,"164":0,"167":0,"168":0,"171":1,"180":4,"188":1,"196":7,"204":1,"212":0,"216":3,"224":2,"228":9,"232":0,"240":2,"248":0,"252":1,"260":0,"261":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":1,"46":0,"47":0,"48":0,"49":4,"50":1,"51":7,"52":1,"53":0,"54":3,"55":2,"56":9,"57":0,"58":2,"59":0,"60":1,"61":0,"62":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[0,1],"9":[0,0]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":1,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":2,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":54,"column":4}}},"2":{"name":"constructor","line":56,"loc":{"start":{"line":56,"column":4},"end":{"line":60,"column":4}}},"3":{"name":"fund","line":65,"loc":{"start":{"line":62,"column":4},"end":{"line":70,"column":4}}},"4":{"name":"apporoveFundingByDao","line":77,"loc":{"start":{"line":72,"column":4},"end":{"line":94,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":101,"column":4}}},"6":{"name":"checkUpkeep","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":121,"column":4}}},"7":{"name":"performUpkeep","line":123,"loc":{"start":{"line":123,"column":4},"end":{"line":150,"column":4}}},"8":{"name":"paySubmitFee","line":152,"loc":{"start":{"line":152,"column":4},"end":{"line":159,"column":4}}},"9":{"name":"withdrawFund","line":161,"loc":{"start":{"line":161,"column":4},"end":{"line":173,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":181,"column":4}}},"11":{"name":"_getHashOfProjectData","line":183,"loc":{"start":{"line":183,"column":4},"end":{"line":189,"column":4}}},"12":{"name":"_getProjectId","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"13":{"name":"_getBalanceOfProject","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"15":{"name":"is_funding","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":217,"column":4}}},"16":{"name":"_getProjectStatus","line":219,"loc":{"start":{"line":219,"column":4},"end":{"line":225,"column":4}}},"17":{"name":"getEnteranceFee","line":227,"loc":{"start":{"line":227,"column":4},"end":{"line":229,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"19":{"name":"getFunderBalance","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"20":{"name":"getInvestedProjects","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":249,"column":4}}},"21":{"name":"getDaoPercentage","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":253,"column":4}}},"22":{"name":"getTimeleft","line":255,"loc":{"start":{"line":255,"column":4},"end":{"line":262,"column":4}}}},"statementMap":{"1":{"start":{"line":51,"column":8},"end":{"line":51,"column":2067}},"2":{"start":{"line":57,"column":8},"end":{"line":57,"column":38}},"3":{"start":{"line":58,"column":8},"end":{"line":58,"column":37}},"4":{"start":{"line":59,"column":8},"end":{"line":59,"column":35}},"5":{"start":{"line":67,"column":8},"end":{"line":67,"column":50}},"6":{"start":{"line":68,"column":8},"end":{"line":68,"column":43}},"7":{"start":{"line":69,"column":8},"end":{"line":69,"column":49}},"8":{"start":{"line":79,"column":8},"end":{"line":79,"column":2836}},"9":{"start":{"line":82,"column":12},"end":{"line":82,"column":60}},"10":{"start":{"line":83,"column":12},"end":{"line":83,"column":77}},"11":{"start":{"line":84,"column":12},"end":{"line":84,"column":34}},"12":{"start":{"line":85,"column":12},"end":{"line":85,"column":67}},"13":{"start":{"line":86,"column":12},"end":{"line":86,"column":49}},"14":{"start":{"line":87,"column":12},"end":{"line":87,"column":42}},"15":{"start":{"line":88,"column":12},"end":{"line":88,"column":64}},"16":{"start":{"line":89,"column":12},"end":{"line":89,"column":46}},"17":{"start":{"line":90,"column":12},"end":{"line":90,"column":39}},"18":{"start":{"line":91,"column":12},"end":{"line":91,"column":48}},"19":{"start":{"line":98,"column":8},"end":{"line":98,"column":43}},"20":{"start":{"line":99,"column":8},"end":{"line":99,"column":36}},"21":{"start":{"line":100,"column":8},"end":{"line":100,"column":71}},"22":{"start":{"line":111,"column":8},"end":{"line":111,"column":4023}},"23":{"start":{"line":112,"column":12},"end":{"line":112,"column":41}},"24":{"start":{"line":113,"column":12},"end":{"line":113,"column":4133}},"25":{"start":{"line":115,"column":12},"end":{"line":115,"column":50}},"26":{"start":{"line":116,"column":12},"end":{"line":116,"column":4280}},"27":{"start":{"line":117,"column":16},"end":{"line":117,"column":48}},"28":{"start":{"line":124,"column":8},"end":{"line":124,"column":47}},"29":{"start":{"line":125,"column":8},"end":{"line":125,"column":4533}},"30":{"start":{"line":129,"column":8},"end":{"line":129,"column":57}},"31":{"start":{"line":130,"column":8},"end":{"line":130,"column":36}},"32":{"start":{"line":131,"column":8},"end":{"line":131,"column":43}},"33":{"start":{"line":133,"column":8},"end":{"line":133,"column":4766}},"34":{"start":{"line":134,"column":12},"end":{"line":134,"column":74}},"35":{"start":{"line":135,"column":12},"end":{"line":135,"column":4935}},"36":{"start":{"line":137,"column":12},"end":{"line":137,"column":38}},"37":{"start":{"line":138,"column":12},"end":{"line":138,"column":5073}},"38":{"start":{"line":141,"column":12},"end":{"line":141,"column":5192}},"39":{"start":{"line":145,"column":12},"end":{"line":145,"column":53}},"40":{"start":{"line":147,"column":12},"end":{"line":147,"column":73}},"41":{"start":{"line":148,"column":12},"end":{"line":148,"column":48}},"42":{"start":{"line":153,"column":8},"end":{"line":153,"column":5564}},"43":{"start":{"line":156,"column":12},"end":{"line":156,"column":49}},"44":{"start":{"line":157,"column":12},"end":{"line":157,"column":45}},"45":{"start":{"line":162,"column":8},"end":{"line":162,"column":5844}},"46":{"start":{"line":163,"column":12},"end":{"line":163,"column":64}},"47":{"start":{"line":164,"column":12},"end":{"line":164,"column":5999}},"48":{"start":{"line":167,"column":12},"end":{"line":167,"column":6110}},"49":{"start":{"line":180,"column":8},"end":{"line":180,"column":43}},"50":{"start":{"line":188,"column":8},"end":{"line":188,"column":34}},"51":{"start":{"line":196,"column":8},"end":{"line":196,"column":41}},"52":{"start":{"line":204,"column":8},"end":{"line":204,"column":38}},"53":{"start":{"line":212,"column":8},"end":{"line":212,"column":50}},"54":{"start":{"line":216,"column":8},"end":{"line":216,"column":37}},"55":{"start":{"line":224,"column":8},"end":{"line":224,"column":48}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":27}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":43}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":46}},"59":{"start":{"line":248,"column":8},"end":{"line":248,"column":41}},"60":{"start":{"line":252,"column":8},"end":{"line":252,"column":28}},"61":{"start":{"line":260,"column":8},"end":{"line":260,"column":72}},"62":{"start":{"line":261,"column":8},"end":{"line":261,"column":27}}},"branchMap":{"1":{"line":51,"type":"if","locations":[{"start":{"line":51,"column":8},"end":{"line":51,"column":8}},{"start":{"line":51,"column":8},"end":{"line":51,"column":8}}]},"2":{"line":79,"type":"if","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":8}},{"start":{"line":79,"column":8},"end":{"line":79,"column":8}}]},"3":{"line":116,"type":"if","locations":[{"start":{"line":116,"column":12},"end":{"line":116,"column":12}},{"start":{"line":116,"column":12},"end":{"line":116,"column":12}}]},"4":{"line":125,"type":"if","locations":[{"start":{"line":125,"column":8},"end":{"line":125,"column":8}},{"start":{"line":125,"column":8},"end":{"line":125,"column":8}}]},"5":{"line":133,"type":"if","locations":[{"start":{"line":133,"column":8},"end":{"line":133,"column":8}},{"start":{"line":133,"column":8},"end":{"line":133,"column":8}}]},"6":{"line":141,"type":"if","locations":[{"start":{"line":141,"column":12},"end":{"line":141,"column":12}},{"start":{"line":141,"column":12},"end":{"line":141,"column":12}}]},"7":{"line":153,"type":"if","locations":[{"start":{"line":153,"column":8},"end":{"line":153,"column":8}},{"start":{"line":153,"column":8},"end":{"line":153,"column":8}}]},"8":{"line":162,"type":"if","locations":[{"start":{"line":162,"column":8},"end":{"line":162,"column":8}},{"start":{"line":162,"column":8},"end":{"line":162,"column":8}}]},"9":{"line":167,"type":"if","locations":[{"start":{"line":167,"column":12},"end":{"line":167,"column":12}},{"start":{"line":167,"column":12},"end":{"line":167,"column":12}}]}}}, +"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}}, +"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index 8e9a379..a355464 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,28 +20,28 @@

- 63.38% + 82.5% Statements - 45/71 + 66/80
- 33.33% + 65% Branches - 6/18 + 13/20
- 74.36% + 80% Functions - 29/39 + 32/40
- 60.49% + 79.12% Lines - 49/81 + 72/91
-
+
FundProject.sol
56.6%30/5325%4/1666.67%14/2153.23%33/62FundProject.sol
82.26%51/6261.11%11/1877.27%17/2277.78%56/72
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html index 5dbf873..21910d1 100644 --- a/coverage/lcov-report/contracts/FundProject.sol.html +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -20,28 +20,28 @@

- 56.6% + 82.26% Statements - 30/53 + 51/62
- 25% + 61.11% Branches - 4/16 + 11/18
- 66.67% + 77.27% Functions - 14/21 + 17/22
- 53.23% + 77.78% Lines - 33/62 + 56/72
-
+
contracts/
63.38%45/7133.33%6/1874.36%29/3960.49%49/81contracts/
82.5%66/8065%13/2080%32/4079.12%72/91
1 2 @@ -291,7 +291,22 @@

246 247 248 -249

  +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264        @@ -340,9 +355,10 @@

      - +  +   - +       @@ -356,9 +372,9 @@

      - - - + + +       @@ -368,20 +384,20 @@

      - +     - - - - - - - - - - - + + + + + + + + + + +       @@ -400,48 +416,53 @@

      +12× +14× +14×   -  -  -  -  +14× +14× + +           + + +   -  -  -    -  -  + + +   -  -  -  + + +   -  + +     -  +       -  +   -  -  + +         - +     - - + +       @@ -464,7 +485,7 @@

      - +       @@ -480,7 +501,7 @@

      - +       @@ -488,7 +509,7 @@

      -  +       @@ -500,7 +521,7 @@

      - +       @@ -508,11 +529,11 @@

      - +       - +       @@ -524,7 +545,7 @@

      - +       @@ -539,11 +560,21 @@

    +  +  +  +  +  +  +  +  +   

// SPDX-License-Identifier: MIT
 pragma solidity ^0.8.0;
  
 import "@openzeppelin/contracts/access/Ownable.sol";
 import "@chainlink/contracts/src/v0.8/AutomationCompatible.sol";
+import "hardhat/console.sol";
  
 error FundProject__NotApporovedByDao();
 error FundProject__UpkeepNeeded();
@@ -640,47 +671,52 @@ 

_ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; }   - function checkUpkeep( + function checkUpkeep( bytes memory /* checkData */ ) public view override - returns ( - bool upkeepNeeded, - bytes memory /* performData */ - ) + returns (bool upkeepNeeded, bytes memory performData) { - upkeepNeeded = (_isFunding[projectId] && - (block.timestamp - projectToTime[projectId][time[projectId]]) > - projectToTime[projectId][time[projectId]]); + for (uint i = 1; i <= projectId; i++) { + bool isFunded = _isFunding[i]; + bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) > + time[i]; + upkeepNeeded = (isFunded && timePassed); + if (upkeepNeeded) { + performData = abi.encodePacked(i); + break; + } + } }   - function performUpkeep( - bytes calldata /* performData */ - ) external override { - (bool upkeepNeeded, ) = checkUpkeep(""); - if (!upkeepNeeded) { + function performUpkeep(bytes calldata performData) external override { + (bool upkeepNeeded, ) = checkUpkeep(""); + if (!upkeepNeeded) { revert FundProject__UpkeepNeeded(); } - _isFunding[projectId] = false; - _isApporovedByDao[projectId] = false;   - if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) { - _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS; - uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) / + uint256 ProjectId = uint256(bytes32(performData)); + _isFunding[ProjectId] = false; + _isApporovedByDao[ProjectId] = false; +  + if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) { + _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS; + uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) / 100; - (bool success, ) = (projectOwnerAddress[projectId]).call{ + projectFunds[ProjectId] = 0; + (bool success, ) = (projectOwnerAddress[ProjectId]).call{ value: fundsToSent }(""); - if (!success) { - revert FundProject__TransferFailed(projectFunds[projectId]); + Iif (!success) { + revert FundProject__TransferFailed(projectFunds[ProjectId]); }   - emit projectSuccessfullyFunded(projectId); + emit projectSuccessfullyFunded(ProjectId); } else { - _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED; - emit projectFundingFailed(projectId); + _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.FAILED; + emit projectFundingFailed(ProjectId); } }   @@ -731,12 +767,12 @@

return hashToProjectId[_ipfsHash]; }   - function _getBalanceOfProject(uint256 _projecID) + function _getBalanceOfProject(uint256 _projecID) public view returns (uint256) { - return projectFunds[_projecID]; + return projectFunds[_projecID]; }   function _getFundingGoalAmount(uint256 _projecID) @@ -786,6 +822,15 @@

function getDaoPercentage() public view returns (uint256) { return daoPercentage; } +  + function getTimeleft(uint256 _projectID) + public + view + returns (uint256 a, uint256 b) + { + a = block.timestamp - projectToTime[_projectID][time[_projectID]]; + b = time[_projectID]; + } }  

@@ -793,7 +838,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index 458d3d2..78cc782 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -124,8 +124,8 @@

      -19× -19× +31× +31×       @@ -211,7 +211,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 89cc827..57f7299 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -233,7 +233,7 @@

      - +       @@ -242,7 +242,7 @@

      - +       @@ -251,7 +251,7 @@

      -12× +24×       @@ -260,7 +260,7 @@

      -26× +50×       @@ -269,10 +269,10 @@

      +16× -   - +       @@ -281,7 +281,7 @@

      - +       @@ -291,7 +291,7 @@

      - +       @@ -309,7 +309,7 @@

      - +14×       @@ -466,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index da321e1..c0b1896 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index ea2e6f8..728ba18 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,28 +20,28 @@

- 63.38% + 82.5% Statements - 45/71 + 66/80
- 33.33% + 65% Branches - 6/18 + 13/20
- 74.36% + 80% Functions - 29/39 + 32/40
- 60.49% + 79.12% Lines - 49/81 + 72/91
-
+
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index 8e9a379..a355464 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,28 +20,28 @@

- 63.38% + 82.5% Statements - 45/71 + 66/80
- 33.33% + 65% Branches - 6/18 + 13/20
- 74.36% + 80% Functions - 29/39 + 32/40
- 60.49% + 79.12% Lines - 49/81 + 72/91
-
+
FundProject.sol
56.6%30/5325%4/1666.67%14/2153.23%33/62FundProject.sol
82.26%51/6261.11%11/1877.27%17/2277.78%56/72
@@ -59,16 +59,16 @@

- - - - - - - - - - + + + + + + + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 2f4ccf6..c8509d9 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -1,131 +1,145 @@ TN: SF:/home/furkansezal/dao/contracts/FundProject.sol -FN:49,isApporovedByDao -FN:55,constructor -FN:64,fund -FN:76,apporoveFundingByDao -FN:95,cancelApporovelFundingByDao -FN:102,checkUpkeep -FN:118,performUpkeep -FN:146,paySubmitFee -FN:155,withdrawFund -FN:169,_isApporoveFundingByDao -FN:177,_getHashOfProjectData -FN:185,_getProjectId -FN:193,_getBalanceOfProject -FN:201,_getFundingGoalAmount -FN:209,is_funding -FN:213,_getProjectStatus -FN:221,getEnteranceFee -FN:225,isEnteranceFeePaid -FN:229,getFunderBalance -FN:237,getInvestedProjects -FN:245,getDaoPercentage -FNF:21 -FNH:14 -FNDA:1,isApporovedByDao +FN:50,isApporovedByDao +FN:56,constructor +FN:65,fund +FN:77,apporoveFundingByDao +FN:96,cancelApporovelFundingByDao +FN:103,checkUpkeep +FN:123,performUpkeep +FN:152,paySubmitFee +FN:161,withdrawFund +FN:175,_isApporoveFundingByDao +FN:183,_getHashOfProjectData +FN:191,_getProjectId +FN:199,_getBalanceOfProject +FN:207,_getFundingGoalAmount +FN:215,is_funding +FN:219,_getProjectStatus +FN:227,getEnteranceFee +FN:231,isEnteranceFeePaid +FN:235,getFunderBalance +FN:243,getInvestedProjects +FN:251,getDaoPercentage +FN:255,getTimeleft +FNF:22 +FNH:17 +FNDA:3,isApporovedByDao FNDA:3,constructor -FNDA:1,fund -FNDA:3,apporoveFundingByDao +FNDA:3,fund +FNDA:7,apporoveFundingByDao FNDA:0,cancelApporovelFundingByDao -FNDA:0,checkUpkeep -FNDA:0,performUpkeep -FNDA:4,paySubmitFee +FNDA:12,checkUpkeep +FNDA:4,performUpkeep +FNDA:8,paySubmitFee FNDA:1,withdrawFund -FNDA:2,_isApporoveFundingByDao +FNDA:4,_isApporoveFundingByDao FNDA:1,_getHashOfProjectData -FNDA:3,_getProjectId -FNDA:0,_getBalanceOfProject +FNDA:7,_getProjectId +FNDA:1,_getBalanceOfProject FNDA:0,_getFundingGoalAmount -FNDA:1,is_funding -FNDA:1,_getProjectStatus -FNDA:5,getEnteranceFee +FNDA:3,is_funding +FNDA:2,_getProjectStatus +FNDA:9,getEnteranceFee FNDA:0,isEnteranceFeePaid -FNDA:1,getFunderBalance +FNDA:2,getFunderBalance FNDA:0,getInvestedProjects FNDA:1,getDaoPercentage -DA:50,1 -DA:51,0 -DA:52,1 -DA:56,3 +FNDA:0,getTimeleft +DA:51,3 +DA:52,0 +DA:53,3 DA:57,3 DA:58,3 -DA:66,1 -DA:67,1 -DA:68,1 -DA:78,3 -DA:79,0 -DA:81,3 -DA:82,3 -DA:83,3 -DA:84,3 -DA:85,3 -DA:86,3 -DA:87,3 -DA:88,3 -DA:89,3 -DA:90,3 -DA:91,3 -DA:97,0 +DA:59,3 +DA:67,3 +DA:68,3 +DA:69,3 +DA:79,7 +DA:80,0 +DA:82,7 +DA:83,7 +DA:84,7 +DA:85,7 +DA:86,7 +DA:87,7 +DA:88,7 +DA:89,7 +DA:90,7 +DA:91,7 +DA:92,7 DA:98,0 DA:99,0 -DA:113,0 -DA:121,0 -DA:122,0 -DA:123,0 -DA:125,0 -DA:126,0 -DA:128,0 -DA:129,0 -DA:130,0 -DA:132,0 -DA:135,0 -DA:136,0 -DA:139,0 -DA:141,0 +DA:100,0 +DA:111,12 +DA:112,14 +DA:113,14 +DA:115,14 +DA:116,14 +DA:117,4 +DA:118,4 +DA:124,4 +DA:125,4 +DA:126,1 +DA:129,3 +DA:130,3 +DA:131,3 +DA:133,3 +DA:134,1 +DA:135,1 +DA:137,1 +DA:138,1 +DA:141,1 DA:142,0 -DA:147,4 -DA:148,0 -DA:150,4 -DA:151,4 -DA:156,1 -DA:157,0 -DA:158,0 -DA:161,0 -DA:162,0 -DA:165,1 -DA:174,2 -DA:182,1 -DA:190,3 -DA:198,0 -DA:206,0 -DA:210,1 -DA:218,1 -DA:222,5 -DA:226,0 -DA:234,1 -DA:242,0 -DA:246,1 -LF:62 -LH:33 -BRDA:50,1,0,0 -BRDA:50,1,1,1 -BRDA:78,2,0,0 -BRDA:78,2,1,3 -BRDA:122,3,0,0 -BRDA:122,3,1,0 -BRDA:128,4,0,0 -BRDA:128,4,1,0 -BRDA:135,5,0,0 -BRDA:135,5,1,0 -BRDA:147,6,0,0 -BRDA:147,6,1,4 -BRDA:156,7,0,0 -BRDA:156,7,1,1 -BRDA:161,8,0,0 -BRDA:161,8,1,0 -BRF:16 -BRH:4 +DA:145,1 +DA:147,2 +DA:148,2 +DA:153,8 +DA:154,0 +DA:156,8 +DA:157,8 +DA:162,1 +DA:163,0 +DA:164,0 +DA:167,0 +DA:168,0 +DA:171,1 +DA:180,4 +DA:188,1 +DA:196,7 +DA:204,1 +DA:212,0 +DA:216,3 +DA:224,2 +DA:228,9 +DA:232,0 +DA:240,2 +DA:248,0 +DA:252,1 +DA:260,0 +DA:261,0 +LF:72 +LH:56 +BRDA:51,1,0,0 +BRDA:51,1,1,3 +BRDA:79,2,0,0 +BRDA:79,2,1,7 +BRDA:116,3,0,4 +BRDA:116,3,1,10 +BRDA:125,4,0,1 +BRDA:125,4,1,3 +BRDA:133,5,0,1 +BRDA:133,5,1,2 +BRDA:141,6,0,0 +BRDA:141,6,1,1 +BRDA:153,7,0,0 +BRDA:153,7,1,8 +BRDA:162,8,0,0 +BRDA:162,8,1,1 +BRDA:167,9,0,0 +BRDA:167,9,1,0 +BRF:18 +BRH:11 end_of_record TN: SF:/home/furkansezal/dao/contracts/GovernanceToken.sol @@ -138,14 +152,14 @@ FN:48,_burn FNF:6 FNH:5 FNDA:3,constructor -FNDA:19,_afterTokenTransfer +FNDA:31,_afterTokenTransfer FNDA:3,_mint FNDA:0,mintToken FNDA:1,burnToken FNDA:1,_burn DA:20,3 -DA:28,19 -DA:29,19 +DA:28,31 +DA:29,31 DA:37,3 DA:41,0 DA:45,1 @@ -171,32 +185,32 @@ FN:131,supportsInterface FNF:11 FNH:9 FNDA:3,constructor -FNDA:4,votingDelay -FNDA:4,votingPeriod -FNDA:12,quorum -FNDA:26,state -FNDA:8,propose -FNDA:4,proposalThreshold -FNDA:3,_execute +FNDA:8,votingDelay +FNDA:8,votingPeriod +FNDA:24,quorum +FNDA:50,state +FNDA:16,propose +FNDA:8,proposalThreshold +FNDA:7,_execute FNDA:0,_cancel -FNDA:6,_executor +FNDA:14,_executor FNDA:0,supportsInterface -DA:52,4 -DA:61,4 -DA:70,12 -DA:79,26 -DA:88,8 -DA:89,4 -DA:91,4 -DA:100,4 -DA:110,3 +DA:52,8 +DA:61,8 +DA:70,24 +DA:79,50 +DA:88,16 +DA:89,8 +DA:91,8 +DA:100,8 +DA:110,7 DA:119,0 -DA:128,6 +DA:128,14 DA:137,0 LF:12 LH:10 -BRDA:88,1,0,4 -BRDA:88,1,1,4 +BRDA:88,1,0,8 +BRDA:88,1,1,8 BRF:2 BRH:2 end_of_record diff --git a/helper-config.js b/helper-config.js index 5a3493a..160b057 100644 --- a/helper-config.js +++ b/helper-config.js @@ -32,7 +32,7 @@ const s_website = "www.sampleProject.com"; const s_description = "Amazing way to make money"; const s_video = "https://www.youtube.com/watch?v=5abamRO41fE&list=RD5abamRO41fE&start_radio=1&ab_channel=Slipknot"; -const s_fundRaisingGoalAmount = 10000; +const s_fundRaisingGoalAmount = 10000; // in wei const s_roadMap = "Just click the video"; const s_otherSources = "You dont need anything else"; const s_fundingTime = 60; // 10 sec. diff --git a/test/unit/fundContract.test.js b/test/unit/fundContract.test.js index ea5941d..b9426e1 100644 --- a/test/unit/fundContract.test.js +++ b/test/unit/fundContract.test.js @@ -26,7 +26,9 @@ const fs = require("fs"); proposalState, projectId, blockNumber, + deployer, investor; + const provider = ethers.getDefaultProvider(); beforeEach(async () => { account1 = (await ethers.getSigners())[1]; account2 = (await ethers.getSigners())[2]; @@ -68,8 +70,8 @@ const fs = require("fs"); moveBlocks(1); - /* const { upkeepNeeded } = await governor.checkUpkeep([]); - assert(!upkeepNeeded); */ + const { upkeepNeeded } = await governor.checkUpkeep([]); + assert(!upkeepNeeded); await ethers.getContract("GovernanceToken", projectOwner); const args = "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu"; @@ -208,20 +210,90 @@ const fs = require("fs"); }); describe("checkUpkeep", async () => { - it("return false if project hasnt submit", async () => { - blockNumber = await ethers.provider.getBlockNumber(); - console.log(`Before ${blockNumber}`); + it("time has to pass to finish funding ", async () => { + const { upkeepNeeded1 } = await governor.checkUpkeep([]); + assert(!upkeepNeeded1); await moveTime(s_fundingTime + 1); - await moveBlocks(s_fundingTime + 1); - blockNumber = await ethers.provider.getBlockNumber(); - console.log(`Before ${blockNumber}`); + await moveBlocks(1); const { upkeepNeeded, performData } = await governor.checkUpkeep([]); - const { a, b } = await governor.getTimeleft(projectId); - console.log(`ProjectId = ${projectId}`); - console.log(await governor.is_funding(projectId)); - console.log(a.toString(), b.toString()); + assert(upkeepNeeded); console.log(performData); - // assert(!upkeepNeeded); + }); + }); + describe("performUpKeep", () => { + it("only call perfomUpKeep when its time", async () => { + await expect(governor.performUpkeep([])).to.be.revertedWith( + "FundProject__UpkeepNeeded" + ); + + await moveTime(s_fundingTime + 1); + await moveBlocks(1); + + const tx = await governor.performUpkeep([]); + assert(tx); + }); + + it("checking funding process", async () => { + const invest = ethers.utils.parseUnits("1", "ether"); + + await ethers.getContract("GovernerContract", investor); + const invTx = await governor.fund(projectId, { value: invest }); + + await invTx.wait(1); + + assert.equal( + (await governor.getFunderBalance(projectId)).toString(), + invest.toString() + ); + + await moveTime(s_fundingTime + 1); + await moveBlocks(1); + await expect( + governor.performUpkeep( + ethers.utils.hexZeroPad(ethers.utils.hexlify(1), 32) + ) + ).to.emit(governor, "projectSuccessfullyFunded"); + + assert.equal(await governor.is_funding(projectId), false); + assert.equal( + await governor._isApporoveFundingByDao(projectId), + false + ); + + assert.equal(await governor._getProjectStatus(projectId), "1"); + + assert.equal( + (await governor._getBalanceOfProject(projectId)).toString(), + "0" + ); + }); + it("Failed funding try to withdraw", async () => { + await ethers.getContract("GovernerContract", investor); + const beforeInvestBalance = await investor.getBalance(); + console.log(beforeInvestBalance.toString()); + const invTx = await governor.fund(projectId, { value: 100 }); + await invTx.wait(1); + const afterInvestBalance = await investor.getBalance(); + console.log(afterInvestBalance.toString()); + await moveTime(s_fundingTime + 1); + await moveBlocks(1); + + await expect( + governor.performUpkeep( + ethers.utils.hexZeroPad(ethers.utils.hexlify(1), 32) + ) + ).to.emit(governor, "projectFundingFailed"); + + assert.equal(await governor.is_funding(projectId), false); + assert.equal( + await governor._isApporoveFundingByDao(projectId), + false + ); + assert.equal(await governor._getProjectStatus(projectId), "2"); + await expect(governor.withdrawFund(projectId)).to.emit( + governor, + "withdrawFundSuccessfully" + ); }); }); }); From 1e4c63ec8dd5be76b7396223002cf91ee3594894 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Thu, 10 Nov 2022 17:56:49 +0300 Subject: [PATCH 21/28] Add chainlink automation Fix big bug. Add tests V3 --- coverage.json | 2 +- coverage/contracts/FundProject.sol.html | 50 +++- coverage/contracts/GovernanceToken.sol.html | 2 +- coverage/contracts/GovernerContract.sol.html | 2 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 28 +- coverage/coverage-final.json | 2 +- coverage/index.html | 28 +- .../contracts/FundProject.sol.html | 50 +++- .../contracts/GovernanceToken.sol.html | 2 +- .../contracts/GovernerContract.sol.html | 2 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 28 +- coverage/lcov-report/index.html | 28 +- coverage/lcov.info | 206 ++++++------- deployments/localhost/GovernanceToken.json | 12 +- deployments/localhost/GovernerContract.json | 273 ++++++++++++++---- deployments/localhost/TimeLock.json | 18 +- ... => 9bb96e2ab1a2d14e7d6f1254972fa73c.json} | 71 ++--- .../edf7a7fc578491be0baac88ac737a638.json | 128 -------- proposals.json | 2 +- readme.md | 5 + scripts/del.js | 35 +++ scripts/fund.js | 42 +++ test/unit/fundContract.test.js | 1 + 25 files changed, 583 insertions(+), 438 deletions(-) rename deployments/localhost/solcInputs/{e037150c05e743a0afcdb8bf195f828d.json => 9bb96e2ab1a2d14e7d6f1254972fa73c.json} (73%) delete mode 100644 deployments/localhost/solcInputs/edf7a7fc578491be0baac88ac737a638.json create mode 100644 readme.md create mode 100644 scripts/del.js create mode 100644 scripts/fund.js diff --git a/coverage.json b/coverage.json index 0b74a58..48e5afd 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/FundProject.sol":{"l":{"51":3,"52":0,"53":3,"57":3,"58":3,"59":3,"67":3,"68":3,"69":3,"79":7,"80":0,"82":7,"83":7,"84":7,"85":7,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"98":0,"99":0,"100":0,"111":12,"112":14,"113":14,"115":14,"116":14,"117":4,"118":4,"124":4,"125":4,"126":1,"129":3,"130":3,"131":3,"133":3,"134":1,"135":1,"137":1,"138":1,"141":1,"142":0,"145":1,"147":2,"148":2,"153":8,"154":0,"156":8,"157":8,"162":1,"163":0,"164":0,"167":0,"168":0,"171":1,"180":4,"188":1,"196":7,"204":1,"212":0,"216":3,"224":2,"228":9,"232":0,"240":2,"248":0,"252":1,"260":0,"261":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":1,"46":0,"47":0,"48":0,"49":4,"50":1,"51":7,"52":1,"53":0,"54":3,"55":2,"56":9,"57":0,"58":2,"59":0,"60":1,"61":0,"62":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[0,1],"9":[0,0]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":1,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":2,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":54,"column":4}}},"2":{"name":"constructor","line":56,"loc":{"start":{"line":56,"column":4},"end":{"line":60,"column":4}}},"3":{"name":"fund","line":65,"loc":{"start":{"line":62,"column":4},"end":{"line":70,"column":4}}},"4":{"name":"apporoveFundingByDao","line":77,"loc":{"start":{"line":72,"column":4},"end":{"line":94,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":101,"column":4}}},"6":{"name":"checkUpkeep","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":121,"column":4}}},"7":{"name":"performUpkeep","line":123,"loc":{"start":{"line":123,"column":4},"end":{"line":150,"column":4}}},"8":{"name":"paySubmitFee","line":152,"loc":{"start":{"line":152,"column":4},"end":{"line":159,"column":4}}},"9":{"name":"withdrawFund","line":161,"loc":{"start":{"line":161,"column":4},"end":{"line":173,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":181,"column":4}}},"11":{"name":"_getHashOfProjectData","line":183,"loc":{"start":{"line":183,"column":4},"end":{"line":189,"column":4}}},"12":{"name":"_getProjectId","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"13":{"name":"_getBalanceOfProject","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"15":{"name":"is_funding","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":217,"column":4}}},"16":{"name":"_getProjectStatus","line":219,"loc":{"start":{"line":219,"column":4},"end":{"line":225,"column":4}}},"17":{"name":"getEnteranceFee","line":227,"loc":{"start":{"line":227,"column":4},"end":{"line":229,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"19":{"name":"getFunderBalance","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"20":{"name":"getInvestedProjects","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":249,"column":4}}},"21":{"name":"getDaoPercentage","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":253,"column":4}}},"22":{"name":"getTimeleft","line":255,"loc":{"start":{"line":255,"column":4},"end":{"line":262,"column":4}}}},"statementMap":{"1":{"start":{"line":51,"column":8},"end":{"line":51,"column":2067}},"2":{"start":{"line":57,"column":8},"end":{"line":57,"column":38}},"3":{"start":{"line":58,"column":8},"end":{"line":58,"column":37}},"4":{"start":{"line":59,"column":8},"end":{"line":59,"column":35}},"5":{"start":{"line":67,"column":8},"end":{"line":67,"column":50}},"6":{"start":{"line":68,"column":8},"end":{"line":68,"column":43}},"7":{"start":{"line":69,"column":8},"end":{"line":69,"column":49}},"8":{"start":{"line":79,"column":8},"end":{"line":79,"column":2836}},"9":{"start":{"line":82,"column":12},"end":{"line":82,"column":60}},"10":{"start":{"line":83,"column":12},"end":{"line":83,"column":77}},"11":{"start":{"line":84,"column":12},"end":{"line":84,"column":34}},"12":{"start":{"line":85,"column":12},"end":{"line":85,"column":67}},"13":{"start":{"line":86,"column":12},"end":{"line":86,"column":49}},"14":{"start":{"line":87,"column":12},"end":{"line":87,"column":42}},"15":{"start":{"line":88,"column":12},"end":{"line":88,"column":64}},"16":{"start":{"line":89,"column":12},"end":{"line":89,"column":46}},"17":{"start":{"line":90,"column":12},"end":{"line":90,"column":39}},"18":{"start":{"line":91,"column":12},"end":{"line":91,"column":48}},"19":{"start":{"line":98,"column":8},"end":{"line":98,"column":43}},"20":{"start":{"line":99,"column":8},"end":{"line":99,"column":36}},"21":{"start":{"line":100,"column":8},"end":{"line":100,"column":71}},"22":{"start":{"line":111,"column":8},"end":{"line":111,"column":4023}},"23":{"start":{"line":112,"column":12},"end":{"line":112,"column":41}},"24":{"start":{"line":113,"column":12},"end":{"line":113,"column":4133}},"25":{"start":{"line":115,"column":12},"end":{"line":115,"column":50}},"26":{"start":{"line":116,"column":12},"end":{"line":116,"column":4280}},"27":{"start":{"line":117,"column":16},"end":{"line":117,"column":48}},"28":{"start":{"line":124,"column":8},"end":{"line":124,"column":47}},"29":{"start":{"line":125,"column":8},"end":{"line":125,"column":4533}},"30":{"start":{"line":129,"column":8},"end":{"line":129,"column":57}},"31":{"start":{"line":130,"column":8},"end":{"line":130,"column":36}},"32":{"start":{"line":131,"column":8},"end":{"line":131,"column":43}},"33":{"start":{"line":133,"column":8},"end":{"line":133,"column":4766}},"34":{"start":{"line":134,"column":12},"end":{"line":134,"column":74}},"35":{"start":{"line":135,"column":12},"end":{"line":135,"column":4935}},"36":{"start":{"line":137,"column":12},"end":{"line":137,"column":38}},"37":{"start":{"line":138,"column":12},"end":{"line":138,"column":5073}},"38":{"start":{"line":141,"column":12},"end":{"line":141,"column":5192}},"39":{"start":{"line":145,"column":12},"end":{"line":145,"column":53}},"40":{"start":{"line":147,"column":12},"end":{"line":147,"column":73}},"41":{"start":{"line":148,"column":12},"end":{"line":148,"column":48}},"42":{"start":{"line":153,"column":8},"end":{"line":153,"column":5564}},"43":{"start":{"line":156,"column":12},"end":{"line":156,"column":49}},"44":{"start":{"line":157,"column":12},"end":{"line":157,"column":45}},"45":{"start":{"line":162,"column":8},"end":{"line":162,"column":5844}},"46":{"start":{"line":163,"column":12},"end":{"line":163,"column":64}},"47":{"start":{"line":164,"column":12},"end":{"line":164,"column":5999}},"48":{"start":{"line":167,"column":12},"end":{"line":167,"column":6110}},"49":{"start":{"line":180,"column":8},"end":{"line":180,"column":43}},"50":{"start":{"line":188,"column":8},"end":{"line":188,"column":34}},"51":{"start":{"line":196,"column":8},"end":{"line":196,"column":41}},"52":{"start":{"line":204,"column":8},"end":{"line":204,"column":38}},"53":{"start":{"line":212,"column":8},"end":{"line":212,"column":50}},"54":{"start":{"line":216,"column":8},"end":{"line":216,"column":37}},"55":{"start":{"line":224,"column":8},"end":{"line":224,"column":48}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":27}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":43}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":46}},"59":{"start":{"line":248,"column":8},"end":{"line":248,"column":41}},"60":{"start":{"line":252,"column":8},"end":{"line":252,"column":28}},"61":{"start":{"line":260,"column":8},"end":{"line":260,"column":72}},"62":{"start":{"line":261,"column":8},"end":{"line":261,"column":27}}},"branchMap":{"1":{"line":51,"type":"if","locations":[{"start":{"line":51,"column":8},"end":{"line":51,"column":8}},{"start":{"line":51,"column":8},"end":{"line":51,"column":8}}]},"2":{"line":79,"type":"if","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":8}},{"start":{"line":79,"column":8},"end":{"line":79,"column":8}}]},"3":{"line":116,"type":"if","locations":[{"start":{"line":116,"column":12},"end":{"line":116,"column":12}},{"start":{"line":116,"column":12},"end":{"line":116,"column":12}}]},"4":{"line":125,"type":"if","locations":[{"start":{"line":125,"column":8},"end":{"line":125,"column":8}},{"start":{"line":125,"column":8},"end":{"line":125,"column":8}}]},"5":{"line":133,"type":"if","locations":[{"start":{"line":133,"column":8},"end":{"line":133,"column":8}},{"start":{"line":133,"column":8},"end":{"line":133,"column":8}}]},"6":{"line":141,"type":"if","locations":[{"start":{"line":141,"column":12},"end":{"line":141,"column":12}},{"start":{"line":141,"column":12},"end":{"line":141,"column":12}}]},"7":{"line":153,"type":"if","locations":[{"start":{"line":153,"column":8},"end":{"line":153,"column":8}},{"start":{"line":153,"column":8},"end":{"line":153,"column":8}}]},"8":{"line":162,"type":"if","locations":[{"start":{"line":162,"column":8},"end":{"line":162,"column":8}},{"start":{"line":162,"column":8},"end":{"line":162,"column":8}}]},"9":{"line":167,"type":"if","locations":[{"start":{"line":167,"column":12},"end":{"line":167,"column":12}},{"start":{"line":167,"column":12},"end":{"line":167,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/FundProject.sol":{"l":{"55":3,"56":0,"57":3,"61":3,"62":3,"63":3,"71":3,"72":3,"73":3,"83":7,"84":0,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"102":0,"103":0,"104":0,"115":12,"116":14,"117":14,"119":14,"120":14,"121":4,"122":4,"128":4,"129":4,"130":1,"133":3,"134":3,"135":3,"137":3,"138":1,"139":1,"141":1,"142":1,"145":1,"146":0,"149":1,"151":2,"152":2,"157":8,"158":0,"160":8,"161":8,"166":2,"167":1,"168":1,"169":1,"172":1,"173":0,"175":1,"177":1,"186":4,"194":1,"202":7,"210":1,"218":0,"222":3,"230":3,"234":9,"238":0,"246":2,"254":0,"258":1,"266":0,"267":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"51":4,"52":1,"53":7,"54":1,"55":0,"56":3,"57":3,"58":9,"59":0,"60":2,"61":0,"62":1,"63":0,"64":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[1,1],"9":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":58,"column":4}}},"2":{"name":"constructor","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":64,"column":4}}},"3":{"name":"fund","line":69,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":4}}},"4":{"name":"apporoveFundingByDao","line":81,"loc":{"start":{"line":76,"column":4},"end":{"line":98,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":105,"column":4}}},"6":{"name":"checkUpkeep","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":125,"column":4}}},"7":{"name":"performUpkeep","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":154,"column":4}}},"8":{"name":"paySubmitFee","line":156,"loc":{"start":{"line":156,"column":4},"end":{"line":163,"column":4}}},"9":{"name":"withdrawFund","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":179,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":181,"loc":{"start":{"line":181,"column":4},"end":{"line":187,"column":4}}},"11":{"name":"_getHashOfProjectData","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":195,"column":4}}},"12":{"name":"_getProjectId","line":197,"loc":{"start":{"line":197,"column":4},"end":{"line":203,"column":4}}},"13":{"name":"_getBalanceOfProject","line":205,"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"15":{"name":"is_funding","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"16":{"name":"_getProjectStatus","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":231,"column":4}}},"17":{"name":"getEnteranceFee","line":233,"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":4}}},"19":{"name":"getFunderBalance","line":241,"loc":{"start":{"line":241,"column":4},"end":{"line":247,"column":4}}},"20":{"name":"getInvestedProjects","line":249,"loc":{"start":{"line":249,"column":4},"end":{"line":255,"column":4}}},"21":{"name":"getDaoPercentage","line":257,"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":4}}},"22":{"name":"getTimeleft","line":261,"loc":{"start":{"line":261,"column":4},"end":{"line":268,"column":4}}}},"statementMap":{"1":{"start":{"line":55,"column":8},"end":{"line":55,"column":2182}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":38}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":37}},"4":{"start":{"line":63,"column":8},"end":{"line":63,"column":35}},"5":{"start":{"line":71,"column":8},"end":{"line":71,"column":50}},"6":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"7":{"start":{"line":73,"column":8},"end":{"line":73,"column":49}},"8":{"start":{"line":83,"column":8},"end":{"line":83,"column":2951}},"9":{"start":{"line":86,"column":12},"end":{"line":86,"column":60}},"10":{"start":{"line":87,"column":12},"end":{"line":87,"column":77}},"11":{"start":{"line":88,"column":12},"end":{"line":88,"column":34}},"12":{"start":{"line":89,"column":12},"end":{"line":89,"column":67}},"13":{"start":{"line":90,"column":12},"end":{"line":90,"column":49}},"14":{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},"15":{"start":{"line":92,"column":12},"end":{"line":92,"column":64}},"16":{"start":{"line":93,"column":12},"end":{"line":93,"column":46}},"17":{"start":{"line":94,"column":12},"end":{"line":94,"column":39}},"18":{"start":{"line":95,"column":12},"end":{"line":95,"column":48}},"19":{"start":{"line":102,"column":8},"end":{"line":102,"column":43}},"20":{"start":{"line":103,"column":8},"end":{"line":103,"column":36}},"21":{"start":{"line":104,"column":8},"end":{"line":104,"column":71}},"22":{"start":{"line":115,"column":8},"end":{"line":115,"column":4138}},"23":{"start":{"line":116,"column":12},"end":{"line":116,"column":41}},"24":{"start":{"line":117,"column":12},"end":{"line":117,"column":4248}},"25":{"start":{"line":119,"column":12},"end":{"line":119,"column":50}},"26":{"start":{"line":120,"column":12},"end":{"line":120,"column":4395}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":48}},"28":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"29":{"start":{"line":129,"column":8},"end":{"line":129,"column":4648}},"30":{"start":{"line":133,"column":8},"end":{"line":133,"column":57}},"31":{"start":{"line":134,"column":8},"end":{"line":134,"column":36}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":43}},"33":{"start":{"line":137,"column":8},"end":{"line":137,"column":4881}},"34":{"start":{"line":138,"column":12},"end":{"line":138,"column":74}},"35":{"start":{"line":139,"column":12},"end":{"line":139,"column":5050}},"36":{"start":{"line":141,"column":12},"end":{"line":141,"column":38}},"37":{"start":{"line":142,"column":12},"end":{"line":142,"column":5188}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":5307}},"39":{"start":{"line":149,"column":12},"end":{"line":149,"column":53}},"40":{"start":{"line":151,"column":12},"end":{"line":151,"column":73}},"41":{"start":{"line":152,"column":12},"end":{"line":152,"column":48}},"42":{"start":{"line":157,"column":8},"end":{"line":157,"column":5679}},"43":{"start":{"line":160,"column":12},"end":{"line":160,"column":49}},"44":{"start":{"line":161,"column":12},"end":{"line":161,"column":45}},"45":{"start":{"line":166,"column":8},"end":{"line":166,"column":5959}},"46":{"start":{"line":167,"column":12},"end":{"line":167,"column":64}},"47":{"start":{"line":168,"column":12},"end":{"line":168,"column":46}},"48":{"start":{"line":169,"column":12},"end":{"line":169,"column":6163}},"49":{"start":{"line":172,"column":12},"end":{"line":172,"column":6274}},"50":{"start":{"line":175,"column":12},"end":{"line":175,"column":64}},"51":{"start":{"line":186,"column":8},"end":{"line":186,"column":43}},"52":{"start":{"line":194,"column":8},"end":{"line":194,"column":34}},"53":{"start":{"line":202,"column":8},"end":{"line":202,"column":41}},"54":{"start":{"line":210,"column":8},"end":{"line":210,"column":38}},"55":{"start":{"line":218,"column":8},"end":{"line":218,"column":50}},"56":{"start":{"line":222,"column":8},"end":{"line":222,"column":37}},"57":{"start":{"line":230,"column":8},"end":{"line":230,"column":48}},"58":{"start":{"line":234,"column":8},"end":{"line":234,"column":27}},"59":{"start":{"line":238,"column":8},"end":{"line":238,"column":43}},"60":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"61":{"start":{"line":254,"column":8},"end":{"line":254,"column":41}},"62":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"63":{"start":{"line":266,"column":8},"end":{"line":266,"column":72}},"64":{"start":{"line":267,"column":8},"end":{"line":267,"column":27}}},"branchMap":{"1":{"line":55,"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":8}},{"start":{"line":55,"column":8},"end":{"line":55,"column":8}}]},"2":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"3":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":12},"end":{"line":120,"column":12}},{"start":{"line":120,"column":12},"end":{"line":120,"column":12}}]},"4":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"5":{"line":137,"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":137,"column":8}},{"start":{"line":137,"column":8},"end":{"line":137,"column":8}}]},"6":{"line":145,"type":"if","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":12}},{"start":{"line":145,"column":12},"end":{"line":145,"column":12}}]},"7":{"line":157,"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":8}},{"start":{"line":157,"column":8},"end":{"line":157,"column":8}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":172,"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":172,"column":12}},{"start":{"line":172,"column":12},"end":{"line":172,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html index 21910d1..733b612 100644 --- a/coverage/contracts/FundProject.sol.html +++ b/coverage/contracts/FundProject.sol.html @@ -20,14 +20,14 @@

- 82.26% + 87.5% Statements - 51/62 + 56/64
- 61.11% + 72.22% Branches - 11/18 + 13/18
77.27% @@ -35,9 +35,9 @@

17/22

- 77.78% + 82.43% Lines - 56/72 + 61/74
@@ -306,7 +306,17 @@

261 262 263 -264

- - - - - + + + + + - - + + @@ -116,7 +116,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 747b77d..cd08d61 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,5 @@ { -"contracts/FundProject.sol":{"l":{"51":3,"52":0,"53":3,"57":3,"58":3,"59":3,"67":3,"68":3,"69":3,"79":7,"80":0,"82":7,"83":7,"84":7,"85":7,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"98":0,"99":0,"100":0,"111":12,"112":14,"113":14,"115":14,"116":14,"117":4,"118":4,"124":4,"125":4,"126":1,"129":3,"130":3,"131":3,"133":3,"134":1,"135":1,"137":1,"138":1,"141":1,"142":0,"145":1,"147":2,"148":2,"153":8,"154":0,"156":8,"157":8,"162":1,"163":0,"164":0,"167":0,"168":0,"171":1,"180":4,"188":1,"196":7,"204":1,"212":0,"216":3,"224":2,"228":9,"232":0,"240":2,"248":0,"252":1,"260":0,"261":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":1,"46":0,"47":0,"48":0,"49":4,"50":1,"51":7,"52":1,"53":0,"54":3,"55":2,"56":9,"57":0,"58":2,"59":0,"60":1,"61":0,"62":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[0,1],"9":[0,0]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":1,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":2,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":50,"loc":{"start":{"line":50,"column":4},"end":{"line":54,"column":4}}},"2":{"name":"constructor","line":56,"loc":{"start":{"line":56,"column":4},"end":{"line":60,"column":4}}},"3":{"name":"fund","line":65,"loc":{"start":{"line":62,"column":4},"end":{"line":70,"column":4}}},"4":{"name":"apporoveFundingByDao","line":77,"loc":{"start":{"line":72,"column":4},"end":{"line":94,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":96,"loc":{"start":{"line":96,"column":4},"end":{"line":101,"column":4}}},"6":{"name":"checkUpkeep","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":121,"column":4}}},"7":{"name":"performUpkeep","line":123,"loc":{"start":{"line":123,"column":4},"end":{"line":150,"column":4}}},"8":{"name":"paySubmitFee","line":152,"loc":{"start":{"line":152,"column":4},"end":{"line":159,"column":4}}},"9":{"name":"withdrawFund","line":161,"loc":{"start":{"line":161,"column":4},"end":{"line":173,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":181,"column":4}}},"11":{"name":"_getHashOfProjectData","line":183,"loc":{"start":{"line":183,"column":4},"end":{"line":189,"column":4}}},"12":{"name":"_getProjectId","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"13":{"name":"_getBalanceOfProject","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"15":{"name":"is_funding","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":217,"column":4}}},"16":{"name":"_getProjectStatus","line":219,"loc":{"start":{"line":219,"column":4},"end":{"line":225,"column":4}}},"17":{"name":"getEnteranceFee","line":227,"loc":{"start":{"line":227,"column":4},"end":{"line":229,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"19":{"name":"getFunderBalance","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"20":{"name":"getInvestedProjects","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":249,"column":4}}},"21":{"name":"getDaoPercentage","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":253,"column":4}}},"22":{"name":"getTimeleft","line":255,"loc":{"start":{"line":255,"column":4},"end":{"line":262,"column":4}}}},"statementMap":{"1":{"start":{"line":51,"column":8},"end":{"line":51,"column":2067}},"2":{"start":{"line":57,"column":8},"end":{"line":57,"column":38}},"3":{"start":{"line":58,"column":8},"end":{"line":58,"column":37}},"4":{"start":{"line":59,"column":8},"end":{"line":59,"column":35}},"5":{"start":{"line":67,"column":8},"end":{"line":67,"column":50}},"6":{"start":{"line":68,"column":8},"end":{"line":68,"column":43}},"7":{"start":{"line":69,"column":8},"end":{"line":69,"column":49}},"8":{"start":{"line":79,"column":8},"end":{"line":79,"column":2836}},"9":{"start":{"line":82,"column":12},"end":{"line":82,"column":60}},"10":{"start":{"line":83,"column":12},"end":{"line":83,"column":77}},"11":{"start":{"line":84,"column":12},"end":{"line":84,"column":34}},"12":{"start":{"line":85,"column":12},"end":{"line":85,"column":67}},"13":{"start":{"line":86,"column":12},"end":{"line":86,"column":49}},"14":{"start":{"line":87,"column":12},"end":{"line":87,"column":42}},"15":{"start":{"line":88,"column":12},"end":{"line":88,"column":64}},"16":{"start":{"line":89,"column":12},"end":{"line":89,"column":46}},"17":{"start":{"line":90,"column":12},"end":{"line":90,"column":39}},"18":{"start":{"line":91,"column":12},"end":{"line":91,"column":48}},"19":{"start":{"line":98,"column":8},"end":{"line":98,"column":43}},"20":{"start":{"line":99,"column":8},"end":{"line":99,"column":36}},"21":{"start":{"line":100,"column":8},"end":{"line":100,"column":71}},"22":{"start":{"line":111,"column":8},"end":{"line":111,"column":4023}},"23":{"start":{"line":112,"column":12},"end":{"line":112,"column":41}},"24":{"start":{"line":113,"column":12},"end":{"line":113,"column":4133}},"25":{"start":{"line":115,"column":12},"end":{"line":115,"column":50}},"26":{"start":{"line":116,"column":12},"end":{"line":116,"column":4280}},"27":{"start":{"line":117,"column":16},"end":{"line":117,"column":48}},"28":{"start":{"line":124,"column":8},"end":{"line":124,"column":47}},"29":{"start":{"line":125,"column":8},"end":{"line":125,"column":4533}},"30":{"start":{"line":129,"column":8},"end":{"line":129,"column":57}},"31":{"start":{"line":130,"column":8},"end":{"line":130,"column":36}},"32":{"start":{"line":131,"column":8},"end":{"line":131,"column":43}},"33":{"start":{"line":133,"column":8},"end":{"line":133,"column":4766}},"34":{"start":{"line":134,"column":12},"end":{"line":134,"column":74}},"35":{"start":{"line":135,"column":12},"end":{"line":135,"column":4935}},"36":{"start":{"line":137,"column":12},"end":{"line":137,"column":38}},"37":{"start":{"line":138,"column":12},"end":{"line":138,"column":5073}},"38":{"start":{"line":141,"column":12},"end":{"line":141,"column":5192}},"39":{"start":{"line":145,"column":12},"end":{"line":145,"column":53}},"40":{"start":{"line":147,"column":12},"end":{"line":147,"column":73}},"41":{"start":{"line":148,"column":12},"end":{"line":148,"column":48}},"42":{"start":{"line":153,"column":8},"end":{"line":153,"column":5564}},"43":{"start":{"line":156,"column":12},"end":{"line":156,"column":49}},"44":{"start":{"line":157,"column":12},"end":{"line":157,"column":45}},"45":{"start":{"line":162,"column":8},"end":{"line":162,"column":5844}},"46":{"start":{"line":163,"column":12},"end":{"line":163,"column":64}},"47":{"start":{"line":164,"column":12},"end":{"line":164,"column":5999}},"48":{"start":{"line":167,"column":12},"end":{"line":167,"column":6110}},"49":{"start":{"line":180,"column":8},"end":{"line":180,"column":43}},"50":{"start":{"line":188,"column":8},"end":{"line":188,"column":34}},"51":{"start":{"line":196,"column":8},"end":{"line":196,"column":41}},"52":{"start":{"line":204,"column":8},"end":{"line":204,"column":38}},"53":{"start":{"line":212,"column":8},"end":{"line":212,"column":50}},"54":{"start":{"line":216,"column":8},"end":{"line":216,"column":37}},"55":{"start":{"line":224,"column":8},"end":{"line":224,"column":48}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":27}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":43}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":46}},"59":{"start":{"line":248,"column":8},"end":{"line":248,"column":41}},"60":{"start":{"line":252,"column":8},"end":{"line":252,"column":28}},"61":{"start":{"line":260,"column":8},"end":{"line":260,"column":72}},"62":{"start":{"line":261,"column":8},"end":{"line":261,"column":27}}},"branchMap":{"1":{"line":51,"type":"if","locations":[{"start":{"line":51,"column":8},"end":{"line":51,"column":8}},{"start":{"line":51,"column":8},"end":{"line":51,"column":8}}]},"2":{"line":79,"type":"if","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":8}},{"start":{"line":79,"column":8},"end":{"line":79,"column":8}}]},"3":{"line":116,"type":"if","locations":[{"start":{"line":116,"column":12},"end":{"line":116,"column":12}},{"start":{"line":116,"column":12},"end":{"line":116,"column":12}}]},"4":{"line":125,"type":"if","locations":[{"start":{"line":125,"column":8},"end":{"line":125,"column":8}},{"start":{"line":125,"column":8},"end":{"line":125,"column":8}}]},"5":{"line":133,"type":"if","locations":[{"start":{"line":133,"column":8},"end":{"line":133,"column":8}},{"start":{"line":133,"column":8},"end":{"line":133,"column":8}}]},"6":{"line":141,"type":"if","locations":[{"start":{"line":141,"column":12},"end":{"line":141,"column":12}},{"start":{"line":141,"column":12},"end":{"line":141,"column":12}}]},"7":{"line":153,"type":"if","locations":[{"start":{"line":153,"column":8},"end":{"line":153,"column":8}},{"start":{"line":153,"column":8},"end":{"line":153,"column":8}}]},"8":{"line":162,"type":"if","locations":[{"start":{"line":162,"column":8},"end":{"line":162,"column":8}},{"start":{"line":162,"column":8},"end":{"line":162,"column":8}}]},"9":{"line":167,"type":"if","locations":[{"start":{"line":167,"column":12},"end":{"line":167,"column":12}},{"start":{"line":167,"column":12},"end":{"line":167,"column":12}}]}}}, +"contracts/FundProject.sol":{"l":{"55":3,"56":0,"57":3,"61":3,"62":3,"63":3,"71":3,"72":3,"73":3,"83":7,"84":0,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"102":0,"103":0,"104":0,"115":12,"116":14,"117":14,"119":14,"120":14,"121":4,"122":4,"128":4,"129":4,"130":1,"133":3,"134":3,"135":3,"137":3,"138":1,"139":1,"141":1,"142":1,"145":1,"146":0,"149":1,"151":2,"152":2,"157":8,"158":0,"160":8,"161":8,"166":2,"167":1,"168":1,"169":1,"172":1,"173":0,"175":1,"177":1,"186":4,"194":1,"202":7,"210":1,"218":0,"222":3,"230":3,"234":9,"238":0,"246":2,"254":0,"258":1,"266":0,"267":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"51":4,"52":1,"53":7,"54":1,"55":0,"56":3,"57":3,"58":9,"59":0,"60":2,"61":0,"62":1,"63":0,"64":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[1,1],"9":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":58,"column":4}}},"2":{"name":"constructor","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":64,"column":4}}},"3":{"name":"fund","line":69,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":4}}},"4":{"name":"apporoveFundingByDao","line":81,"loc":{"start":{"line":76,"column":4},"end":{"line":98,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":105,"column":4}}},"6":{"name":"checkUpkeep","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":125,"column":4}}},"7":{"name":"performUpkeep","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":154,"column":4}}},"8":{"name":"paySubmitFee","line":156,"loc":{"start":{"line":156,"column":4},"end":{"line":163,"column":4}}},"9":{"name":"withdrawFund","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":179,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":181,"loc":{"start":{"line":181,"column":4},"end":{"line":187,"column":4}}},"11":{"name":"_getHashOfProjectData","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":195,"column":4}}},"12":{"name":"_getProjectId","line":197,"loc":{"start":{"line":197,"column":4},"end":{"line":203,"column":4}}},"13":{"name":"_getBalanceOfProject","line":205,"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"15":{"name":"is_funding","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"16":{"name":"_getProjectStatus","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":231,"column":4}}},"17":{"name":"getEnteranceFee","line":233,"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":4}}},"19":{"name":"getFunderBalance","line":241,"loc":{"start":{"line":241,"column":4},"end":{"line":247,"column":4}}},"20":{"name":"getInvestedProjects","line":249,"loc":{"start":{"line":249,"column":4},"end":{"line":255,"column":4}}},"21":{"name":"getDaoPercentage","line":257,"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":4}}},"22":{"name":"getTimeleft","line":261,"loc":{"start":{"line":261,"column":4},"end":{"line":268,"column":4}}}},"statementMap":{"1":{"start":{"line":55,"column":8},"end":{"line":55,"column":2182}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":38}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":37}},"4":{"start":{"line":63,"column":8},"end":{"line":63,"column":35}},"5":{"start":{"line":71,"column":8},"end":{"line":71,"column":50}},"6":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"7":{"start":{"line":73,"column":8},"end":{"line":73,"column":49}},"8":{"start":{"line":83,"column":8},"end":{"line":83,"column":2951}},"9":{"start":{"line":86,"column":12},"end":{"line":86,"column":60}},"10":{"start":{"line":87,"column":12},"end":{"line":87,"column":77}},"11":{"start":{"line":88,"column":12},"end":{"line":88,"column":34}},"12":{"start":{"line":89,"column":12},"end":{"line":89,"column":67}},"13":{"start":{"line":90,"column":12},"end":{"line":90,"column":49}},"14":{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},"15":{"start":{"line":92,"column":12},"end":{"line":92,"column":64}},"16":{"start":{"line":93,"column":12},"end":{"line":93,"column":46}},"17":{"start":{"line":94,"column":12},"end":{"line":94,"column":39}},"18":{"start":{"line":95,"column":12},"end":{"line":95,"column":48}},"19":{"start":{"line":102,"column":8},"end":{"line":102,"column":43}},"20":{"start":{"line":103,"column":8},"end":{"line":103,"column":36}},"21":{"start":{"line":104,"column":8},"end":{"line":104,"column":71}},"22":{"start":{"line":115,"column":8},"end":{"line":115,"column":4138}},"23":{"start":{"line":116,"column":12},"end":{"line":116,"column":41}},"24":{"start":{"line":117,"column":12},"end":{"line":117,"column":4248}},"25":{"start":{"line":119,"column":12},"end":{"line":119,"column":50}},"26":{"start":{"line":120,"column":12},"end":{"line":120,"column":4395}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":48}},"28":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"29":{"start":{"line":129,"column":8},"end":{"line":129,"column":4648}},"30":{"start":{"line":133,"column":8},"end":{"line":133,"column":57}},"31":{"start":{"line":134,"column":8},"end":{"line":134,"column":36}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":43}},"33":{"start":{"line":137,"column":8},"end":{"line":137,"column":4881}},"34":{"start":{"line":138,"column":12},"end":{"line":138,"column":74}},"35":{"start":{"line":139,"column":12},"end":{"line":139,"column":5050}},"36":{"start":{"line":141,"column":12},"end":{"line":141,"column":38}},"37":{"start":{"line":142,"column":12},"end":{"line":142,"column":5188}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":5307}},"39":{"start":{"line":149,"column":12},"end":{"line":149,"column":53}},"40":{"start":{"line":151,"column":12},"end":{"line":151,"column":73}},"41":{"start":{"line":152,"column":12},"end":{"line":152,"column":48}},"42":{"start":{"line":157,"column":8},"end":{"line":157,"column":5679}},"43":{"start":{"line":160,"column":12},"end":{"line":160,"column":49}},"44":{"start":{"line":161,"column":12},"end":{"line":161,"column":45}},"45":{"start":{"line":166,"column":8},"end":{"line":166,"column":5959}},"46":{"start":{"line":167,"column":12},"end":{"line":167,"column":64}},"47":{"start":{"line":168,"column":12},"end":{"line":168,"column":46}},"48":{"start":{"line":169,"column":12},"end":{"line":169,"column":6163}},"49":{"start":{"line":172,"column":12},"end":{"line":172,"column":6274}},"50":{"start":{"line":175,"column":12},"end":{"line":175,"column":64}},"51":{"start":{"line":186,"column":8},"end":{"line":186,"column":43}},"52":{"start":{"line":194,"column":8},"end":{"line":194,"column":34}},"53":{"start":{"line":202,"column":8},"end":{"line":202,"column":41}},"54":{"start":{"line":210,"column":8},"end":{"line":210,"column":38}},"55":{"start":{"line":218,"column":8},"end":{"line":218,"column":50}},"56":{"start":{"line":222,"column":8},"end":{"line":222,"column":37}},"57":{"start":{"line":230,"column":8},"end":{"line":230,"column":48}},"58":{"start":{"line":234,"column":8},"end":{"line":234,"column":27}},"59":{"start":{"line":238,"column":8},"end":{"line":238,"column":43}},"60":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"61":{"start":{"line":254,"column":8},"end":{"line":254,"column":41}},"62":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"63":{"start":{"line":266,"column":8},"end":{"line":266,"column":72}},"64":{"start":{"line":267,"column":8},"end":{"line":267,"column":27}}},"branchMap":{"1":{"line":55,"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":8}},{"start":{"line":55,"column":8},"end":{"line":55,"column":8}}]},"2":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"3":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":12},"end":{"line":120,"column":12}},{"start":{"line":120,"column":12},"end":{"line":120,"column":12}}]},"4":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"5":{"line":137,"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":137,"column":8}},{"start":{"line":137,"column":8},"end":{"line":137,"column":8}}]},"6":{"line":145,"type":"if","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":12}},{"start":{"line":145,"column":12},"end":{"line":145,"column":12}}]},"7":{"line":157,"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":8}},{"start":{"line":157,"column":8},"end":{"line":157,"column":8}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":172,"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":172,"column":12}},{"start":{"line":172,"column":12},"end":{"line":172,"column":12}}]}}}, "contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}}, "contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index a355464..bea94cf 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,14 +20,14 @@

- 82.5% + 86.59% Statements - 66/80 + 71/82
- 65% + 75% Branches - 13/20 + 15/20
80% @@ -35,9 +35,9 @@

32/40

- 79.12% + 82.8% Lines - 72/91 + 77/93
@@ -60,15 +60,15 @@

- - - - - + + + + + - - + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html index 21910d1..733b612 100644 --- a/coverage/lcov-report/contracts/FundProject.sol.html +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -20,14 +20,14 @@

- 82.26% + 87.5% Statements - 51/62 + 56/64
- 61.11% + 72.22% Branches - 11/18 + 13/18
77.27% @@ -35,9 +35,9 @@

17/22

- 77.78% + 82.43% Lines - 56/72 + 61/74
@@ -306,7 +306,17 @@

261 262 263 -264

- - - - - + + + + + - - + + @@ -116,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index a355464..bea94cf 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,14 +20,14 @@

- 82.5% + 86.59% Statements - 66/80 + 71/82
- 65% + 75% Branches - 13/20 + 15/20
80% @@ -35,9 +35,9 @@

32/40

- 79.12% + 82.8% Lines - 72/91 + 77/93
@@ -60,15 +60,15 @@

- - - - - + + + + + - - + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index c8509d9..6ef7d5d 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -1,27 +1,27 @@ TN: SF:/home/furkansezal/dao/contracts/FundProject.sol -FN:50,isApporovedByDao -FN:56,constructor -FN:65,fund -FN:77,apporoveFundingByDao -FN:96,cancelApporovelFundingByDao -FN:103,checkUpkeep -FN:123,performUpkeep -FN:152,paySubmitFee -FN:161,withdrawFund -FN:175,_isApporoveFundingByDao -FN:183,_getHashOfProjectData -FN:191,_getProjectId -FN:199,_getBalanceOfProject -FN:207,_getFundingGoalAmount -FN:215,is_funding -FN:219,_getProjectStatus -FN:227,getEnteranceFee -FN:231,isEnteranceFeePaid -FN:235,getFunderBalance -FN:243,getInvestedProjects -FN:251,getDaoPercentage -FN:255,getTimeleft +FN:54,isApporovedByDao +FN:60,constructor +FN:69,fund +FN:81,apporoveFundingByDao +FN:100,cancelApporovelFundingByDao +FN:107,checkUpkeep +FN:127,performUpkeep +FN:156,paySubmitFee +FN:165,withdrawFund +FN:181,_isApporoveFundingByDao +FN:189,_getHashOfProjectData +FN:197,_getProjectId +FN:205,_getBalanceOfProject +FN:213,_getFundingGoalAmount +FN:221,is_funding +FN:225,_getProjectStatus +FN:233,getEnteranceFee +FN:237,isEnteranceFeePaid +FN:241,getFunderBalance +FN:249,getInvestedProjects +FN:257,getDaoPercentage +FN:261,getTimeleft FNF:22 FNH:17 FNDA:3,isApporovedByDao @@ -32,35 +32,31 @@ FNDA:0,cancelApporovelFundingByDao FNDA:12,checkUpkeep FNDA:4,performUpkeep FNDA:8,paySubmitFee -FNDA:1,withdrawFund +FNDA:2,withdrawFund FNDA:4,_isApporoveFundingByDao FNDA:1,_getHashOfProjectData FNDA:7,_getProjectId FNDA:1,_getBalanceOfProject FNDA:0,_getFundingGoalAmount FNDA:3,is_funding -FNDA:2,_getProjectStatus +FNDA:3,_getProjectStatus FNDA:9,getEnteranceFee FNDA:0,isEnteranceFeePaid FNDA:2,getFunderBalance FNDA:0,getInvestedProjects FNDA:1,getDaoPercentage FNDA:0,getTimeleft -DA:51,3 -DA:52,0 -DA:53,3 +DA:55,3 +DA:56,0 DA:57,3 -DA:58,3 -DA:59,3 -DA:67,3 -DA:68,3 -DA:69,3 -DA:79,7 -DA:80,0 -DA:82,7 +DA:61,3 +DA:62,3 +DA:63,3 +DA:71,3 +DA:72,3 +DA:73,3 DA:83,7 -DA:84,7 -DA:85,7 +DA:84,0 DA:86,7 DA:87,7 DA:88,7 @@ -68,78 +64,84 @@ DA:89,7 DA:90,7 DA:91,7 DA:92,7 -DA:98,0 -DA:99,0 -DA:100,0 -DA:111,12 -DA:112,14 -DA:113,14 -DA:115,14 +DA:93,7 +DA:94,7 +DA:95,7 +DA:96,7 +DA:102,0 +DA:103,0 +DA:104,0 +DA:115,12 DA:116,14 -DA:117,4 -DA:118,4 -DA:124,4 -DA:125,4 -DA:126,1 -DA:129,3 -DA:130,3 -DA:131,3 +DA:117,14 +DA:119,14 +DA:120,14 +DA:121,4 +DA:122,4 +DA:128,4 +DA:129,4 +DA:130,1 DA:133,3 -DA:134,1 -DA:135,1 -DA:137,1 +DA:134,3 +DA:135,3 +DA:137,3 DA:138,1 +DA:139,1 DA:141,1 -DA:142,0 +DA:142,1 DA:145,1 -DA:147,2 -DA:148,2 -DA:153,8 -DA:154,0 -DA:156,8 +DA:146,0 +DA:149,1 +DA:151,2 +DA:152,2 DA:157,8 -DA:162,1 -DA:163,0 -DA:164,0 -DA:167,0 -DA:168,0 -DA:171,1 -DA:180,4 -DA:188,1 -DA:196,7 -DA:204,1 -DA:212,0 -DA:216,3 -DA:224,2 -DA:228,9 -DA:232,0 -DA:240,2 -DA:248,0 -DA:252,1 -DA:260,0 -DA:261,0 -LF:72 -LH:56 -BRDA:51,1,0,0 -BRDA:51,1,1,3 -BRDA:79,2,0,0 -BRDA:79,2,1,7 -BRDA:116,3,0,4 -BRDA:116,3,1,10 -BRDA:125,4,0,1 -BRDA:125,4,1,3 -BRDA:133,5,0,1 -BRDA:133,5,1,2 -BRDA:141,6,0,0 -BRDA:141,6,1,1 -BRDA:153,7,0,0 -BRDA:153,7,1,8 -BRDA:162,8,0,0 -BRDA:162,8,1,1 -BRDA:167,9,0,0 -BRDA:167,9,1,0 +DA:158,0 +DA:160,8 +DA:161,8 +DA:166,2 +DA:167,1 +DA:168,1 +DA:169,1 +DA:172,1 +DA:173,0 +DA:175,1 +DA:177,1 +DA:186,4 +DA:194,1 +DA:202,7 +DA:210,1 +DA:218,0 +DA:222,3 +DA:230,3 +DA:234,9 +DA:238,0 +DA:246,2 +DA:254,0 +DA:258,1 +DA:266,0 +DA:267,0 +LF:74 +LH:61 +BRDA:55,1,0,0 +BRDA:55,1,1,3 +BRDA:83,2,0,0 +BRDA:83,2,1,7 +BRDA:120,3,0,4 +BRDA:120,3,1,10 +BRDA:129,4,0,1 +BRDA:129,4,1,3 +BRDA:137,5,0,1 +BRDA:137,5,1,2 +BRDA:145,6,0,0 +BRDA:145,6,1,1 +BRDA:157,7,0,0 +BRDA:157,7,1,8 +BRDA:166,8,0,1 +BRDA:166,8,1,1 +BRDA:172,9,0,0 +BRDA:172,9,1,1 BRF:18 -BRH:11 +BRH:13 end_of_record TN: SF:/home/furkansezal/dao/contracts/GovernanceToken.sol diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index 460e25f..9bffa1b 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -723,7 +723,7 @@ "transactionIndex": 0, "gasUsed": "3780772", "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000410000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000001000000000002000000008000000000020000000000000000000000000200000000000000000000000800000000000000000", - "blockHash": "0x3421fc79a39f92881ad0b0ec76c222411ae0bf91f12a4461b633cbfad75283a2", + "blockHash": "0xf5b6ffe229ef04af108b10d2ee32208aec2c4ff9fbe572ebf8744c16113c025f", "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", "logs": [ { @@ -738,7 +738,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x3421fc79a39f92881ad0b0ec76c222411ae0bf91f12a4461b633cbfad75283a2" + "blockHash": "0xf5b6ffe229ef04af108b10d2ee32208aec2c4ff9fbe572ebf8744c16113c025f" }, { "transactionIndex": 0, @@ -752,7 +752,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 1, - "blockHash": "0x3421fc79a39f92881ad0b0ec76c222411ae0bf91f12a4461b633cbfad75283a2" + "blockHash": "0xf5b6ffe229ef04af108b10d2ee32208aec2c4ff9fbe572ebf8744c16113c025f" }, { "transactionIndex": 0, @@ -766,7 +766,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 2, - "blockHash": "0x3421fc79a39f92881ad0b0ec76c222411ae0bf91f12a4461b633cbfad75283a2" + "blockHash": "0xf5b6ffe229ef04af108b10d2ee32208aec2c4ff9fbe572ebf8744c16113c025f" } ], "blockNumber": 2, @@ -776,7 +776,7 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "e037150c05e743a0afcdb8bf195f828d", + "solcInputHash": "9bb96e2ab1a2d14e7d6f1254972fa73c", "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"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\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_initialSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. It is but NOT the sum of all the delegated votes! Requirements: - `blockNumber` must have been already mined\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `blockNumber`. Requirements: - `blockNumber` must have been already mined\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"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.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"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/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x24b04b8aacaaf1a4a0719117b29c9c3647b1f479c5ac2a60f5ff1bb6d839c238\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-ERC20Permit.sol\\\";\\nimport \\\"../../../utils/math/Math.sol\\\";\\nimport \\\"../../../governance/utils/IVotes.sol\\\";\\nimport \\\"../../../utils/math/SafeCast.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\n\\n/**\\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\\n *\\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\\n *\\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\\n *\\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\\n *\\n * _Available since v4.2._\\n */\\nabstract contract ERC20Votes is IVotes, ERC20Permit {\\n struct Checkpoint {\\n uint32 fromBlock;\\n uint224 votes;\\n }\\n\\n bytes32 private constant _DELEGATION_TYPEHASH =\\n keccak256(\\\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\\\");\\n\\n mapping(address => address) private _delegates;\\n mapping(address => Checkpoint[]) private _checkpoints;\\n Checkpoint[] private _totalSupplyCheckpoints;\\n\\n /**\\n * @dev Get the `pos`-th checkpoint for `account`.\\n */\\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\\n return _checkpoints[account][pos];\\n }\\n\\n /**\\n * @dev Get number of checkpoints for `account`.\\n */\\n function numCheckpoints(address account) public view virtual returns (uint32) {\\n return SafeCast.toUint32(_checkpoints[account].length);\\n }\\n\\n /**\\n * @dev Get the address `account` is currently delegating to.\\n */\\n function delegates(address account) public view virtual override returns (address) {\\n return _delegates[account];\\n }\\n\\n /**\\n * @dev Gets the current votes balance for `account`\\n */\\n function getVotes(address account) public view virtual override returns (uint256) {\\n uint256 pos = _checkpoints[account].length;\\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\\n }\\n\\n /**\\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_checkpoints[account], blockNumber);\\n }\\n\\n /**\\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\\n * It is but NOT the sum of all the delegated votes!\\n *\\n * Requirements:\\n *\\n * - `blockNumber` must have been already mined\\n */\\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\\n require(blockNumber < block.number, \\\"ERC20Votes: block not yet mined\\\");\\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\\n }\\n\\n /**\\n * @dev Lookup a value in a list of (sorted) checkpoints.\\n */\\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\\n //\\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\\n // out of bounds (in which case we're looking too far in the past and the result is 0).\\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\\n // the same.\\n uint256 high = ckpts.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (ckpts[mid].fromBlock > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n\\n return high == 0 ? 0 : ckpts[high - 1].votes;\\n }\\n\\n /**\\n * @dev Delegate votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) public virtual override {\\n _delegate(_msgSender(), delegatee);\\n }\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= expiry, \\\"ERC20Votes: signature expired\\\");\\n address signer = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\\n v,\\n r,\\n s\\n );\\n require(nonce == _useNonce(signer), \\\"ERC20Votes: invalid nonce\\\");\\n _delegate(signer, delegatee);\\n }\\n\\n /**\\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\\n */\\n function _maxSupply() internal view virtual returns (uint224) {\\n return type(uint224).max;\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been increased.\\n */\\n function _mint(address account, uint256 amount) internal virtual override {\\n super._mint(account, amount);\\n require(totalSupply() <= _maxSupply(), \\\"ERC20Votes: total supply risks overflowing votes\\\");\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\\n }\\n\\n /**\\n * @dev Snapshots the totalSupply after it has been decreased.\\n */\\n function _burn(address account, uint256 amount) internal virtual override {\\n super._burn(account, amount);\\n\\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\\n }\\n\\n /**\\n * @dev Move voting power when tokens are transferred.\\n *\\n * Emits a {DelegateVotesChanged} event.\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual override {\\n super._afterTokenTransfer(from, to, amount);\\n\\n _moveVotingPower(delegates(from), delegates(to), amount);\\n }\\n\\n /**\\n * @dev Change delegation for `delegator` to `delegatee`.\\n *\\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\\n */\\n function _delegate(address delegator, address delegatee) internal virtual {\\n address currentDelegate = delegates(delegator);\\n uint256 delegatorBalance = balanceOf(delegator);\\n _delegates[delegator] = delegatee;\\n\\n emit DelegateChanged(delegator, currentDelegate, delegatee);\\n\\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\\n }\\n\\n function _moveVotingPower(\\n address src,\\n address dst,\\n uint256 amount\\n ) private {\\n if (src != dst && amount > 0) {\\n if (src != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\\n emit DelegateVotesChanged(src, oldWeight, newWeight);\\n }\\n\\n if (dst != address(0)) {\\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\\n }\\n }\\n }\\n\\n function _writeCheckpoint(\\n Checkpoint[] storage ckpts,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) private returns (uint256 oldWeight, uint256 newWeight) {\\n uint256 pos = ckpts.length;\\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\\n newWeight = op(oldWeight, delta);\\n\\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\\n } else {\\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\\n }\\n }\\n\\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\\n return a + b;\\n }\\n\\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\\n return a - b;\\n }\\n}\\n\",\"keccak256\":\"0x7fd2492be0468be4662081ee25cde38a31e4a0ceca0fed10160462389013910f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./draft-IERC20Permit.sol\\\";\\nimport \\\"../ERC20.sol\\\";\\nimport \\\"../../../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../../../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../../../utils/Counters.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\\n using Counters for Counters.Counter;\\n\\n mapping(address => Counters.Counter) private _nonces;\\n\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private constant _PERMIT_TYPEHASH =\\n keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n /**\\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\\n * However, to ensure consistency with the upgradeable transpiler, we will continue\\n * to reserve a slot.\\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\\n */\\n // solhint-disable-next-line var-name-mixedcase\\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\\n\\n /**\\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n *\\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n */\\n constructor(string memory name) EIP712(name, \\\"1\\\") {}\\n\\n /**\\n * @dev See {IERC20Permit-permit}.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override {\\n require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\\n\\n bytes32 hash = _hashTypedDataV4(structHash);\\n\\n address signer = ECDSA.recover(hash, v, r, s);\\n require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev See {IERC20Permit-nonces}.\\n */\\n function nonces(address owner) public view virtual override returns (uint256) {\\n return _nonces[owner].current();\\n }\\n\\n /**\\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev \\\"Consume a nonce\\\": return the current value and increment.\\n *\\n * _Available since v4.1._\\n */\\n function _useNonce(address owner) internal virtual returns (uint256 current) {\\n Counters.Counter storage nonce = _nonces[owner];\\n current = nonce.current();\\n nonce.increment();\\n }\\n}\\n\",\"keccak256\":\"0x07536242e24ee7067295d32c08e495a33e605f3c52f8ee4ec3bdcb7a351313d2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"contracts/GovernanceToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract GovernanceToken is ERC20Votes, Ownable {\\n uint256 public s_initialSupply = 1000000e18;\\n\\n event TokenTransfer(\\n address indexed _from,\\n address indexed _to,\\n uint256 _amount\\n );\\n\\n constructor()\\n ERC20(\\\"GovernanceToken\\\", \\\"GT\\\")\\n ERC20Permit(\\\"GovernanceToken\\\")\\n {\\n _mint(msg.sender, s_initialSupply);\\n }\\n\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal override(ERC20Votes) {\\n super._afterTokenTransfer(from, to, amount);\\n emit TokenTransfer(from, to, amount);\\n }\\n\\n function _mint(address to, uint256 amount)\\n internal\\n override(ERC20Votes)\\n onlyOwner\\n {\\n super._mint(to, amount);\\n }\\n\\n function mintToken(address to, uint256 amount) external {\\n _mint(to, amount);\\n }\\n\\n function burnToken(address account, uint256 amount) external {\\n _burn(account, amount);\\n }\\n\\n function _burn(address account, uint256 amount)\\n internal\\n override(ERC20Votes)\\n {\\n super._burn(account, amount);\\n }\\n}\\n\",\"keccak256\":\"0xa092abf2f4621743762f91889e716f2f475be65a32165fca151a4741f2c58ca3\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x61014060405269d3c21bcecceda1000000600b553480156200002057600080fd5b506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e0000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600f81526020017f476f7665726e616e6365546f6b656e00000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600390816200010b919062000fea565b5080600490816200011d919062000fea565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001898184846200020d60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050806101208181525050505050505050620001f3620001e76200024960201b60201c565b6200025160201b60201c565b6200020733600b546200031760201b60201c565b6200157a565b600083838346306040516020016200022a95949392919062001142565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003276200034260201b60201c565b6200033e8282620003d360201b6200107a1760201c565b5050565b620003526200024960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003786200049160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c89062001200565b60405180910390fd5b565b620003ea8282620004bb60201b620011071760201c565b620003fa6200063360201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620004286200065760201b60201c565b11156200046c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004639062001298565b60405180910390fd5b6200048b60096200066160201b6200126617836200067960201b60201c565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200052d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000524906200130a565b60405180910390fd5b62000541600083836200092a60201b60201c565b80600260008282546200055591906200135b565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005ac91906200135b565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000613919062001396565b60405180910390a36200062f600083836200092f60201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b600081836200067191906200135b565b905092915050565b60008060008580549050905060008114620006ee57856001826200069e9190620013b3565b81548110620006b257620006b1620013ee565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620006f1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506200071d83858760201c565b915060008111801562000776575043866001836200073c9190620013b3565b8154811062000750576200074f620013ee565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b1562000817576200079282620009b360201b6200127c1760201c565b86600183620007a29190620013b3565b81548110620007b657620007b5620013ee565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555062000921565b856040518060400160405280620008394362000a2160201b620012e71760201c565b63ffffffff1681526020016200085a85620009b360201b6200127c1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b6200094783838362000a7760201b6200133a1760201c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de683604051620009a6919062001396565b60405180910390a3505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a109062001493565b60405180910390fd5b819050919050565b600063ffffffff801682111562000a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a66906200152b565b60405180910390fd5b819050919050565b62000a8f83838362000ac760201b620013651760201c565b62000ac262000aa48462000acc60201b60201c565b62000ab58462000acc60201b60201c565b8362000b3560201b60201c565b505050565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000b725750600081115b1562000d5357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000c655760008062000c0c600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000d5860201b6200136a17856200067960201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c5a9291906200154d565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000d525760008062000cf9600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200066160201b6200126617856200067960201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000d479291906200154d565b60405180910390a250505b5b505050565b6000818362000d689190620013b3565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000df257607f821691505b60208210810362000e085762000e0762000daa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000e727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000e33565b62000e7e868362000e33565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ecb62000ec562000ebf8462000e96565b62000ea0565b62000e96565b9050919050565b6000819050919050565b62000ee78362000eaa565b62000eff62000ef68262000ed2565b84845462000e40565b825550505050565b600090565b62000f1662000f07565b62000f2381848462000edc565b505050565b5b8181101562000f4b5762000f3f60008262000f0c565b60018101905062000f29565b5050565b601f82111562000f9a5762000f648162000e0e565b62000f6f8462000e23565b8101602085101562000f7f578190505b62000f9762000f8e8562000e23565b83018262000f28565b50505b505050565b600082821c905092915050565b600062000fbf6000198460080262000f9f565b1980831691505092915050565b600062000fda838362000fac565b9150826002028217905092915050565b62000ff58262000d70565b67ffffffffffffffff81111562001011576200101062000d7b565b5b6200101d825462000dd9565b6200102a82828562000f4f565b600060209050601f8311600181146200106257600084156200104d578287015190505b62001059858262000fcc565b865550620010c9565b601f198416620010728662000e0e565b60005b828110156200109c5784890151825560018201915060208501945060208101905062001075565b86831015620010bc5784890151620010b8601f89168262000fac565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b620010e681620010d1565b82525050565b620010f78162000e96565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200112a82620010fd565b9050919050565b6200113c816200111d565b82525050565b600060a082019050620011596000830188620010db565b620011686020830187620010db565b620011776040830186620010db565b620011866060830185620010ec565b62001195608083018462001131565b9695505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620011e86020836200119f565b9150620011f582620011b0565b602082019050919050565b600060208201905081810360008301526200121b81620011d9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000620012806030836200119f565b91506200128d8262001222565b604082019050919050565b60006020820190508181036000830152620012b38162001271565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620012f2601f836200119f565b9150620012ff82620012ba565b602082019050919050565b600060208201905081810360008301526200132581620012e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013688262000e96565b9150620013758362000e96565b925082820190508082111562001390576200138f6200132c565b5b92915050565b6000602082019050620013ad6000830184620010ec565b92915050565b6000620013c08262000e96565b9150620013cd8362000e96565b9250828203905081811115620013e857620013e76200132c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200147b6027836200119f565b915062001488826200141d565b604082019050919050565b60006020820190508181036000830152620014ae816200146c565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620015136026836200119f565b91506200152082620014b5565b604082019050919050565b60006020820190508181036000830152620015468162001504565b9050919050565b6000604082019050620015646000830185620010ec565b620015736020830184620010ec565b9392505050565b60805160a05160c05160e0516101005161012051613ed6620015ca600039600061190a0152600061194c0152600061192b01526000611860015260006118b6015260006118df0152613ed66000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610555578063dd62ed3e14610571578063f1127ed8146105a1578063f2fde38b146105d1576101c4565b8063a9059cbb146104ed578063c3cda5201461051d578063d1df306c14610539576101c4565b80638e539e8c116100d35780638e539e8c1461043f57806395d89b411461046f5780639ab24eb01461048d578063a457c2d7146104bd576101c4565b806379c65068146103d55780637ecebe00146103f15780638da5cb5b14610421576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461034f5780636fcfff451461036b57806370a082311461039b578063715018a6146103cb576101c4565b806339509351146102bf5780633a46b1a8146102ef578063587cde1e1461031f576101c4565b806318160ddd116101a257806318160ddd1461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf14610217575b600080fd5b6101d16105ed565b6040516101de9190612907565b60405180910390f35b61020160048036038101906101fc91906129c2565b61067f565b60405161020e9190612a1d565b60405180910390f35b61021f6106a2565b60405161022c9190612a47565b60405180910390f35b61023d6106a8565b60405161024a9190612a47565b60405180910390f35b61026d60048036038101906102689190612a62565b6106b2565b60405161027a9190612a1d565b60405180910390f35b61028b6106e1565b6040516102989190612ad1565b60405180910390f35b6102a96106ea565b6040516102b69190612b05565b60405180910390f35b6102d960048036038101906102d491906129c2565b6106f9565b6040516102e69190612a1d565b60405180910390f35b610309600480360381019061030491906129c2565b610730565b6040516103169190612a47565b60405180910390f35b61033960048036038101906103349190612b20565b6107c4565b6040516103469190612b5c565b60405180910390f35b61036960048036038101906103649190612b20565b61082d565b005b61038560048036038101906103809190612b20565b610841565b6040516103929190612b96565b60405180910390f35b6103b560048036038101906103b09190612b20565b610895565b6040516103c29190612a47565b60405180910390f35b6103d36108dd565b005b6103ef60048036038101906103ea91906129c2565b6108f1565b005b61040b60048036038101906104069190612b20565b6108ff565b6040516104189190612a47565b60405180910390f35b61042961094f565b6040516104369190612b5c565b60405180910390f35b61045960048036038101906104549190612bb1565b610979565b6040516104669190612a47565b60405180910390f35b6104776109cf565b6040516104849190612907565b60405180910390f35b6104a760048036038101906104a29190612b20565b610a61565b6040516104b49190612a47565b60405180910390f35b6104d760048036038101906104d291906129c2565b610b72565b6040516104e49190612a1d565b60405180910390f35b610507600480360381019061050291906129c2565b610be9565b6040516105149190612a1d565b60405180910390f35b61053760048036038101906105329190612c36565b610c0c565b005b610553600480360381019061054e91906129c2565b610d10565b005b61056f600480360381019061056a9190612cc3565b610d1e565b005b61058b60048036038101906105869190612d65565b610e60565b6040516105989190612a47565b60405180910390f35b6105bb60048036038101906105b69190612dd1565b610ee7565b6040516105c89190612e86565b60405180910390f35b6105eb60048036038101906105e69190612b20565b610ff7565b005b6060600380546105fc90612ed0565b80601f016020809104026020016040519081016040528092919081815260200182805461062890612ed0565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60008061068a611380565b9050610697818585611388565b600191505092915050565b600b5481565b6000600254905090565b6000806106bd611380565b90506106ca858285611551565b6106d58585856115dd565b60019150509392505050565b60006012905090565b60006106f461185c565b905090565b600080610704611380565b90506107258185856107168589610e60565b6107209190612f30565b611388565b600191505092915050565b6000438210610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90612fb0565b60405180910390fd5b6107bc600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611976565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61083e610838611380565b82611a82565b50565b600061088e600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506112e7565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108e5611b9c565b6108ef6000611c1a565b565b6108fb8282611ce0565b5050565b6000610948600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cf6565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612fb0565b60405180910390fd5b6109c8600983611976565b9050919050565b6060600480546109de90612ed0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90612ed0565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b4957600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610afd9190612fd0565b81548110610b0e57610b0d613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b4c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610b7d611380565b90506000610b8b8286610e60565b905083811015610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906130a5565b60405180910390fd5b610bdd8286868403611388565b60019250505092915050565b600080610bf4611380565b9050610c018185856115dd565b600191505092915050565b83421115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613111565b60405180910390fd5b6000610cb1610ca97fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610c8e9493929190613131565b60405160208183030381529060405280519060200120611d04565b858585611d1e565b9050610cbc81611d49565b8614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906131c2565b60405180910390fd5b610d078188611a82565b50505050505050565b610d1a8282611da7565b5050565b83421115610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061322e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d908c611d49565b89604051602001610da69695949392919061324e565b6040516020818303038152906040528051906020012090506000610dc982611d04565b90506000610dd982878787611d1e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906132fb565b60405180910390fd5b610e548a8a8a611388565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610eef612839565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f4657610f45613004565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610fff611b9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110659061338d565b60405180910390fd5b61107781611c1a565b50565b6110848282611107565b61108c611db5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110b26106a8565b11156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061341f565b60405180910390fd5b611101600961126683611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061348b565b60405180910390fd5b61118260008383612051565b80600260008282546111949190612f30565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e99190612f30565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124e9190612a47565b60405180910390a361126260008383612056565b5050565b600081836112749190612f30565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061351d565b60405180910390fd5b819050919050565b600063ffffffff8016821115611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906135af565b60405180910390fd5b819050919050565b611345838383611365565b611360611351846107c4565b61135a846107c4565b836120cb565b505050565b505050565b600081836113789190612fd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90613641565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906136d3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115449190612a47565b60405180910390a3505050565b600061155d8484610e60565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115d757818110156115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061373f565b60405180910390fd5b6115d68484848403611388565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906137d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613863565b60405180910390fd5b6116c6838383612051565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906138f5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117df9190612f30565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118439190612a47565b60405180910390a3611856848484612056565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156118d857507f000000000000000000000000000000000000000000000000000000000000000046145b15611905577f00000000000000000000000000000000000000000000000000000000000000009050611973565b6119707f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122c4565b90505b90565b6000808380549050905060005b818110156119f557600061199782846122fe565b9050848682815481106119ad576119ac613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156119df578092506119ef565b6001816119ec9190612f30565b91505b50611983565b60008214611a575784600183611a0b9190612fd0565b81548110611a1c57611a1b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611a5a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000611a8d836107c4565b90506000611a9a84610895565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b968284836120cb565b50505050565b611ba4611380565b73ffffffffffffffffffffffffffffffffffffffff16611bc261094f565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613961565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ce8611b9c565b611cf2828261107a565b5050565b600081600001549050919050565b6000611d17611d1161185c565b83612324565b9050919050565b6000806000611d2f87878787612357565b91509150611d3c81612463565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9681611cf6565b9150611da18161262f565b50919050565b611db18282612645565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611e475785600182611dfb9190612fd0565b81548110611e0c57611e0b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611e4a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611e7883858763ffffffff16565b9150600081118015611ecb57504386600183611e949190612fd0565b81548110611ea557611ea4613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f5857611ed98261127c565b86600183611ee79190612fd0565b81548110611ef857611ef7613004565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612048565b856040518060400160405280611f6d436112e7565b63ffffffff168152602001611f818561127c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b61206183838361133a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516120be9190612a47565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121075750600081115b156122bf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121e55760008061218e600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136a85611dd9565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121da929190613981565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122be57600080612267600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061126685611dd9565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122b3929190613981565b60405180910390a250505b5b505050565b600083838346306040516020016122df9594939291906139aa565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861230f9190613a2c565b82841661231c9190612f30565b905092915050565b60008282604051602001612339929190613ad5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561239257600060039150915061245a565b601b8560ff16141580156123aa5750601c8560ff1614155b156123bc57600060049150915061245a565b6000600187878787604051600081526020016040526040516123e19493929190613b0c565b6020604051602081039080840390855afa158015612403573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124515760006001925092505061245a565b80600092509250505b94509492505050565b6000600481111561247757612476613b51565b5b81600481111561248a57612489613b51565b5b031561262c57600160048111156124a4576124a3613b51565b5b8160048111156124b7576124b6613b51565b5b036124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90613bcc565b60405180910390fd5b6002600481111561250b5761250a613b51565b5b81600481111561251e5761251d613b51565b5b0361255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613c38565b60405180910390fd5b6003600481111561257257612571613b51565b5b81600481111561258557612584613b51565b5b036125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc90613cca565b60405180910390fd5b6004808111156125d8576125d7613b51565b5b8160048111156125eb576125ea613b51565b5b0361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290613d5c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61264f8282612663565b61265d600961136a83611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990613dee565b60405180910390fd5b6126de82600083612051565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613e80565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127bb9190612fd0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128209190612a47565b60405180910390a361283483600084612056565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b1578082015181840152602081019050612896565b60008484015250505050565b6000601f19601f8301169050919050565b60006128d982612877565b6128e38185612882565b93506128f3818560208601612893565b6128fc816128bd565b840191505092915050565b6000602082019050818103600083015261292181846128ce565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129598261292e565b9050919050565b6129698161294e565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b6000819050919050565b61299f8161298c565b81146129aa57600080fd5b50565b6000813590506129bc81612996565b92915050565b600080604083850312156129d9576129d8612929565b5b60006129e785828601612977565b92505060206129f8858286016129ad565b9150509250929050565b60008115159050919050565b612a1781612a02565b82525050565b6000602082019050612a326000830184612a0e565b92915050565b612a418161298c565b82525050565b6000602082019050612a5c6000830184612a38565b92915050565b600080600060608486031215612a7b57612a7a612929565b5b6000612a8986828701612977565b9350506020612a9a86828701612977565b9250506040612aab868287016129ad565b9150509250925092565b600060ff82169050919050565b612acb81612ab5565b82525050565b6000602082019050612ae66000830184612ac2565b92915050565b6000819050919050565b612aff81612aec565b82525050565b6000602082019050612b1a6000830184612af6565b92915050565b600060208284031215612b3657612b35612929565b5b6000612b4484828501612977565b91505092915050565b612b568161294e565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600063ffffffff82169050919050565b612b9081612b77565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b600060208284031215612bc757612bc6612929565b5b6000612bd5848285016129ad565b91505092915050565b612be781612ab5565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b612c1381612aec565b8114612c1e57600080fd5b50565b600081359050612c3081612c0a565b92915050565b60008060008060008060c08789031215612c5357612c52612929565b5b6000612c6189828a01612977565b9650506020612c7289828a016129ad565b9550506040612c8389828a016129ad565b9450506060612c9489828a01612bf5565b9350506080612ca589828a01612c21565b92505060a0612cb689828a01612c21565b9150509295509295509295565b600080600080600080600060e0888a031215612ce257612ce1612929565b5b6000612cf08a828b01612977565b9750506020612d018a828b01612977565b9650506040612d128a828b016129ad565b9550506060612d238a828b016129ad565b9450506080612d348a828b01612bf5565b93505060a0612d458a828b01612c21565b92505060c0612d568a828b01612c21565b91505092959891949750929550565b60008060408385031215612d7c57612d7b612929565b5b6000612d8a85828601612977565b9250506020612d9b85828601612977565b9150509250929050565b612dae81612b77565b8114612db957600080fd5b50565b600081359050612dcb81612da5565b92915050565b60008060408385031215612de857612de7612929565b5b6000612df685828601612977565b9250506020612e0785828601612dbc565b9150509250929050565b612e1a81612b77565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612e5181612e20565b82525050565b604082016000820151612e6d6000850182612e11565b506020820151612e806020850182612e48565b50505050565b6000604082019050612e9b6000830184612e57565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ee857607f821691505b602082108103612efb57612efa612ea1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f3b8261298c565b9150612f468361298c565b9250828201905080821115612f5e57612f5d612f01565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612f9a601f83612882565b9150612fa582612f64565b602082019050919050565b60006020820190508181036000830152612fc981612f8d565b9050919050565b6000612fdb8261298c565b9150612fe68361298c565b9250828203905081811115612ffe57612ffd612f01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061308f602583612882565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006130fb601d83612882565b9150613106826130c5565b602082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b60006080820190506131466000830187612af6565b6131536020830186612b4d565b6131606040830185612a38565b61316d6060830184612a38565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006131ac601983612882565b91506131b782613176565b602082019050919050565b600060208201905081810360008301526131db8161319f565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613218601d83612882565b9150613223826131e2565b602082019050919050565b600060208201905081810360008301526132478161320b565b9050919050565b600060c0820190506132636000830189612af6565b6132706020830188612b4d565b61327d6040830187612b4d565b61328a6060830186612a38565b6132976080830185612a38565b6132a460a0830184612a38565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006132e5601e83612882565b91506132f0826132af565b602082019050919050565b60006020820190508181036000830152613314816132d8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613377602683612882565b91506133828261331b565b604082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613409603083612882565b9150613414826133ad565b604082019050919050565b60006020820190508181036000830152613438816133fc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613475601f83612882565b91506134808261343f565b602082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000613507602783612882565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613599602683612882565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362b602483612882565b9150613636826135cf565b604082019050919050565b6000602082019050818103600083015261365a8161361e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136bd602283612882565b91506136c882613661565b604082019050919050565b600060208201905081810360008301526136ec816136b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613729601d83612882565b9150613734826136f3565b602082019050919050565b600060208201905081810360008301526137588161371c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bb602583612882565b91506137c68261375f565b604082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061384d602383612882565b9150613858826137f1565b604082019050919050565b6000602082019050818103600083015261387c81613840565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138df602683612882565b91506138ea82613883565b604082019050919050565b6000602082019050818103600083015261390e816138d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061394b602083612882565b915061395682613915565b602082019050919050565b6000602082019050818103600083015261397a8161393e565b9050919050565b60006040820190506139966000830185612a38565b6139a36020830184612a38565b9392505050565b600060a0820190506139bf6000830188612af6565b6139cc6020830187612af6565b6139d96040830186612af6565b6139e66060830185612a38565b6139f36080830184612b4d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a378261298c565b9150613a428361298c565b925082613a5257613a516139fd565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a9e600283613a5d565b9150613aa982613a68565b600282019050919050565b6000819050919050565b613acf613aca82612aec565b613ab4565b82525050565b6000613ae082613a91565b9150613aec8285613abe565b602082019150613afc8284613abe565b6020820191508190509392505050565b6000608082019050613b216000830187612af6565b613b2e6020830186612ac2565b613b3b6040830185612af6565b613b486060830184612af6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bb6601883612882565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c22601f83612882565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cb4602283612882565b9150613cbf82613c58565b604082019050919050565b60006020820190508181036000830152613ce381613ca7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d46602283612882565b9150613d5182613cea565b604082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd8602183612882565b9150613de382613d7c565b604082019050919050565b60006020820190508181036000830152613e0781613dcb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6a602283612882565b9150613e7582613e0e565b604082019050919050565b60006020820190508181036000830152613e9981613e5d565b905091905056fea264697066735822122017be51580e499600e196331255d1b51b80dc95152f4ab3928e0760c4b3acb21e64736f6c63430008110033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379c65068116100f9578063a9059cbb11610097578063d505accf11610071578063d505accf14610555578063dd62ed3e14610571578063f1127ed8146105a1578063f2fde38b146105d1576101c4565b8063a9059cbb146104ed578063c3cda5201461051d578063d1df306c14610539576101c4565b80638e539e8c116100d35780638e539e8c1461043f57806395d89b411461046f5780639ab24eb01461048d578063a457c2d7146104bd576101c4565b806379c65068146103d55780637ecebe00146103f15780638da5cb5b14610421576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461034f5780636fcfff451461036b57806370a082311461039b578063715018a6146103cb576101c4565b806339509351146102bf5780633a46b1a8146102ef578063587cde1e1461031f576101c4565b806318160ddd116101a257806318160ddd1461023557806323b872dd14610253578063313ce567146102835780633644e515146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e7578063096b34cf14610217575b600080fd5b6101d16105ed565b6040516101de9190612907565b60405180910390f35b61020160048036038101906101fc91906129c2565b61067f565b60405161020e9190612a1d565b60405180910390f35b61021f6106a2565b60405161022c9190612a47565b60405180910390f35b61023d6106a8565b60405161024a9190612a47565b60405180910390f35b61026d60048036038101906102689190612a62565b6106b2565b60405161027a9190612a1d565b60405180910390f35b61028b6106e1565b6040516102989190612ad1565b60405180910390f35b6102a96106ea565b6040516102b69190612b05565b60405180910390f35b6102d960048036038101906102d491906129c2565b6106f9565b6040516102e69190612a1d565b60405180910390f35b610309600480360381019061030491906129c2565b610730565b6040516103169190612a47565b60405180910390f35b61033960048036038101906103349190612b20565b6107c4565b6040516103469190612b5c565b60405180910390f35b61036960048036038101906103649190612b20565b61082d565b005b61038560048036038101906103809190612b20565b610841565b6040516103929190612b96565b60405180910390f35b6103b560048036038101906103b09190612b20565b610895565b6040516103c29190612a47565b60405180910390f35b6103d36108dd565b005b6103ef60048036038101906103ea91906129c2565b6108f1565b005b61040b60048036038101906104069190612b20565b6108ff565b6040516104189190612a47565b60405180910390f35b61042961094f565b6040516104369190612b5c565b60405180910390f35b61045960048036038101906104549190612bb1565b610979565b6040516104669190612a47565b60405180910390f35b6104776109cf565b6040516104849190612907565b60405180910390f35b6104a760048036038101906104a29190612b20565b610a61565b6040516104b49190612a47565b60405180910390f35b6104d760048036038101906104d291906129c2565b610b72565b6040516104e49190612a1d565b60405180910390f35b610507600480360381019061050291906129c2565b610be9565b6040516105149190612a1d565b60405180910390f35b61053760048036038101906105329190612c36565b610c0c565b005b610553600480360381019061054e91906129c2565b610d10565b005b61056f600480360381019061056a9190612cc3565b610d1e565b005b61058b60048036038101906105869190612d65565b610e60565b6040516105989190612a47565b60405180910390f35b6105bb60048036038101906105b69190612dd1565b610ee7565b6040516105c89190612e86565b60405180910390f35b6105eb60048036038101906105e69190612b20565b610ff7565b005b6060600380546105fc90612ed0565b80601f016020809104026020016040519081016040528092919081815260200182805461062890612ed0565b80156106755780601f1061064a57610100808354040283529160200191610675565b820191906000526020600020905b81548152906001019060200180831161065857829003601f168201915b5050505050905090565b60008061068a611380565b9050610697818585611388565b600191505092915050565b600b5481565b6000600254905090565b6000806106bd611380565b90506106ca858285611551565b6106d58585856115dd565b60019150509392505050565b60006012905090565b60006106f461185c565b905090565b600080610704611380565b90506107258185856107168589610e60565b6107209190612f30565b611388565b600191505092915050565b6000438210610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076b90612fb0565b60405180910390fd5b6107bc600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611976565b905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61083e610838611380565b82611a82565b50565b600061088e600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506112e7565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108e5611b9c565b6108ef6000611c1a565b565b6108fb8282611ce0565b5050565b6000610948600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cf6565b9050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60004382106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612fb0565b60405180910390fd5b6109c8600983611976565b9050919050565b6060600480546109de90612ed0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0a90612ed0565b8015610a575780601f10610a2c57610100808354040283529160200191610a57565b820191906000526020600020905b815481529060010190602001808311610a3a57829003601f168201915b5050505050905090565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b4957600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610afd9190612fd0565b81548110610b0e57610b0d613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b4c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610b7d611380565b90506000610b8b8286610e60565b905083811015610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc7906130a5565b60405180910390fd5b610bdd8286868403611388565b60019250505092915050565b600080610bf4611380565b9050610c018185856115dd565b600191505092915050565b83421115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690613111565b60405180910390fd5b6000610cb1610ca97fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610c8e9493929190613131565b60405160208183030381529060405280519060200120611d04565b858585611d1e565b9050610cbc81611d49565b8614610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf4906131c2565b60405180910390fd5b610d078188611a82565b50505050505050565b610d1a8282611da7565b5050565b83421115610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061322e565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610d908c611d49565b89604051602001610da69695949392919061324e565b6040516020818303038152906040528051906020012090506000610dc982611d04565b90506000610dd982878787611d1e565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906132fb565b60405180910390fd5b610e548a8a8a611388565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610eef612839565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f4657610f45613004565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b610fff611b9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361106e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110659061338d565b60405180910390fd5b61107781611c1a565b50565b6110848282611107565b61108c611db5565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110b26106a8565b11156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea9061341f565b60405180910390fd5b611101600961126683611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116d9061348b565b60405180910390fd5b61118260008383612051565b80600260008282546111949190612f30565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e99190612f30565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161124e9190612a47565b60405180910390a361126260008383612056565b5050565b600081836112749190612f30565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d69061351d565b60405180910390fd5b819050919050565b600063ffffffff8016821115611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906135af565b60405180910390fd5b819050919050565b611345838383611365565b611360611351846107c4565b61135a846107c4565b836120cb565b505050565b505050565b600081836113789190612fd0565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90613641565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d906136d3565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115449190612a47565b60405180910390a3505050565b600061155d8484610e60565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146115d757818110156115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c09061373f565b60405180910390fd5b6115d68484848403611388565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611643906137d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b290613863565b60405180910390fd5b6116c6838383612051565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561174c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611743906138f5565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117df9190612f30565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118439190612a47565b60405180910390a3611856848484612056565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156118d857507f000000000000000000000000000000000000000000000000000000000000000046145b15611905577f00000000000000000000000000000000000000000000000000000000000000009050611973565b6119707f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122c4565b90505b90565b6000808380549050905060005b818110156119f557600061199782846122fe565b9050848682815481106119ad576119ac613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156119df578092506119ef565b6001816119ec9190612f30565b91505b50611983565b60008214611a575784600183611a0b9190612fd0565b81548110611a1c57611a1b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611a5a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6000611a8d836107c4565b90506000611a9a84610895565b905082600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b968284836120cb565b50505050565b611ba4611380565b73ffffffffffffffffffffffffffffffffffffffff16611bc261094f565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613961565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ce8611b9c565b611cf2828261107a565b5050565b600081600001549050919050565b6000611d17611d1161185c565b83612324565b9050919050565b6000806000611d2f87878787612357565b91509150611d3c81612463565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611d9681611cf6565b9150611da18161262f565b50919050565b611db18282612645565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611e475785600182611dfb9190612fd0565b81548110611e0c57611e0b613004565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611e4a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611e7883858763ffffffff16565b9150600081118015611ecb57504386600183611e949190612fd0565b81548110611ea557611ea4613004565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611f5857611ed98261127c565b86600183611ee79190612fd0565b81548110611ef857611ef7613004565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612048565b856040518060400160405280611f6d436112e7565b63ffffffff168152602001611f818561127c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b61206183838361133a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fd0ed88a3f042c6bbb1e3ea406079b5f2b4b198afccaa535d837f4c63abbc4de6836040516120be9190612a47565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156121075750600081115b156122bf57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121e55760008061218e600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061136a85611dd9565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121da929190613981565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122be57600080612267600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061126685611dd9565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516122b3929190613981565b60405180910390a250505b5b505050565b600083838346306040516020016122df9594939291906139aa565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861230f9190613a2c565b82841661231c9190612f30565b905092915050565b60008282604051602001612339929190613ad5565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561239257600060039150915061245a565b601b8560ff16141580156123aa5750601c8560ff1614155b156123bc57600060049150915061245a565b6000600187878787604051600081526020016040526040516123e19493929190613b0c565b6020604051602081039080840390855afa158015612403573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124515760006001925092505061245a565b80600092509250505b94509492505050565b6000600481111561247757612476613b51565b5b81600481111561248a57612489613b51565b5b031561262c57600160048111156124a4576124a3613b51565b5b8160048111156124b7576124b6613b51565b5b036124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90613bcc565b60405180910390fd5b6002600481111561250b5761250a613b51565b5b81600481111561251e5761251d613b51565b5b0361255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255590613c38565b60405180910390fd5b6003600481111561257257612571613b51565b5b81600481111561258557612584613b51565b5b036125c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bc90613cca565b60405180910390fd5b6004808111156125d8576125d7613b51565b5b8160048111156125eb576125ea613b51565b5b0361262b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262290613d5c565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61264f8282612663565b61265d600961136a83611dd9565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c990613dee565b60405180910390fd5b6126de82600083612051565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90613e80565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546127bb9190612fd0565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128209190612a47565b60405180910390a361283483600084612056565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156128b1578082015181840152602081019050612896565b60008484015250505050565b6000601f19601f8301169050919050565b60006128d982612877565b6128e38185612882565b93506128f3818560208601612893565b6128fc816128bd565b840191505092915050565b6000602082019050818103600083015261292181846128ce565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129598261292e565b9050919050565b6129698161294e565b811461297457600080fd5b50565b60008135905061298681612960565b92915050565b6000819050919050565b61299f8161298c565b81146129aa57600080fd5b50565b6000813590506129bc81612996565b92915050565b600080604083850312156129d9576129d8612929565b5b60006129e785828601612977565b92505060206129f8858286016129ad565b9150509250929050565b60008115159050919050565b612a1781612a02565b82525050565b6000602082019050612a326000830184612a0e565b92915050565b612a418161298c565b82525050565b6000602082019050612a5c6000830184612a38565b92915050565b600080600060608486031215612a7b57612a7a612929565b5b6000612a8986828701612977565b9350506020612a9a86828701612977565b9250506040612aab868287016129ad565b9150509250925092565b600060ff82169050919050565b612acb81612ab5565b82525050565b6000602082019050612ae66000830184612ac2565b92915050565b6000819050919050565b612aff81612aec565b82525050565b6000602082019050612b1a6000830184612af6565b92915050565b600060208284031215612b3657612b35612929565b5b6000612b4484828501612977565b91505092915050565b612b568161294e565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600063ffffffff82169050919050565b612b9081612b77565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b600060208284031215612bc757612bc6612929565b5b6000612bd5848285016129ad565b91505092915050565b612be781612ab5565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b612c1381612aec565b8114612c1e57600080fd5b50565b600081359050612c3081612c0a565b92915050565b60008060008060008060c08789031215612c5357612c52612929565b5b6000612c6189828a01612977565b9650506020612c7289828a016129ad565b9550506040612c8389828a016129ad565b9450506060612c9489828a01612bf5565b9350506080612ca589828a01612c21565b92505060a0612cb689828a01612c21565b9150509295509295509295565b600080600080600080600060e0888a031215612ce257612ce1612929565b5b6000612cf08a828b01612977565b9750506020612d018a828b01612977565b9650506040612d128a828b016129ad565b9550506060612d238a828b016129ad565b9450506080612d348a828b01612bf5565b93505060a0612d458a828b01612c21565b92505060c0612d568a828b01612c21565b91505092959891949750929550565b60008060408385031215612d7c57612d7b612929565b5b6000612d8a85828601612977565b9250506020612d9b85828601612977565b9150509250929050565b612dae81612b77565b8114612db957600080fd5b50565b600081359050612dcb81612da5565b92915050565b60008060408385031215612de857612de7612929565b5b6000612df685828601612977565b9250506020612e0785828601612dbc565b9150509250929050565b612e1a81612b77565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612e5181612e20565b82525050565b604082016000820151612e6d6000850182612e11565b506020820151612e806020850182612e48565b50505050565b6000604082019050612e9b6000830184612e57565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612ee857607f821691505b602082108103612efb57612efa612ea1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f3b8261298c565b9150612f468361298c565b9250828201905080821115612f5e57612f5d612f01565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612f9a601f83612882565b9150612fa582612f64565b602082019050919050565b60006020820190508181036000830152612fc981612f8d565b9050919050565b6000612fdb8261298c565b9150612fe68361298c565b9250828203905081811115612ffe57612ffd612f01565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061308f602583612882565b915061309a82613033565b604082019050919050565b600060208201905081810360008301526130be81613082565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006130fb601d83612882565b9150613106826130c5565b602082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b60006080820190506131466000830187612af6565b6131536020830186612b4d565b6131606040830185612a38565b61316d6060830184612a38565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006131ac601983612882565b91506131b782613176565b602082019050919050565b600060208201905081810360008301526131db8161319f565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613218601d83612882565b9150613223826131e2565b602082019050919050565b600060208201905081810360008301526132478161320b565b9050919050565b600060c0820190506132636000830189612af6565b6132706020830188612b4d565b61327d6040830187612b4d565b61328a6060830186612a38565b6132976080830185612a38565b6132a460a0830184612a38565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006132e5601e83612882565b91506132f0826132af565b602082019050919050565b60006020820190508181036000830152613314816132d8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613377602683612882565b91506133828261331b565b604082019050919050565b600060208201905081810360008301526133a68161336a565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613409603083612882565b9150613414826133ad565b604082019050919050565b60006020820190508181036000830152613438816133fc565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613475601f83612882565b91506134808261343f565b602082019050919050565b600060208201905081810360008301526134a481613468565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000613507602783612882565b9150613512826134ab565b604082019050919050565b60006020820190508181036000830152613536816134fa565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613599602683612882565b91506135a48261353d565b604082019050919050565b600060208201905081810360008301526135c88161358c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362b602483612882565b9150613636826135cf565b604082019050919050565b6000602082019050818103600083015261365a8161361e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136bd602283612882565b91506136c882613661565b604082019050919050565b600060208201905081810360008301526136ec816136b0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613729601d83612882565b9150613734826136f3565b602082019050919050565b600060208201905081810360008301526137588161371c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bb602583612882565b91506137c68261375f565b604082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061384d602383612882565b9150613858826137f1565b604082019050919050565b6000602082019050818103600083015261387c81613840565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138df602683612882565b91506138ea82613883565b604082019050919050565b6000602082019050818103600083015261390e816138d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061394b602083612882565b915061395682613915565b602082019050919050565b6000602082019050818103600083015261397a8161393e565b9050919050565b60006040820190506139966000830185612a38565b6139a36020830184612a38565b9392505050565b600060a0820190506139bf6000830188612af6565b6139cc6020830187612af6565b6139d96040830186612af6565b6139e66060830185612a38565b6139f36080830184612b4d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a378261298c565b9150613a428361298c565b925082613a5257613a516139fd565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613a9e600283613a5d565b9150613aa982613a68565b600282019050919050565b6000819050919050565b613acf613aca82612aec565b613ab4565b82525050565b6000613ae082613a91565b9150613aec8285613abe565b602082019150613afc8284613abe565b6020820191508190509392505050565b6000608082019050613b216000830187612af6565b613b2e6020830186612ac2565b613b3b6040830185612af6565b613b486060830184612af6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613bb6601883612882565b9150613bc182613b80565b602082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613c22601f83612882565b9150613c2d82613bec565b602082019050919050565b60006020820190508181036000830152613c5181613c15565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cb4602283612882565b9150613cbf82613c58565b604082019050919050565b60006020820190508181036000830152613ce381613ca7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d46602283612882565b9150613d5182613cea565b604082019050919050565b60006020820190508181036000830152613d7581613d39565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dd8602183612882565b9150613de382613d7c565b604082019050919050565b60006020820190508181036000830152613e0781613dcb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e6a602283612882565b9150613e7582613e0e565b604082019050919050565b60006020820190508181036000830152613e9981613e5d565b905091905056fea264697066735822122017be51580e499600e196331255d1b51b80dc95152f4ab3928e0760c4b3acb21e64736f6c63430008110033", @@ -957,7 +957,7 @@ "type": "t_address" }, { - "astId": 10749, + "astId": 10893, "contract": "contracts/GovernanceToken.sol:GovernanceToken", "label": "s_initialSupply", "offset": 0, diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json index 885b564..ef40a69 100644 --- a/deployments/localhost/GovernerContract.json +++ b/deployments/localhost/GovernerContract.json @@ -445,6 +445,25 @@ "name": "projectSuccessfullyFunded", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "__investor", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "__projectId", + "type": "uint256" + } + ], + "name": "withdrawFundSuccessfully", + "type": "event" + }, { "inputs": [], "name": "BALLOT_TYPEHASH", @@ -907,7 +926,7 @@ }, { "internalType": "bytes", - "name": "", + "name": "performData", "type": "bytes" } ], @@ -1011,6 +1030,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getDaoPercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getEnteranceFee", @@ -1024,6 +1056,68 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_projectID", + "type": "uint256" + } + ], + "name": "getFunderBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "investor", + "type": "address" + } + ], + "name": "getInvestedProjects", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_projectID", + "type": "uint256" + } + ], + "name": "getTimeleft", + "outputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1173,6 +1267,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "investedProjects", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1373,7 +1491,7 @@ "inputs": [ { "internalType": "bytes", - "name": "", + "name": "performData", "type": "bytes" } ], @@ -1955,81 +2073,81 @@ "type": "receive" } ], - "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", + "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "transactionIndex": 0, - "gasUsed": "8012021", + "gasUsed": "8307777", "logsBloom": "0x00000000000000000100000000001000000000000000000000800000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000001000000000000000010000000000000000000020000080002000100000800000000000000000000000000000000401000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000200000000000000000000000003000000000080000800020000000000000000000000000000000000000000000000000000000000000002000", - "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46", - "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", + "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace", + "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "logs": [ { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", + "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 0, - "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" + "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", + "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828" ], "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8", "logIndex": 1, - "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" + "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", + "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0xccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 2, - "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" + "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", + "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 3, - "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" + "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", + "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3", "logIndex": 4, - "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" + "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" }, { "transactionIndex": 0, "blockNumber": 4, - "transactionHash": "0x324e2b55e0f3cb5da32cf75249625e60737067aad7676fee2014c04950cd95b8", + "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", @@ -2038,11 +2156,11 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0x7dcf3cc9a0e23c9d72dc24b96edbe8636d35e0358904167da4af10cc9d16ea46" + "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" } ], "blockNumber": 4, - "cumulativeGasUsed": "8012021", + "cumulativeGasUsed": "8307777", "status": 1, "byzantium": true }, @@ -2056,10 +2174,10 @@ "10" ], "numDeployments": 1, - "solcInputHash": "edf7a7fc578491be0baac88ac737a638", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enteranceFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_daoPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__EnteranceFeeNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotEnoughPayment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"FundProject__TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__UpkeepNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__WithdrawTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__withdrawFund\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NeedEnteranceFee\",\"type\":\"error\"},{\"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\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_projectOwner\",\"type\":\"address\"}],\"name\":\"enteranceFeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectFundingFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectGoesToFunding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectSuccessfullyFunded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_ProjectFundingStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getBalanceOfProject\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"_getProjectStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isApporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_fundingGoalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_projectOwnerAddress\",\"type\":\"address\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEnteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"is_funding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paySubmitFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectToTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"withdrawFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"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.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/AutomationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract AutomationBase {\\n error OnlySimulatedBackend();\\n\\n /**\\n * @notice method that allows it to be simulated via eth_call by checking that\\n * the sender is the zero address.\\n */\\n function preventExecution() internal view {\\n if (tx.origin != address(0)) {\\n revert OnlySimulatedBackend();\\n }\\n }\\n\\n /**\\n * @notice modifier that allows it to be simulated via eth_call by checking\\n * that the sender is the zero address.\\n */\\n modifier cannotExecute() {\\n preventExecution();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x5d354afa1a97dffe66094397cdcbb0c14713cf3d609d88fd8f9891010e9a351a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AutomationBase.sol\\\";\\nimport \\\"./interfaces/AutomationCompatibleInterface.sol\\\";\\n\\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\\n\",\"keccak256\":\"0x40e5ae0eff4edd0740c1b5590d09c344f84dee031e82d5294563e99603774f80\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\\\";\\n\\nerror FundProject__NotApporovedByDao();\\nerror FundProject__UpkeepNeeded();\\nerror FundProject__TransferFailed(uint256 _projectId);\\nerror FundProject__NotEnoughPayment();\\nerror FundProject__withdrawFund();\\nerror FundProject__WithdrawTransferFailed();\\nerror FundProject__EnteranceFeeNeeded();\\n\\ncontract FundProject is Ownable, AutomationCompatibleInterface {\\n enum ProjectFundingStatus {\\n ONPROGRESS,\\n SUCCESS,\\n FAILED,\\n CANCELED\\n }\\n\\n uint256 public projectId = 1;\\n\\n uint public lastTimeStamp;\\n uint256 public daoPercentage;\\n uint256 public enteranceFee;\\n\\n mapping(uint256 => bool) public _isFunding;\\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\\n mapping(uint256 => uint256) public time;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders;\\n mapping(uint256 => uint256) public projectFunds;\\n mapping(uint256 => uint256) public projectFundingGoalAmount;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n mapping(uint256 => address) public projectOwnerAddress;\\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\\n mapping(address => bool) public _isEnteranceFeePaid;\\n\\n event projectSuccessfullyFunded(uint256 indexed _projectId);\\n event projectFundingFailed(uint256 indexed _projectId);\\n event enteranceFeePaid(address indexed _projectOwner);\\n event projectGoesToFunding(uint256 indexed _projectId);\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\\n lastTimeStamp = block.timestamp;\\n daoPercentage = _daoPercentage;\\n enteranceFee = _enteranceFee;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n projectFunds[_projecID] += msg.value;\\n }\\n\\n function apporoveFundingByDao(\\n string memory _ipfsHash,\\n uint256 _fundingGoalAmount,\\n uint256 _time,\\n address _projectOwnerAddress\\n ) external onlyOwner {\\n // only dao can call it\\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\\n revert FundProject__EnteranceFeeNeeded();\\n } else {\\n projectToTime[projectId][_time] = block.timestamp;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\\n time[projectId] = _time;\\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n projectOwnerAddress[projectId] = _projectOwnerAddress;\\n _isApporovedByDao[projectId] = true;\\n _isFunding[projectId] = true;\\n emit projectGoesToFunding(projectId);\\n projectId++;\\n }\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call it\\n _isApporovedByDao[_projecID] = false;\\n _isFunding[projectId] = false;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\\n }\\n\\n function checkUpkeep(\\n bytes memory /* checkData */\\n )\\n public\\n view\\n override\\n returns (\\n bool upkeepNeeded,\\n bytes memory /* performData */\\n )\\n {\\n upkeepNeeded = (_isFunding[projectId] &&\\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\\n projectToTime[projectId][time[projectId]]);\\n }\\n\\n function performUpkeep(\\n bytes calldata /* performData */\\n ) external override {\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\n if (!upkeepNeeded) {\\n revert FundProject__UpkeepNeeded();\\n }\\n _isFunding[projectId] = false;\\n _isApporovedByDao[projectId] = false;\\n\\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\\n 100;\\n (bool success, ) = (projectOwnerAddress[projectId]).call{\\n value: fundsToSent\\n }(\\\"\\\");\\n if (!success) {\\n revert FundProject__TransferFailed(projectFunds[projectId]);\\n }\\n\\n emit projectSuccessfullyFunded(projectId);\\n } else {\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\\n emit projectFundingFailed(projectId);\\n }\\n }\\n\\n function paySubmitFee() public payable {\\n if (msg.value < enteranceFee) {\\n revert FundProject__NotEnoughPayment();\\n } else {\\n _isEnteranceFeePaid[msg.sender] = true;\\n emit enteranceFeePaid(msg.sender);\\n }\\n }\\n\\n function withdrawFund(uint256 _projectID) public {\\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\\n uint256 fundToSent = funders[_projectID][msg.sender];\\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\\n \\\"\\\"\\n );\\n if (!success) {\\n revert FundProject__WithdrawTransferFailed();\\n }\\n } else {\\n revert FundProject__withdrawFund();\\n }\\n }\\n\\n function _isApporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n\\n function _getBalanceOfProject(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFunds[_projecID];\\n }\\n\\n function _getFundingGoalAmount(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFundingGoalAmount[_projecID];\\n }\\n\\n function is_funding(uint256 _projectID) public view returns (bool) {\\n return _isFunding[_projectID];\\n }\\n\\n function _getProjectStatus(uint256 _projectID)\\n public\\n view\\n returns (ProjectFundingStatus)\\n {\\n return _ProjectFundingStatus[_projectID];\\n }\\n\\n function getEnteranceFee() public view returns (uint256) {\\n return enteranceFee;\\n }\\n\\n function isEnteranceFeePaid(address account) public view returns (bool) {\\n return _isEnteranceFeePaid[account];\\n }\\n}\\n\",\"keccak256\":\"0x7d2d6bff2be12dc301152566f3eb52b2fcede1f35d28b494928f530da9dac90a\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\nimport \\\"./FundProject.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl,\\n FundProject\\n{\\n error GovernerContract__NeedEnteranceFee();\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage,\\n uint256 _enteranceFee,\\n uint256 _daoPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n FundProject(_enteranceFee, _daoPercentage)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n if (!_isEnteranceFeePaid[msg.sender]) {\\n revert GovernerContract__NeedEnteranceFee();\\n }\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x1713670032ac0e6e45120b9ea97b9727a23883448ec04fc1f6722a7c8520c8be\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6101606040526001600d553480156200001757600080fd5b5060405162009f4f38038062009f4f83398181016040528101906200003d919062000bff565b818187858a898960006040518060400160405280601081526020017f476f7665726e6572436f6e747261637400000000000000000000000000000000815250806200008d6200022660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f68184846200026360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000150919062000f22565b505062000163836200029f60201b60201c565b6200017482620002e660201b60201c565b62000185816200037360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001cf81620003ba60201b60201c565b50620001e1816200059960201b60201c565b5062000202620001f66200063a60201b60201c565b6200064260201b60201c565b42600e8190555080600f81905550816010819055505050505050505050506200142d565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200028095949392919062001046565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051620002d4929190620010a3565b60405180910390a18060048190555050565b600081116200032c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003239062001157565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405162000361929190620010a3565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051620003a8929190620010a3565b60405180910390a18060068190555050565b620003ca6200070860201b60201c565b8111156200040f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004069062001215565b60405180910390fd5b6000620004216200071160201b60201c565b9050600081141580156200043d57506000600960000180549050145b156200053d5760096000016040518060400160405280600063ffffffff16815260200162000476846200074960201b620036951760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000558826009620007b760201b620037001790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200058d929190620010a3565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ee92919062001237565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064905090565b6000806009600001805490501462000740576200073a6009620009f560201b620039021760201c565b62000744565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a690620012da565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620007d986620009f560201b60201c565b90506000821180156200083557504386600001600184620007fb91906200132b565b815481106200080f576200080e62001366565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008d95762000851856200074960201b620036951760201c565b866000016001846200086491906200132b565b8154811062000878576200087762001366565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009e6565b856000016040518060400160405280620008fe4362000a9760201b6200399d1760201c565b63ffffffff1681526020016200091f886200074960201b620036951760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811462000a6e578260000160018262000a1e91906200132b565b8154811062000a325762000a3162001366565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000a71565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff801682111562000ae5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000adc906200140b565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b1f8262000af2565b9050919050565b600062000b338262000b12565b9050919050565b62000b458162000b26565b811462000b5157600080fd5b50565b60008151905062000b658162000b3a565b92915050565b600062000b788262000af2565b9050919050565b600062000b8c8262000b6b565b9050919050565b62000b9e8162000b7f565b811462000baa57600080fd5b50565b60008151905062000bbe8162000b93565b92915050565b6000819050919050565b62000bd98162000bc4565b811462000be557600080fd5b50565b60008151905062000bf98162000bce565b92915050565b600080600080600080600060e0888a03121562000c215762000c2062000aed565b5b600062000c318a828b0162000b54565b975050602062000c448a828b0162000bad565b965050604062000c578a828b0162000be8565b955050606062000c6a8a828b0162000be8565b945050608062000c7d8a828b0162000be8565b93505060a062000c908a828b0162000be8565b92505060c062000ca38a828b0162000be8565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d3457607f821691505b60208210810362000d4a5762000d4962000cec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000db47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d75565b62000dc0868362000d75565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000e0362000dfd62000df78462000bc4565b62000dd8565b62000bc4565b9050919050565b6000819050919050565b62000e1f8362000de2565b62000e3762000e2e8262000e0a565b84845462000d82565b825550505050565b600090565b62000e4e62000e3f565b62000e5b81848462000e14565b505050565b5b8181101562000e835762000e7760008262000e44565b60018101905062000e61565b5050565b601f82111562000ed25762000e9c8162000d50565b62000ea78462000d65565b8101602085101562000eb7578190505b62000ecf62000ec68562000d65565b83018262000e60565b50505b505050565b600082821c905092915050565b600062000ef76000198460080262000ed7565b1980831691505092915050565b600062000f12838362000ee4565b9150826002028217905092915050565b62000f2d8262000cb2565b67ffffffffffffffff81111562000f495762000f4862000cbd565b5b62000f55825462000d1b565b62000f6282828562000e87565b600060209050601f83116001811462000f9a576000841562000f85578287015190505b62000f91858262000f04565b86555062001001565b601f19841662000faa8662000d50565b60005b8281101562000fd45784890151825560018201915060208501945060208101905062000fad565b8683101562000ff4578489015162000ff0601f89168262000ee4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6200101e8162001009565b82525050565b6200102f8162000bc4565b82525050565b620010408162000b12565b82525050565b600060a0820190506200105d600083018862001013565b6200106c602083018762001013565b6200107b604083018662001013565b6200108a606083018562001024565b62001099608083018462001035565b9695505050505050565b6000604082019050620010ba600083018562001024565b620010c9602083018462001024565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200113f602783620010d0565b91506200114c82620010e1565b604082019050919050565b60006020820190508181036000830152620011728162001130565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620011fd604383620010d0565b91506200120a8262001179565b606082019050919050565b600060208201905081810360008301526200123081620011ee565b9050919050565b60006040820190506200124e600083018562001035565b6200125d602083018462001035565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620012c2602783620010d0565b9150620012cf8262001264565b604082019050919050565b60006020820190508181036000830152620012f581620012b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013388262000bc4565b9150620013458362000bc4565b925082820390508181111562001360576200135f620012fc565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620013f3602683620010d0565b9150620014008262001395565b604082019050919050565b600060208201905081810360008301526200142681620013e4565b9050919050565b60805160a05160c05160e051610100516101205161014051618ab9620014966000396000818161359a0152818161488d0152614b0101526000614dc701526000614e0901526000614de801526000614d1d01526000614d7301526000614d9c0152618ab96000f3fe60806040526004361061044b5760003560e01c80637b3c71d311610234578063c01f9e371161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e6114611336578063f2fde38b14611373578063f8ce560a1461139c578063fc0c546a146113d9578063fea856a11461140457610491565b8063deaaa7cc1461123f578063e0c410cc1461126a578063ea0217cf146112a7578063eb9019d4146112d0578063ece40cc11461130d57610491565b8063ca1d209d116100fd578063ca1d209d14611153578063cf6862591461116f578063d33219b4146111ac578063dc73204b146111d7578063dd4e2ba51461121457610491565b8063c01f9e3714611073578063c0d55329146110b0578063c28bc2fa146110ed578063c59057e41461111657610491565b806397c3d334116101bc578063abe1aae611610180578063abe1aae614610f54578063b58131b014610f91578063b59d18a014610fbc578063bba9c21914610ff9578063bc197c811461103657610491565b806397c3d33414610e5b5780639a802a6d14610e86578063a7713a7014610ec3578063a890c91014610eee578063ab58fb8e14610f1757610491565b806387030f4d1161020357806387030f4d14610d625780638da5cb5b14610d8b5780638fb5548f14610db6578063902bfa2414610df357806396aa167e14610e3057610491565b80637b3c71d314610c805780637d5e81e214610cbd578063809b268e14610cfa578063868661cb14610d3757610491565b80633fafa127116103455780635b6b4652116102cd5780636ee8e8ef116102915780636ee8e8ef14610b8957806370084d7a14610bc657806370b0f66014610c03578063715018a614610c2c578063794d556014610c4357610491565b80635b6b465214610a575780635ced7d4014610a945780635f398a1414610ad157806360c4247f14610b0e5780636e04ff0d14610b4b57610491565b80634fac2bb7116103145780634fac2bb714610948578063535bf50f14610985578063544ffc9c146109b057806354fd4d50146109ef5780635678138814610a1a57610491565b80633fafa1271461087a57806343859632146108a5578063446a156f146108e25780634585e33b1461091f57610491565b8063156277be116103d35780633932abb1116103975780633932abb1146107815780633bccf4fd146107ac5780633be2f2a3146107e95780633e4f49e6146108125780633f3b3b271461084f57610491565b8063156277be1461066f578063160cbed7146106ac5780632656227d146106e95780632d63f693146107195780632fe3e2611461075657610491565b806306fdde031161041a57806306fdde03146105645780630cee17251461058f578063141a6c22146105b8578063148038b0146105f5578063150b7a021461063257610491565b806301ffc9a71461049657806302a251a3146104d357806303420181146104fe57806306f3f9e61461053b57610491565b36610491573073ffffffffffffffffffffffffffffffffffffffff1661046f61140e565b73ffffffffffffffffffffffffffffffffffffffff161461048f57600080fd5b005b600080fd5b3480156104a257600080fd5b506104bd60048036038101906104b89190615a0c565b61141d565b6040516104ca9190615a54565b60405180910390f35b3480156104df57600080fd5b506104e861142f565b6040516104f59190615a88565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190615ce4565b61143e565b6040516105329190615a88565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190615dc2565b611523565b005b34801561057057600080fd5b5061057961161a565b6040516105869190615e6e565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190615dc2565b6116ac565b005b3480156105c457600080fd5b506105df60048036038101906105da9190615f31565b61182c565b6040516105ec9190615a88565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190615fd8565b611854565b6040516106299190615a88565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190616018565b611879565b60405161066691906160aa565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190615dc2565b61188d565b6040516106a391906160d4565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190616356565b6118c0565b6040516106e09190615a88565b60405180910390f35b61070360048036038101906106fe9190616356565b611b7a565b6040516107109190615a88565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190615dc2565b611cc7565b60405161074d9190615a88565b60405180910390f35b34801561076257600080fd5b5061076b611d35565b6040516107789190616420565b60405180910390f35b34801561078d57600080fd5b50610796611d59565b6040516107a39190615a88565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061643b565b611d68565b6040516107e09190615a88565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906164b6565b611df2565b005b34801561081e57600080fd5b5061083960048036038101906108349190615dc2565b61205f565b60405161084691906165b0565b60405180910390f35b34801561085b57600080fd5b50610864612071565b6040516108719190615a88565b60405180910390f35b34801561088657600080fd5b5061088f612077565b60405161089c9190615a88565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190615fd8565b61207d565b6040516108d99190615a54565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190615dc2565b6120e8565b6040516109169190616613565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190616684565b612112565b005b34801561095457600080fd5b5061096f600480360381019061096a9190615dc2565b612406565b60405161097c9190615a54565b60405180910390f35b34801561099157600080fd5b5061099a612426565b6040516109a79190615a88565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d29190615dc2565b612430565b6040516109e6939291906166d1565b60405180910390f35b3480156109fb57600080fd5b50610a04612468565b604051610a119190615e6e565b60405180910390f35b348015610a2657600080fd5b50610a416004803603810190610a3c9190616708565b6124a5565b604051610a4e9190615a88565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190615dc2565b6124d6565b604051610a8b9190615a88565b60405180910390f35b348015610aa057600080fd5b50610abb6004803603810190610ab69190615dc2565b6124ee565b604051610ac89190615a88565b60405180910390f35b348015610add57600080fd5b50610af86004803603810190610af39190616748565b612506565b604051610b059190615a88565b60405180910390f35b348015610b1a57600080fd5b50610b356004803603810190610b309190615dc2565b612570565b604051610b429190615a88565b60405180910390f35b348015610b5757600080fd5b50610b726004803603810190610b6d91906167ec565b6126bc565b604051610b8092919061688a565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab91906168ba565b612776565b604051610bbd9190615a54565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be89190615dc2565b612796565b604051610bfa9190616613565b60405180910390f35b348015610c0f57600080fd5b50610c2a6004803603810190610c259190615dc2565b6127b6565b005b348015610c3857600080fd5b50610c416128ad565b005b348015610c4f57600080fd5b50610c6a6004803603810190610c659190615dc2565b6128c1565b604051610c779190615a88565b60405180910390f35b348015610c8c57600080fd5b50610ca76004803603810190610ca291906168e7565b6128d9565b604051610cb49190615a88565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf919061695b565b612941565b604051610cf19190615a88565b60405180910390f35b348015610d0657600080fd5b50610d216004803603810190610d1c9190615dc2565b6129dc565b604051610d2e9190615a54565b60405180910390f35b348015610d4357600080fd5b50610d4c612a06565b604051610d599190615a88565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d849190615dc2565b612a0c565b005b348015610d9757600080fd5b50610da0612aaf565b604051610dad91906160d4565b60405180910390f35b348015610dc257600080fd5b50610ddd6004803603810190610dd89190615dc2565b612ad9565b604051610dea9190615e6e565b60405180910390f35b348015610dff57600080fd5b50610e1a6004803603810190610e159190615dc2565b612b79565b604051610e279190615a54565b60405180910390f35b348015610e3c57600080fd5b50610e45612b99565b604051610e529190615a88565b60405180910390f35b348015610e6757600080fd5b50610e70612b9f565b604051610e7d9190615a88565b60405180910390f35b348015610e9257600080fd5b50610ead6004803603810190610ea89190616a32565b612ba8565b604051610eba9190615a88565b60405180910390f35b348015610ecf57600080fd5b50610ed8612bbe565b604051610ee59190615a88565b60405180910390f35b348015610efa57600080fd5b50610f156004803603810190610f109190616af1565b612be7565b005b348015610f2357600080fd5b50610f3e6004803603810190610f399190615dc2565b612cde565b604051610f4b9190615a88565b60405180910390f35b348015610f6057600080fd5b50610f7b6004803603810190610f769190615dc2565b612dab565b604051610f889190615e6e565b60405180910390f35b348015610f9d57600080fd5b50610fa6612e50565b604051610fb39190615a88565b60405180910390f35b348015610fc857600080fd5b50610fe36004803603810190610fde9190615dc2565b612e5f565b604051610ff09190615a88565b60405180910390f35b34801561100557600080fd5b50611020600480360381019061101b9190615dc2565b612e7c565b60405161102d9190615a88565b60405180910390f35b34801561104257600080fd5b5061105d60048036038101906110589190616b1e565b612e99565b60405161106a91906160aa565b60405180910390f35b34801561107f57600080fd5b5061109a60048036038101906110959190615dc2565b612eae565b6040516110a79190615a88565b60405180910390f35b3480156110bc57600080fd5b506110d760048036038101906110d291906168ba565b612f1c565b6040516110e49190615a54565b60405180910390f35b3480156110f957600080fd5b50611114600480360381019061110f9190616bed565b612f72565b005b34801561112257600080fd5b5061113d60048036038101906111389190616356565b6130b3565b60405161114a9190615a88565b60405180910390f35b61116d60048036038101906111689190615dc2565b6130ef565b005b34801561117b57600080fd5b5061119660048036038101906111919190615f31565b6131dc565b6040516111a39190615a88565b60405180910390f35b3480156111b857600080fd5b506111c161320a565b6040516111ce91906160d4565b60405180910390f35b3480156111e357600080fd5b506111fe60048036038101906111f99190616c61565b613234565b60405161120b9190615a88565b60405180910390f35b34801561122057600080fd5b50611229613259565b6040516112369190615e6e565b60405180910390f35b34801561124b57600080fd5b50611254613296565b6040516112619190616420565b60405180910390f35b34801561127657600080fd5b50611291600480360381019061128c9190615dc2565b6132ba565b60405161129e9190615a54565b60405180910390f35b3480156112b357600080fd5b506112ce60048036038101906112c99190615dc2565b6132e4565b005b3480156112dc57600080fd5b506112f760048036038101906112f29190616ca1565b6133db565b6040516113049190615a88565b60405180910390f35b34801561131957600080fd5b50611334600480360381019061132f9190615dc2565b6133f7565b005b34801561134257600080fd5b5061135d60048036038101906113589190616ce1565b6134ee565b60405161136a91906160aa565b60405180910390f35b34801561137f57600080fd5b5061139a600480360381019061139591906168ba565b613503565b005b3480156113a857600080fd5b506113c360048036038101906113be9190615dc2565b613586565b6040516113d09190615a88565b60405180910390f35b3480156113e557600080fd5b506113ee613598565b6040516113fb9190616dd7565b60405180910390f35b61140c6135bc565b005b60006114186139f0565b905090565b600061142882613a1a565b9050919050565b6000611439613a94565b905090565b6000806114c16114b97fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c60405161147a929190616e22565b60405180910390208b8051906020012060405160200161149e959493929190616e4a565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b90506115148a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613ae3565b91505098975050505050505050565b61152b61140e565b73ffffffffffffffffffffffffffffffffffffffff16611549613c9f565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115be61140e565b73ffffffffffffffffffffffffffffffffffffffff161461160e5760006115e3613ca7565b6040516115f1929190616e22565b604051809103902090505b806116076002613cb4565b036115fc57505b61161781613d90565b50565b60606000805461162990616f38565b80601f016020809104026020016040519081016040528092919081815260200182805461165590616f38565b80156116a25780601f10611677576101008083540402835291602001916116a2565b820191906000526020600020905b81548152906001019060200180831161168557829003601f168201915b5050505050905090565b600260038111156116c0576116bf616539565b5b601b600083815260200190815260200160002060009054906101000a900460ff1660038111156116f3576116f2616539565b5b036117f75760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161177390616f8f565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50509050806117f0576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611829565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600060148260405161183e9190616fe0565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806118cf868686866130b3565b9050600460078111156118e5576118e4616539565b5b6118ee8261205f565b6007811115611900576118ff616539565b5b14611940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193790617069565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d3919061709e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611a3995949392919061739b565b602060405180830381865afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a9190617418565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611af796959493929190617445565b600060405180830381600087803b158015611b1157600080fd5b505af1158015611b25573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b5791906174ea565b604051611b6592919061751e565b60405180910390a18192505050949350505050565b600080611b89868686866130b3565b90506000611b968261205f565b905060046007811115611bac57611bab616539565b5b816007811115611bbf57611bbe616539565b5b1480611bef575060056007811115611bda57611bd9616539565b5b816007811115611bed57611bec616539565b5b145b611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590617069565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c8b9190615a88565b60405180910390a1611ca08288888888613f44565b611cad8288888888614027565b611cba828888888861403b565b8192505050949350505050565b6000611d24600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d636140a4565b905090565b600080611dc9611dc17f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611da693929190617547565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b9050611de6878288604051806020016040528060008152506140ae565b91505095945050505050565b611dfa6140ce565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e7d576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611ee157611ee0616539565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d54601485604051611f2d9190616fe0565b9081526020016040518091039020819055508360156000600d5481526020019081526020016000209081611f619190617720565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d6000815480929190612054906177f2565b919050555050505050565b600061206a8261414c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061212c604051806020016040528060008152506126bc565b50905080612166576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600060196000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060186000600d5481526020019081526020016000205460176000600d548152602001908152602001600020541115612393576001601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561222d5761222c616539565b5b021790555060006064600f5460176000600d54815260200190815260200160002054612259919061783a565b61226391906178ab565b90506000601a6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516122c090616f8f565b60006040518083038185875af1925050503d80600081146122fd576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b606091505b505090508061235d5760176000600d548152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016123549190615a88565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612401565b6002601b6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156123cc576123cb616539565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806124b0613c9f565b90506124cd848285604051806020016040528060008152506140ae565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b600080612511613c9f565b905061256487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613ae3565b91505095945050505050565b600080600960000180549050905060008103612591576008549150506126b7565b600060096000016001836125a591906178dc565b815481106125b6576125b5617910565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161269e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506126b7565b6126b284600961431f90919063ffffffff16565b925050505b919050565b6000606060116000600d54815260200190815260200160002060009054906101000a900460ff16801561276f575060126000600d548152602001908152602001600020600060136000600d5481526020019081526020016000205481526020019081526020016000205460126000600d548152602001908152602001600020600060136000600d548152602001908152602001600020548152602001908152602001600020544261276d91906178dc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b6127be61140e565b73ffffffffffffffffffffffffffffffffffffffff166127dc613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661285161140e565b73ffffffffffffffffffffffffffffffffffffffff16146128a1576000612876613ca7565b604051612884929190616e22565b604051809103902090505b8061289a6002613cb4565b0361288f57505b6128aa81614477565b50565b6128b56140ce565b6128bf60006144bc565b565b60176020528060005260406000206000915090505481565b6000806128e4613c9f565b905061293686828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506140ae565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129c6576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129d285858585614582565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612a146140ce565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612aa757612aa6616539565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612af890616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2490616f38565b8015612b715780601f10612b4657610100808354040283529160200191612b71565b820191906000526020600020905b815481529060010190602001808311612b5457829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612bb5848484614889565b90509392505050565b60008060096000018054905014612bde57612bd96009613902565b612be2565b6008545b905090565b612bef61140e565b73ffffffffffffffffffffffffffffffffffffffff16612c0d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612c8261140e565b73ffffffffffffffffffffffffffffffffffffffff1614612cd2576000612ca7613ca7565b604051612cb5929190616e22565b604051809103902090505b80612ccb6002613cb4565b03612cc057505b612cdb81614930565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612d4f9190616420565b602060405180830381865afa158015612d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d90919061709e565b905060018114612da05780612da3565b60005b915050919050565b6060601560008381526020019081526020016000208054612dcb90616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612df790616f38565b8015612e445780601f10612e1957610100808354040283529160200191612e44565b820191906000526020600020905b815481529060010190602001808311612e2757829003601f168201915b50505050509050919050565b6000612e5a6149cf565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612f0b600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612f7a61140e565b73ffffffffffffffffffffffffffffffffffffffff16612f98613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661300d61140e565b73ffffffffffffffffffffffffffffffffffffffff161461305d576000613032613ca7565b604051613040929190616e22565b604051809103902090505b806130566002613cb4565b0361304b57505b6130ac8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856149d9565b5050505050565b6000848484846040516020016130cc949392919061793f565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff16613147576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a791906174ea565b92505081905550346017600084815260200190815260200160002060008282546131d191906174ea565b925050819055505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6132ec61140e565b73ffffffffffffffffffffffffffffffffffffffff1661330a613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335790616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661337f61140e565b73ffffffffffffffffffffffffffffffffffffffff16146133cf5760006133a4613ca7565b6040516133b2929190616e22565b604051809103902090505b806133c86002613cb4565b036133bd57505b6133d881614a08565b50565b60006133ef83836133ea614a90565b614889565b905092915050565b6133ff61140e565b73ffffffffffffffffffffffffffffffffffffffff1661341d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661349261140e565b73ffffffffffffffffffffffffffffffffffffffff16146134e25760006134b7613ca7565b6040516134c5929190616e22565b604051809103902090505b806134db6002613cb4565b036134d057505b6134eb81614aa7565b50565b600063f23a6e6160e01b905095945050505050565b61350b6140ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361357a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357190617a0b565b60405180910390fd5b613583816144bc565b50565b600061359182614aec565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543410156135f8576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156136f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ef90617a9d565b60405180910390fd5b819050919050565b600080600084600001805490509050600061371a86613902565b90506000821180156137705750438660000160018461373991906178dc565b8154811061374a57613749617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156138005761377e85613695565b8660000160018461378f91906178dc565b815481106137a05761379f617910565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506138f3565b8560000160405180604001604052806138184361399d565b63ffffffff16815260200161382c88613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613974578260000160018261392891906178dc565b8154811061393957613938617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613977565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156139e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139df90617b2f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a8d5750613a8c82614bb4565b5b9050919050565b6000600554905090565b6000613ab1613aab614d19565b83614e33565b9050919050565b6000806000613ac987878787614e66565b91509150613ad681614f72565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613b0f57613b0e616539565b5b613b188861205f565b6007811115613b2a57613b29616539565b5b14613b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6190617bc1565b60405180910390fd5b6000613bc987613bb9846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff1686614889565b9050613bd8888888848861513e565b6000845103613c3a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613c2d9493929190617be1565b60405180910390a2613c91565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613c88959493929190617c2d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613cbf82615342565b15613cf6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613d98612b9f565b811115613dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd190617d26565b60405180910390fd5b6000613de4612bbe565b905060008114158015613dff57506000600960000180549050145b15613ef15760096000016040518060400160405280600063ffffffff168152602001613e2a84613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613f0582600961370090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613f3892919061751e565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613f6361140e565b73ffffffffffffffffffffffffffffffffffffffff16146140205760005b845181101561401e573073ffffffffffffffffffffffffffffffffffffffff16858281518110613fb457613fb3617910565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361400d5761400c838281518110613fed57613fec617910565b5b602002602001015180519060200120600261537790919063ffffffff16565b5b80614017906177f2565b9050613f81565b505b5050505050565b61403485858585856153f3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661405a61140e565b73ffffffffffffffffffffffffffffffffffffffff161461408f5761407f6002615342565b61408e5761408d6002615491565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006140c4858585856140bf614a90565b613ae3565b9050949350505050565b6140d6613c9f565b73ffffffffffffffffffffffffffffffffffffffff166140f4612aaf565b73ffffffffffffffffffffffffffffffffffffffff161461414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161414190617d92565b60405180910390fd5b565b60008061415883615512565b90506004600781111561416e5761416d616539565b5b81600781111561418157614180616539565b5b1461418f578091505061431a565b6000600b60008581526020019081526020016000205490506000801b81036141bb57819250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016142169190616420565b602060405180830381865afa158015614233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142579190617dde565b156142675760079250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016142c29190616420565b602060405180830381865afa1580156142df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143039190617dde565b156143135760059250505061431a565b6002925050505b919050565b6000438210614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90617e57565b60405180910390fd5b60008360000180549050905060005b818110156143e75760006143868284615626565b90508486600001828154811061439f5761439e617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156143d1578092506143e1565b6001816143de91906174ea565b91505b50614372565b6000821461444c578460000160018361440091906178dc565b8154811061441157614410617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661444f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516144aa92919061751e565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061458c612e50565b6145a9614597613c9f565b6001436145a491906178dc565b6133db565b10156145ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145e190617ee9565b60405180910390fd5b60006145ff86868686805190602001206130b3565b90508451865114614645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161463c90617f7b565b60405180910390fd5b8351865114614689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468090617f7b565b60405180910390fd5b60008651116146cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146c490617fe7565b60405180910390fd5b600060016000838152602001908152602001600020905061472d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061564c565b61476c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161476390618079565b60405180910390fd5b600061477e614779611d59565b615666565b61478743615666565b61479191906180ad565b905060006147a56147a061142f565b615666565b826147b091906180ad565b90506147c882846000016156bd90919063ffffffff16565b6147de81846001016156bd90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614808613c9f565b8b8b8d5167ffffffffffffffff81111561482557614824615b83565b5b60405190808252806020026020018201604052801561485857816020015b60608152602001906001900390816148435790505b508c88888e60405161487299989796959493929190618226565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016148e69291906182d6565b602060405180830381865afa158015614903573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614927919061709e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516149839291906182ff565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606149ff848484604051806060016040528060298152602001618a5b602991396156ec565b90509392505050565b60008111614a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a429061839a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614a7e92919061751e565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614ada92919061751e565b60405180910390a18060068190555050565b6000614af6612b9f565b614aff83612570565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614b589190615a88565b602060405180830381865afa158015614b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b99919061709e565b614ba3919061783a565b614bad91906178ab565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614c9a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d0257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d125750614d1182615800565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614d9557507f000000000000000000000000000000000000000000000000000000000000000046145b15614dc2577f00000000000000000000000000000000000000000000000000000000000000009050614e30565b614e2d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061586a565b90505b90565b60008282604051602001614e48929190618427565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614ea1576000600391509150614f69565b601b8560ff1614158015614eb95750601c8560ff1614155b15614ecb576000600491509150614f69565b600060018787878760405160008152602001604052604051614ef0949392919061845e565b6020604051602081039080840390855afa158015614f12573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614f6057600060019250925050614f69565b80600092509250505b94509492505050565b60006004811115614f8657614f85616539565b5b816004811115614f9957614f98616539565b5b031561513b5760016004811115614fb357614fb2616539565b5b816004811115614fc657614fc5616539565b5b03615006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ffd906184ef565b60405180910390fd5b6002600481111561501a57615019616539565b5b81600481111561502d5761502c616539565b5b0361506d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150649061855b565b60405180910390fd5b6003600481111561508157615080616539565b5b81600481111561509457615093616539565b5b036150d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150cb906185ed565b60405180910390fd5b6004808111156150e7576150e6616539565b5b8160048111156150fa576150f9616539565b5b0361513a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151319061867f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156151e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151db90618711565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561525257615251616539565b5b60ff168460ff160361527e578281600001600082825461527291906174ea565b9250508190555061533a565b6001600281111561529257615291616539565b5b60ff168460ff16036152be57828160010160008282546152b291906174ea565b92505081905550615339565b6002808111156152d1576152d0616539565b5b60ff168460ff16036152fd57828160020160008282546152f191906174ea565b92505081905550615338565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161532f906187a3565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161545895949392919061739b565b6000604051808303818588803b15801561547157600080fd5b505af1158015615485573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561554b576007915050615621565b8060020160019054906101000a900460ff161561556c576002915050615621565b600061557784611cc7565b9050600081036155bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155b39061880f565b60405180910390fd5b4381106155ce57600092505050615621565b60006155d985612eae565b90504381106155ee5760019350505050615621565b6155f7856158a4565b80156156085750615607856158eb565b5b156156195760049350505050615621565b600393505050505b919050565b6000600282841861563791906178ab565b82841661564491906174ea565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff80168211156156b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016156ac906188a1565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161572890618933565b60405180910390fd5b61573a85615916565b615779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709061899f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516157a291906189f0565b60006040518083038185875af1925050503d80600081146157df576040519150601f19603f3d011682016040523d82523d6000602084013e6157e4565b606091505b50915091506157f4828286615939565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615885959493929190618a07565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546158d091906174ea565b6158e16158dc85611cc7565b613586565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561594957829050615999565b60008351111561595c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159909190615e6e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6159e9816159b4565b81146159f457600080fd5b50565b600081359050615a06816159e0565b92915050565b600060208284031215615a2257615a216159aa565b5b6000615a30848285016159f7565b91505092915050565b60008115159050919050565b615a4e81615a39565b82525050565b6000602082019050615a696000830184615a45565b92915050565b6000819050919050565b615a8281615a6f565b82525050565b6000602082019050615a9d6000830184615a79565b92915050565b615aac81615a6f565b8114615ab757600080fd5b50565b600081359050615ac981615aa3565b92915050565b600060ff82169050919050565b615ae581615acf565b8114615af057600080fd5b50565b600081359050615b0281615adc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615b2d57615b2c615b08565b5b8235905067ffffffffffffffff811115615b4a57615b49615b0d565b5b602083019150836001820283011115615b6657615b65615b12565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615bbb82615b72565b810181811067ffffffffffffffff82111715615bda57615bd9615b83565b5b80604052505050565b6000615bed6159a0565b9050615bf98282615bb2565b919050565b600067ffffffffffffffff821115615c1957615c18615b83565b5b615c2282615b72565b9050602081019050919050565b82818337600083830152505050565b6000615c51615c4c84615bfe565b615be3565b905082815260208101848484011115615c6d57615c6c615b6d565b5b615c78848285615c2f565b509392505050565b600082601f830112615c9557615c94615b08565b5b8135615ca5848260208601615c3e565b91505092915050565b6000819050919050565b615cc181615cae565b8114615ccc57600080fd5b50565b600081359050615cde81615cb8565b92915050565b60008060008060008060008060e0898b031215615d0457615d036159aa565b5b6000615d128b828c01615aba565b9850506020615d238b828c01615af3565b975050604089013567ffffffffffffffff811115615d4457615d436159af565b5b615d508b828c01615b17565b9650965050606089013567ffffffffffffffff811115615d7357615d726159af565b5b615d7f8b828c01615c80565b9450506080615d908b828c01615af3565b93505060a0615da18b828c01615ccf565b92505060c0615db28b828c01615ccf565b9150509295985092959890939650565b600060208284031215615dd857615dd76159aa565b5b6000615de684828501615aba565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615e29578082015181840152602081019050615e0e565b60008484015250505050565b6000615e4082615def565b615e4a8185615dfa565b9350615e5a818560208601615e0b565b615e6381615b72565b840191505092915050565b60006020820190508181036000830152615e888184615e35565b905092915050565b600067ffffffffffffffff821115615eab57615eaa615b83565b5b615eb482615b72565b9050602081019050919050565b6000615ed4615ecf84615e90565b615be3565b905082815260208101848484011115615ef057615eef615b6d565b5b615efb848285615c2f565b509392505050565b600082601f830112615f1857615f17615b08565b5b8135615f28848260208601615ec1565b91505092915050565b600060208284031215615f4757615f466159aa565b5b600082013567ffffffffffffffff811115615f6557615f646159af565b5b615f7184828501615f03565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615fa582615f7a565b9050919050565b615fb581615f9a565b8114615fc057600080fd5b50565b600081359050615fd281615fac565b92915050565b60008060408385031215615fef57615fee6159aa565b5b6000615ffd85828601615aba565b925050602061600e85828601615fc3565b9150509250929050565b60008060008060808587031215616032576160316159aa565b5b600061604087828801615fc3565b945050602061605187828801615fc3565b935050604061606287828801615aba565b925050606085013567ffffffffffffffff811115616083576160826159af565b5b61608f87828801615c80565b91505092959194509250565b6160a4816159b4565b82525050565b60006020820190506160bf600083018461609b565b92915050565b6160ce81615f9a565b82525050565b60006020820190506160e960008301846160c5565b92915050565b600067ffffffffffffffff82111561610a57616109615b83565b5b602082029050602081019050919050565b600061612e616129846160ef565b615be3565b9050808382526020820190506020840283018581111561615157616150615b12565b5b835b8181101561617a57806161668882615fc3565b845260208401935050602081019050616153565b5050509392505050565b600082601f83011261619957616198615b08565b5b81356161a984826020860161611b565b91505092915050565b600067ffffffffffffffff8211156161cd576161cc615b83565b5b602082029050602081019050919050565b60006161f16161ec846161b2565b615be3565b9050808382526020820190506020840283018581111561621457616213615b12565b5b835b8181101561623d57806162298882615aba565b845260208401935050602081019050616216565b5050509392505050565b600082601f83011261625c5761625b615b08565b5b813561626c8482602086016161de565b91505092915050565b600067ffffffffffffffff8211156162905761628f615b83565b5b602082029050602081019050919050565b60006162b46162af84616275565b615be3565b905080838252602082019050602084028301858111156162d7576162d6615b12565b5b835b8181101561631e57803567ffffffffffffffff8111156162fc576162fb615b08565b5b8086016163098982615c80565b855260208501945050506020810190506162d9565b5050509392505050565b600082601f83011261633d5761633c615b08565b5b813561634d8482602086016162a1565b91505092915050565b600080600080608085870312156163705761636f6159aa565b5b600085013567ffffffffffffffff81111561638e5761638d6159af565b5b61639a87828801616184565b945050602085013567ffffffffffffffff8111156163bb576163ba6159af565b5b6163c787828801616247565b935050604085013567ffffffffffffffff8111156163e8576163e76159af565b5b6163f487828801616328565b925050606061640587828801615ccf565b91505092959194509250565b61641a81615cae565b82525050565b60006020820190506164356000830184616411565b92915050565b600080600080600060a08688031215616457576164566159aa565b5b600061646588828901615aba565b955050602061647688828901615af3565b945050604061648788828901615af3565b935050606061649888828901615ccf565b92505060806164a988828901615ccf565b9150509295509295909350565b600080600080608085870312156164d0576164cf6159aa565b5b600085013567ffffffffffffffff8111156164ee576164ed6159af565b5b6164fa87828801615f03565b945050602061650b87828801615aba565b935050604061651c87828801615aba565b925050606061652d87828801615fc3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061657957616578616539565b5b50565b600081905061658a82616568565b919050565b600061659a8261657c565b9050919050565b6165aa8161658f565b82525050565b60006020820190506165c560008301846165a1565b92915050565b600481106165dc576165db616539565b5b50565b60008190506165ed826165cb565b919050565b60006165fd826165df565b9050919050565b61660d816165f2565b82525050565b60006020820190506166286000830184616604565b92915050565b60008083601f84011261664457616643615b08565b5b8235905067ffffffffffffffff81111561666157616660615b0d565b5b60208301915083600182028301111561667d5761667c615b12565b5b9250929050565b6000806020838503121561669b5761669a6159aa565b5b600083013567ffffffffffffffff8111156166b9576166b86159af565b5b6166c58582860161662e565b92509250509250929050565b60006060820190506166e66000830186615a79565b6166f36020830185615a79565b6167006040830184615a79565b949350505050565b6000806040838503121561671f5761671e6159aa565b5b600061672d85828601615aba565b925050602061673e85828601615af3565b9150509250929050565b600080600080600060808688031215616764576167636159aa565b5b600061677288828901615aba565b955050602061678388828901615af3565b945050604086013567ffffffffffffffff8111156167a4576167a36159af565b5b6167b088828901615b17565b9350935050606086013567ffffffffffffffff8111156167d3576167d26159af565b5b6167df88828901615c80565b9150509295509295909350565b600060208284031215616802576168016159aa565b5b600082013567ffffffffffffffff8111156168205761681f6159af565b5b61682c84828501615c80565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061685c82616835565b6168668185616840565b9350616876818560208601615e0b565b61687f81615b72565b840191505092915050565b600060408201905061689f6000830185615a45565b81810360208301526168b18184616851565b90509392505050565b6000602082840312156168d0576168cf6159aa565b5b60006168de84828501615fc3565b91505092915050565b60008060008060608587031215616901576169006159aa565b5b600061690f87828801615aba565b945050602061692087828801615af3565b935050604085013567ffffffffffffffff811115616941576169406159af565b5b61694d87828801615b17565b925092505092959194509250565b60008060008060808587031215616975576169746159aa565b5b600085013567ffffffffffffffff811115616993576169926159af565b5b61699f87828801616184565b945050602085013567ffffffffffffffff8111156169c0576169bf6159af565b5b6169cc87828801616247565b935050604085013567ffffffffffffffff8111156169ed576169ec6159af565b5b6169f987828801616328565b925050606085013567ffffffffffffffff811115616a1a57616a196159af565b5b616a2687828801615f03565b91505092959194509250565b600080600060608486031215616a4b57616a4a6159aa565b5b6000616a5986828701615fc3565b9350506020616a6a86828701615aba565b925050604084013567ffffffffffffffff811115616a8b57616a8a6159af565b5b616a9786828701615c80565b9150509250925092565b6000616aac82615f7a565b9050919050565b6000616abe82616aa1565b9050919050565b616ace81616ab3565b8114616ad957600080fd5b50565b600081359050616aeb81616ac5565b92915050565b600060208284031215616b0757616b066159aa565b5b6000616b1584828501616adc565b91505092915050565b600080600080600060a08688031215616b3a57616b396159aa565b5b6000616b4888828901615fc3565b9550506020616b5988828901615fc3565b945050604086013567ffffffffffffffff811115616b7a57616b796159af565b5b616b8688828901616247565b935050606086013567ffffffffffffffff811115616ba757616ba66159af565b5b616bb388828901616247565b925050608086013567ffffffffffffffff811115616bd457616bd36159af565b5b616be088828901615c80565b9150509295509295909350565b60008060008060608587031215616c0757616c066159aa565b5b6000616c1587828801615fc3565b9450506020616c2687828801615aba565b935050604085013567ffffffffffffffff811115616c4757616c466159af565b5b616c538782880161662e565b925092505092959194509250565b60008060408385031215616c7857616c776159aa565b5b6000616c8685828601615aba565b9250506020616c9785828601615aba565b9150509250929050565b60008060408385031215616cb857616cb76159aa565b5b6000616cc685828601615fc3565b9250506020616cd785828601615aba565b9150509250929050565b600080600080600060a08688031215616cfd57616cfc6159aa565b5b6000616d0b88828901615fc3565b9550506020616d1c88828901615fc3565b9450506040616d2d88828901615aba565b9350506060616d3e88828901615aba565b925050608086013567ffffffffffffffff811115616d5f57616d5e6159af565b5b616d6b88828901615c80565b9150509295509295909350565b6000819050919050565b6000616d9d616d98616d9384615f7a565b616d78565b615f7a565b9050919050565b6000616daf82616d82565b9050919050565b6000616dc182616da4565b9050919050565b616dd181616db6565b82525050565b6000602082019050616dec6000830184616dc8565b92915050565b600081905092915050565b6000616e098385616df2565b9350616e16838584615c2f565b82840190509392505050565b6000616e2f828486616dfd565b91508190509392505050565b616e4481615acf565b82525050565b600060a082019050616e5f6000830188616411565b616e6c6020830187615a79565b616e796040830186616e3b565b616e866060830185616411565b616e936080830184616411565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616ed3601883615dfa565b9150616ede82616e9d565b602082019050919050565b60006020820190508181036000830152616f0281616ec6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616f5057607f821691505b602082108103616f6357616f62616f09565b5b50919050565b50565b6000616f79600083616df2565b9150616f8482616f69565b600082019050919050565b6000616f9a82616f6c565b9150819050919050565b600081905092915050565b6000616fba82615def565b616fc48185616fa4565b9350616fd4818560208601615e0b565b80840191505092915050565b6000616fec8284616faf565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000617053602183615dfa565b915061705e82616ff7565b604082019050919050565b6000602082019050818103600083015261708281617046565b9050919050565b60008151905061709881615aa3565b92915050565b6000602082840312156170b4576170b36159aa565b5b60006170c284828501617089565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61710081615f9a565b82525050565b600061711283836170f7565b60208301905092915050565b6000602082019050919050565b6000617136826170cb565b61714081856170d6565b935061714b836170e7565b8060005b8381101561717c5781516171638882617106565b975061716e8361711e565b92505060018101905061714f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6171be81615a6f565b82525050565b60006171d083836171b5565b60208301905092915050565b6000602082019050919050565b60006171f482617189565b6171fe8185617194565b9350617209836171a5565b8060005b8381101561723a57815161722188826171c4565b975061722c836171dc565b92505060018101905061720d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061728f82616835565b6172998185617273565b93506172a9818560208601615e0b565b6172b281615b72565b840191505092915050565b60006172c98383617284565b905092915050565b6000602082019050919050565b60006172e982617247565b6172f38185617252565b93508360208202850161730585617263565b8060005b85811015617341578484038952815161732285826172bd565b945061732d836172d1565b925060208a01995050600181019050617309565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061738561738061737b84617353565b61735d565b615cae565b9050919050565b6173958161736a565b82525050565b600060a08201905081810360008301526173b5818861712b565b905081810360208301526173c981876171e9565b905081810360408301526173dd81866172de565b90506173ec606083018561738c565b6173f96080830184616411565b9695505050505050565b60008151905061741281615cb8565b92915050565b60006020828403121561742e5761742d6159aa565b5b600061743c84828501617403565b91505092915050565b600060c082019050818103600083015261745f818961712b565b9050818103602083015261747381886171e9565b9050818103604083015261748781876172de565b9050617496606083018661738c565b6174a36080830185616411565b6174b060a0830184615a79565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006174f582615a6f565b915061750083615a6f565b9250828201905080821115617518576175176174bb565b5b92915050565b60006040820190506175336000830185615a79565b6175406020830184615a79565b9392505050565b600060608201905061755c6000830186616411565b6175696020830185615a79565b6175766040830184616e3b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026175e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826175a3565b6175ea86836175a3565b95508019841693508086168417925050509392505050565b600061761d61761861761384615a6f565b616d78565b615a6f565b9050919050565b6000819050919050565b61763783617602565b61764b61764382617624565b8484546175b0565b825550505050565b600090565b617660617653565b61766b81848461762e565b505050565b5b8181101561768f57617684600082617658565b600181019050617671565b5050565b601f8211156176d4576176a58161757e565b6176ae84617593565b810160208510156176bd578190505b6176d16176c985617593565b830182617670565b50505b505050565b600082821c905092915050565b60006176f7600019846008026176d9565b1980831691505092915050565b600061771083836176e6565b9150826002028217905092915050565b61772982615def565b67ffffffffffffffff81111561774257617741615b83565b5b61774c8254616f38565b617757828285617693565b600060209050601f83116001811461778a5760008415617778578287015190505b6177828582617704565b8655506177ea565b601f1984166177988661757e565b60005b828110156177c05784890151825560018201915060208501945060208101905061779b565b868310156177dd57848901516177d9601f8916826176e6565b8355505b6001600288020188555050505b505050505050565b60006177fd82615a6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361782f5761782e6174bb565b5b600182019050919050565b600061784582615a6f565b915061785083615a6f565b925082820261785e81615a6f565b91508282048414831517617875576178746174bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006178b682615a6f565b91506178c183615a6f565b9250826178d1576178d061787c565b5b828204905092915050565b60006178e782615a6f565b91506178f283615a6f565b925082820390508181111561790a576179096174bb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152617959818761712b565b9050818103602083015261796d81866171e9565b9050818103604083015261798181856172de565b90506179906060830184616411565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006179f5602683615dfa565b9150617a0082617999565b604082019050919050565b60006020820190508181036000830152617a24816179e8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617a87602783615dfa565b9150617a9282617a2b565b604082019050919050565b60006020820190508181036000830152617ab681617a7a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000617b19602683615dfa565b9150617b2482617abd565b604082019050919050565b60006020820190508181036000830152617b4881617b0c565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000617bab602383615dfa565b9150617bb682617b4f565b604082019050919050565b60006020820190508181036000830152617bda81617b9e565b9050919050565b6000608082019050617bf66000830187615a79565b617c036020830186616e3b565b617c106040830185615a79565b8181036060830152617c228184615e35565b905095945050505050565b600060a082019050617c426000830188615a79565b617c4f6020830187616e3b565b617c5c6040830186615a79565b8181036060830152617c6e8185615e35565b90508181036080830152617c828184616851565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617d10604383615dfa565b9150617d1b82617c8e565b606082019050919050565b60006020820190508181036000830152617d3f81617d03565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617d7c602083615dfa565b9150617d8782617d46565b602082019050919050565b60006020820190508181036000830152617dab81617d6f565b9050919050565b617dbb81615a39565b8114617dc657600080fd5b50565b600081519050617dd881617db2565b92915050565b600060208284031215617df457617df36159aa565b5b6000617e0284828501617dc9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617e41602083615dfa565b9150617e4c82617e0b565b602082019050919050565b60006020820190508181036000830152617e7081617e34565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617ed3603183615dfa565b9150617ede82617e77565b604082019050919050565b60006020820190508181036000830152617f0281617ec6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617f65602183615dfa565b9150617f7082617f09565b604082019050919050565b60006020820190508181036000830152617f9481617f58565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617fd1601883615dfa565b9150617fdc82617f9b565b602082019050919050565b6000602082019050818103600083015261800081617fc4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000618063602183615dfa565b915061806e82618007565b604082019050919050565b6000602082019050818103600083015261809281618056565b9050919050565b600067ffffffffffffffff82169050919050565b60006180b882618099565b91506180c383618099565b9250828201905067ffffffffffffffff8111156180e3576180e26174bb565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061813182615def565b61813b8185618115565b935061814b818560208601615e0b565b61815481615b72565b840191505092915050565b600061816b8383618126565b905092915050565b6000602082019050919050565b600061818b826180e9565b61819581856180f4565b9350836020820285016181a785618105565b8060005b858110156181e357848403895281516181c4858261815f565b94506181cf83618173565b925060208a019950506001810190506181ab565b50829750879550505050505092915050565b600061821061820b61820684618099565b616d78565b615a6f565b9050919050565b618220816181f5565b82525050565b60006101208201905061823c600083018c615a79565b618249602083018b6160c5565b818103604083015261825b818a61712b565b9050818103606083015261826f81896171e9565b905081810360808301526182838188618180565b905081810360a083015261829781876172de565b90506182a660c0830186618217565b6182b360e0830185618217565b8181036101008301526182c68184615e35565b90509a9950505050505050505050565b60006040820190506182eb60008301856160c5565b6182f86020830184615a79565b9392505050565b600060408201905061831460008301856160c5565b61832160208301846160c5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618384602783615dfa565b915061838f82618328565b604082019050919050565b600060208201905081810360008301526183b381618377565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006183f0600283616fa4565b91506183fb826183ba565b600282019050919050565b6000819050919050565b61842161841c82615cae565b618406565b82525050565b6000618432826183e3565b915061843e8285618410565b60208201915061844e8284618410565b6020820191508190509392505050565b60006080820190506184736000830187616411565b6184806020830186616e3b565b61848d6040830185616411565b61849a6060830184616411565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006184d9601883615dfa565b91506184e4826184a3565b602082019050919050565b60006020820190508181036000830152618508816184cc565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618545601f83615dfa565b91506185508261850f565b602082019050919050565b6000602082019050818103600083015261857481618538565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006185d7602283615dfa565b91506185e28261857b565b604082019050919050565b60006020820190508181036000830152618606816185ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618669602283615dfa565b91506186748261860d565b604082019050919050565b600060208201905081810360008301526186988161865c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006186fb602783615dfa565b91506187068261869f565b604082019050919050565b6000602082019050818103600083015261872a816186ee565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061878d603583615dfa565b915061879882618731565b604082019050919050565b600060208201905081810360008301526187bc81618780565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006187f9601d83615dfa565b9150618804826187c3565b602082019050919050565b60006020820190508181036000830152618828816187ec565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061888b602683615dfa565b91506188968261882f565b604082019050919050565b600060208201905081810360008301526188ba8161887e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061891d602683615dfa565b9150618928826188c1565b604082019050919050565b6000602082019050818103600083015261894c81618910565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618989601d83615dfa565b915061899482618953565b602082019050919050565b600060208201905081810360008301526189b88161897c565b9050919050565b60006189ca82616835565b6189d48185616df2565b93506189e4818560208601615e0b565b80840191505092915050565b60006189fc82846189bf565b915081905092915050565b600060a082019050618a1c6000830188616411565b618a296020830187616411565b618a366040830186616411565b618a436060830185615a79565b618a5060808301846160c5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220dd4edfac69a6afd6aeac0d468ddba6cc40c7263f1a78654ed0f9586c5980bfef64736f6c63430008110033", - "deployedBytecode": "0x60806040526004361061044b5760003560e01c80637b3c71d311610234578063c01f9e371161012e578063deaaa7cc116100b6578063f23a6e611161007a578063f23a6e6114611336578063f2fde38b14611373578063f8ce560a1461139c578063fc0c546a146113d9578063fea856a11461140457610491565b8063deaaa7cc1461123f578063e0c410cc1461126a578063ea0217cf146112a7578063eb9019d4146112d0578063ece40cc11461130d57610491565b8063ca1d209d116100fd578063ca1d209d14611153578063cf6862591461116f578063d33219b4146111ac578063dc73204b146111d7578063dd4e2ba51461121457610491565b8063c01f9e3714611073578063c0d55329146110b0578063c28bc2fa146110ed578063c59057e41461111657610491565b806397c3d334116101bc578063abe1aae611610180578063abe1aae614610f54578063b58131b014610f91578063b59d18a014610fbc578063bba9c21914610ff9578063bc197c811461103657610491565b806397c3d33414610e5b5780639a802a6d14610e86578063a7713a7014610ec3578063a890c91014610eee578063ab58fb8e14610f1757610491565b806387030f4d1161020357806387030f4d14610d625780638da5cb5b14610d8b5780638fb5548f14610db6578063902bfa2414610df357806396aa167e14610e3057610491565b80637b3c71d314610c805780637d5e81e214610cbd578063809b268e14610cfa578063868661cb14610d3757610491565b80633fafa127116103455780635b6b4652116102cd5780636ee8e8ef116102915780636ee8e8ef14610b8957806370084d7a14610bc657806370b0f66014610c03578063715018a614610c2c578063794d556014610c4357610491565b80635b6b465214610a575780635ced7d4014610a945780635f398a1414610ad157806360c4247f14610b0e5780636e04ff0d14610b4b57610491565b80634fac2bb7116103145780634fac2bb714610948578063535bf50f14610985578063544ffc9c146109b057806354fd4d50146109ef5780635678138814610a1a57610491565b80633fafa1271461087a57806343859632146108a5578063446a156f146108e25780634585e33b1461091f57610491565b8063156277be116103d35780633932abb1116103975780633932abb1146107815780633bccf4fd146107ac5780633be2f2a3146107e95780633e4f49e6146108125780633f3b3b271461084f57610491565b8063156277be1461066f578063160cbed7146106ac5780632656227d146106e95780632d63f693146107195780632fe3e2611461075657610491565b806306fdde031161041a57806306fdde03146105645780630cee17251461058f578063141a6c22146105b8578063148038b0146105f5578063150b7a021461063257610491565b806301ffc9a71461049657806302a251a3146104d357806303420181146104fe57806306f3f9e61461053b57610491565b36610491573073ffffffffffffffffffffffffffffffffffffffff1661046f61140e565b73ffffffffffffffffffffffffffffffffffffffff161461048f57600080fd5b005b600080fd5b3480156104a257600080fd5b506104bd60048036038101906104b89190615a0c565b61141d565b6040516104ca9190615a54565b60405180910390f35b3480156104df57600080fd5b506104e861142f565b6040516104f59190615a88565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190615ce4565b61143e565b6040516105329190615a88565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190615dc2565b611523565b005b34801561057057600080fd5b5061057961161a565b6040516105869190615e6e565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b19190615dc2565b6116ac565b005b3480156105c457600080fd5b506105df60048036038101906105da9190615f31565b61182c565b6040516105ec9190615a88565b60405180910390f35b34801561060157600080fd5b5061061c60048036038101906106179190615fd8565b611854565b6040516106299190615a88565b60405180910390f35b34801561063e57600080fd5b5061065960048036038101906106549190616018565b611879565b60405161066691906160aa565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190615dc2565b61188d565b6040516106a391906160d4565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190616356565b6118c0565b6040516106e09190615a88565b60405180910390f35b61070360048036038101906106fe9190616356565b611b7a565b6040516107109190615a88565b60405180910390f35b34801561072557600080fd5b50610740600480360381019061073b9190615dc2565b611cc7565b60405161074d9190615a88565b60405180910390f35b34801561076257600080fd5b5061076b611d35565b6040516107789190616420565b60405180910390f35b34801561078d57600080fd5b50610796611d59565b6040516107a39190615a88565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061643b565b611d68565b6040516107e09190615a88565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b91906164b6565b611df2565b005b34801561081e57600080fd5b5061083960048036038101906108349190615dc2565b61205f565b60405161084691906165b0565b60405180910390f35b34801561085b57600080fd5b50610864612071565b6040516108719190615a88565b60405180910390f35b34801561088657600080fd5b5061088f612077565b60405161089c9190615a88565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190615fd8565b61207d565b6040516108d99190615a54565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190615dc2565b6120e8565b6040516109169190616613565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190616684565b612112565b005b34801561095457600080fd5b5061096f600480360381019061096a9190615dc2565b612406565b60405161097c9190615a54565b60405180910390f35b34801561099157600080fd5b5061099a612426565b6040516109a79190615a88565b60405180910390f35b3480156109bc57600080fd5b506109d760048036038101906109d29190615dc2565b612430565b6040516109e6939291906166d1565b60405180910390f35b3480156109fb57600080fd5b50610a04612468565b604051610a119190615e6e565b60405180910390f35b348015610a2657600080fd5b50610a416004803603810190610a3c9190616708565b6124a5565b604051610a4e9190615a88565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190615dc2565b6124d6565b604051610a8b9190615a88565b60405180910390f35b348015610aa057600080fd5b50610abb6004803603810190610ab69190615dc2565b6124ee565b604051610ac89190615a88565b60405180910390f35b348015610add57600080fd5b50610af86004803603810190610af39190616748565b612506565b604051610b059190615a88565b60405180910390f35b348015610b1a57600080fd5b50610b356004803603810190610b309190615dc2565b612570565b604051610b429190615a88565b60405180910390f35b348015610b5757600080fd5b50610b726004803603810190610b6d91906167ec565b6126bc565b604051610b8092919061688a565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab91906168ba565b612776565b604051610bbd9190615a54565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be89190615dc2565b612796565b604051610bfa9190616613565b60405180910390f35b348015610c0f57600080fd5b50610c2a6004803603810190610c259190615dc2565b6127b6565b005b348015610c3857600080fd5b50610c416128ad565b005b348015610c4f57600080fd5b50610c6a6004803603810190610c659190615dc2565b6128c1565b604051610c779190615a88565b60405180910390f35b348015610c8c57600080fd5b50610ca76004803603810190610ca291906168e7565b6128d9565b604051610cb49190615a88565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf919061695b565b612941565b604051610cf19190615a88565b60405180910390f35b348015610d0657600080fd5b50610d216004803603810190610d1c9190615dc2565b6129dc565b604051610d2e9190615a54565b60405180910390f35b348015610d4357600080fd5b50610d4c612a06565b604051610d599190615a88565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d849190615dc2565b612a0c565b005b348015610d9757600080fd5b50610da0612aaf565b604051610dad91906160d4565b60405180910390f35b348015610dc257600080fd5b50610ddd6004803603810190610dd89190615dc2565b612ad9565b604051610dea9190615e6e565b60405180910390f35b348015610dff57600080fd5b50610e1a6004803603810190610e159190615dc2565b612b79565b604051610e279190615a54565b60405180910390f35b348015610e3c57600080fd5b50610e45612b99565b604051610e529190615a88565b60405180910390f35b348015610e6757600080fd5b50610e70612b9f565b604051610e7d9190615a88565b60405180910390f35b348015610e9257600080fd5b50610ead6004803603810190610ea89190616a32565b612ba8565b604051610eba9190615a88565b60405180910390f35b348015610ecf57600080fd5b50610ed8612bbe565b604051610ee59190615a88565b60405180910390f35b348015610efa57600080fd5b50610f156004803603810190610f109190616af1565b612be7565b005b348015610f2357600080fd5b50610f3e6004803603810190610f399190615dc2565b612cde565b604051610f4b9190615a88565b60405180910390f35b348015610f6057600080fd5b50610f7b6004803603810190610f769190615dc2565b612dab565b604051610f889190615e6e565b60405180910390f35b348015610f9d57600080fd5b50610fa6612e50565b604051610fb39190615a88565b60405180910390f35b348015610fc857600080fd5b50610fe36004803603810190610fde9190615dc2565b612e5f565b604051610ff09190615a88565b60405180910390f35b34801561100557600080fd5b50611020600480360381019061101b9190615dc2565b612e7c565b60405161102d9190615a88565b60405180910390f35b34801561104257600080fd5b5061105d60048036038101906110589190616b1e565b612e99565b60405161106a91906160aa565b60405180910390f35b34801561107f57600080fd5b5061109a60048036038101906110959190615dc2565b612eae565b6040516110a79190615a88565b60405180910390f35b3480156110bc57600080fd5b506110d760048036038101906110d291906168ba565b612f1c565b6040516110e49190615a54565b60405180910390f35b3480156110f957600080fd5b50611114600480360381019061110f9190616bed565b612f72565b005b34801561112257600080fd5b5061113d60048036038101906111389190616356565b6130b3565b60405161114a9190615a88565b60405180910390f35b61116d60048036038101906111689190615dc2565b6130ef565b005b34801561117b57600080fd5b5061119660048036038101906111919190615f31565b6131dc565b6040516111a39190615a88565b60405180910390f35b3480156111b857600080fd5b506111c161320a565b6040516111ce91906160d4565b60405180910390f35b3480156111e357600080fd5b506111fe60048036038101906111f99190616c61565b613234565b60405161120b9190615a88565b60405180910390f35b34801561122057600080fd5b50611229613259565b6040516112369190615e6e565b60405180910390f35b34801561124b57600080fd5b50611254613296565b6040516112619190616420565b60405180910390f35b34801561127657600080fd5b50611291600480360381019061128c9190615dc2565b6132ba565b60405161129e9190615a54565b60405180910390f35b3480156112b357600080fd5b506112ce60048036038101906112c99190615dc2565b6132e4565b005b3480156112dc57600080fd5b506112f760048036038101906112f29190616ca1565b6133db565b6040516113049190615a88565b60405180910390f35b34801561131957600080fd5b50611334600480360381019061132f9190615dc2565b6133f7565b005b34801561134257600080fd5b5061135d60048036038101906113589190616ce1565b6134ee565b60405161136a91906160aa565b60405180910390f35b34801561137f57600080fd5b5061139a600480360381019061139591906168ba565b613503565b005b3480156113a857600080fd5b506113c360048036038101906113be9190615dc2565b613586565b6040516113d09190615a88565b60405180910390f35b3480156113e557600080fd5b506113ee613598565b6040516113fb9190616dd7565b60405180910390f35b61140c6135bc565b005b60006114186139f0565b905090565b600061142882613a1a565b9050919050565b6000611439613a94565b905090565b6000806114c16114b97fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c60405161147a929190616e22565b60405180910390208b8051906020012060405160200161149e959493929190616e4a565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b90506115148a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613ae3565b91505098975050505050505050565b61152b61140e565b73ffffffffffffffffffffffffffffffffffffffff16611549613c9f565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166115be61140e565b73ffffffffffffffffffffffffffffffffffffffff161461160e5760006115e3613ca7565b6040516115f1929190616e22565b604051809103902090505b806116076002613cb4565b036115fc57505b61161781613d90565b50565b60606000805461162990616f38565b80601f016020809104026020016040519081016040528092919081815260200182805461165590616f38565b80156116a25780601f10611677576101008083540402835291602001916116a2565b820191906000526020600020905b81548152906001019060200180831161168557829003601f168201915b5050505050905090565b600260038111156116c0576116bf616539565b5b601b600083815260200190815260200160002060009054906101000a900460ff1660038111156116f3576116f2616539565b5b036117f75760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060003373ffffffffffffffffffffffffffffffffffffffff168260405161177390616f8f565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50509050806117f0576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611829565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b600060148260405161183e9190616fe0565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806118cf868686866130b3565b9050600460078111156118e5576118e4616539565b5b6118ee8261205f565b6007811115611900576118ff616539565b5b14611940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193790617069565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d3919061709e565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611a3995949392919061739b565b602060405180830381865afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a9190617418565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611af796959493929190617445565b600060405180830381600087803b158015611b1157600080fd5b505af1158015611b25573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611b5791906174ea565b604051611b6592919061751e565b60405180910390a18192505050949350505050565b600080611b89868686866130b3565b90506000611b968261205f565b905060046007811115611bac57611bab616539565b5b816007811115611bbf57611bbe616539565b5b1480611bef575060056007811115611bda57611bd9616539565b5b816007811115611bed57611bec616539565b5b145b611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2590617069565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611c8b9190615a88565b60405180910390a1611ca08288888888613f44565b611cad8288888888614027565b611cba828888888861403b565b8192505050949350505050565b6000611d24600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6000611d636140a4565b905090565b600080611dc9611dc17f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001611da693929190617547565b60405160208183030381529060405280519060200120613a9e565b868686613ab8565b9050611de6878288604051806020016040528060008152506140ae565b91505095945050505050565b611dfa6140ce565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e7d576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115611ee157611ee0616539565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d54601485604051611f2d9190616fe0565b9081526020016040518091039020819055508360156000600d5481526020019081526020016000209081611f619190617720565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d6000815480929190612054906177f2565b919050555050505050565b600061206a8261414c565b9050919050565b600e5481565b600d5481565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b600061212c604051806020016040528060008152506126bc565b50905080612166576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600060196000600d54815260200190815260200160002060006101000a81548160ff02191690831515021790555060186000600d5481526020019081526020016000205460176000600d548152602001908152602001600020541115612393576001601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561222d5761222c616539565b5b021790555060006064600f5460176000600d54815260200190815260200160002054612259919061783a565b61226391906178ab565b90506000601a6000600d54815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516122c090616f8f565b60006040518083038185875af1925050503d80600081146122fd576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b606091505b505090508061235d5760176000600d548152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016123549190615a88565b60405180910390fd5b600d547f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a25050612401565b6002601b6000600d54815260200190815260200160002060006101000a81548160ff021916908360038111156123cc576123cb616539565b5b0217905550600d547f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806124b0613c9f565b90506124cd848285604051806020016040528060008152506140ae565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b600080612511613c9f565b905061256487828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613ae3565b91505095945050505050565b600080600960000180549050905060008103612591576008549150506126b7565b600060096000016001836125a591906178dc565b815481106125b6576125b5617910565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161269e5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506126b7565b6126b284600961431f90919063ffffffff16565b925050505b919050565b6000606060116000600d54815260200190815260200160002060009054906101000a900460ff16801561276f575060126000600d548152602001908152602001600020600060136000600d5481526020019081526020016000205481526020019081526020016000205460126000600d548152602001908152602001600020600060136000600d548152602001908152602001600020548152602001908152602001600020544261276d91906178dc565b115b9150915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b6127be61140e565b73ffffffffffffffffffffffffffffffffffffffff166127dc613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661285161140e565b73ffffffffffffffffffffffffffffffffffffffff16146128a1576000612876613ca7565b604051612884929190616e22565b604051809103902090505b8061289a6002613cb4565b0361288f57505b6128aa81614477565b50565b6128b56140ce565b6128bf60006144bc565b565b60176020528060005260406000206000915090505481565b6000806128e4613c9f565b905061293686828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506140ae565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166129c6576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129d285858585614582565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612a146140ce565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612aa757612aa6616539565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612af890616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2490616f38565b8015612b715780601f10612b4657610100808354040283529160200191612b71565b820191906000526020600020905b815481529060010190602001808311612b5457829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612bb5848484614889565b90509392505050565b60008060096000018054905014612bde57612bd96009613902565b612be2565b6008545b905090565b612bef61140e565b73ffffffffffffffffffffffffffffffffffffffff16612c0d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612c8261140e565b73ffffffffffffffffffffffffffffffffffffffff1614612cd2576000612ca7613ca7565b604051612cb5929190616e22565b604051809103902090505b80612ccb6002613cb4565b03612cc057505b612cdb81614930565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b8152600401612d4f9190616420565b602060405180830381865afa158015612d6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d90919061709e565b905060018114612da05780612da3565b60005b915050919050565b6060601560008381526020019081526020016000208054612dcb90616f38565b80601f0160208091040260200160405190810160405280929190818152602001828054612df790616f38565b8015612e445780601f10612e1957610100808354040283529160200191612e44565b820191906000526020600020905b815481529060010190602001808311612e2757829003601f168201915b50505050509050919050565b6000612e5a6149cf565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000612f0b600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612f7a61140e565b73ffffffffffffffffffffffffffffffffffffffff16612f98613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661300d61140e565b73ffffffffffffffffffffffffffffffffffffffff161461305d576000613032613ca7565b604051613040929190616e22565b604051809103902090505b806130566002613cb4565b0361304b57505b6130ac8483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050856149d9565b5050505050565b6000848484846040516020016130cc949392919061793f565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff16613147576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a791906174ea565b92505081905550346017600084815260200190815260200160002060008282546131d191906174ea565b925050819055505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6132ec61140e565b73ffffffffffffffffffffffffffffffffffffffff1661330a613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335790616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661337f61140e565b73ffffffffffffffffffffffffffffffffffffffff16146133cf5760006133a4613ca7565b6040516133b2929190616e22565b604051809103902090505b806133c86002613cb4565b036133bd57505b6133d881614a08565b50565b60006133ef83836133ea614a90565b614889565b905092915050565b6133ff61140e565b73ffffffffffffffffffffffffffffffffffffffff1661341d613c9f565b73ffffffffffffffffffffffffffffffffffffffff1614613473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346a90616ee9565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1661349261140e565b73ffffffffffffffffffffffffffffffffffffffff16146134e25760006134b7613ca7565b6040516134c5929190616e22565b604051809103902090505b806134db6002613cb4565b036134d057505b6134eb81614aa7565b50565b600063f23a6e6160e01b905095945050505050565b61350b6140ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361357a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357190617a0b565b60405180910390fd5b613583816144bc565b50565b600061359182614aec565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010543410156135f8576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156136f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ef90617a9d565b60405180910390fd5b819050919050565b600080600084600001805490509050600061371a86613902565b90506000821180156137705750438660000160018461373991906178dc565b8154811061374a57613749617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156138005761377e85613695565b8660000160018461378f91906178dc565b815481106137a05761379f617910565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506138f3565b8560000160405180604001604052806138184361399d565b63ffffffff16815260200161382c88613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613974578260000160018261392891906178dc565b8154811061393957613938617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613977565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff80168211156139e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139df90617b2f565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a8d5750613a8c82614bb4565b5b9050919050565b6000600554905090565b6000613ab1613aab614d19565b83614e33565b9050919050565b6000806000613ac987878787614e66565b91509150613ad681614f72565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613b0f57613b0e616539565b5b613b188861205f565b6007811115613b2a57613b29616539565b5b14613b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6190617bc1565b60405180910390fd5b6000613bc987613bb9846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050614096565b67ffffffffffffffff1686614889565b9050613bd8888888848861513e565b6000845103613c3a578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051613c2d9493929190617be1565b60405180910390a2613c91565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128988848989604051613c88959493929190617c2d565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b6000613cbf82615342565b15613cf6576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b613d98612b9f565b811115613dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd190617d26565b60405180910390fd5b6000613de4612bbe565b905060008114158015613dff57506000600960000180549050145b15613ef15760096000016040518060400160405280600063ffffffff168152602001613e2a84613695565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b613f0582600961370090919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051613f3892919061751e565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff16613f6361140e565b73ffffffffffffffffffffffffffffffffffffffff16146140205760005b845181101561401e573073ffffffffffffffffffffffffffffffffffffffff16858281518110613fb457613fb3617910565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361400d5761400c838281518110613fed57613fec617910565b5b602002602001015180519060200120600261537790919063ffffffff16565b5b80614017906177f2565b9050613f81565b505b5050505050565b61403485858585856153f3565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff1661405a61140e565b73ffffffffffffffffffffffffffffffffffffffff161461408f5761407f6002615342565b61408e5761408d6002615491565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006140c4858585856140bf614a90565b613ae3565b9050949350505050565b6140d6613c9f565b73ffffffffffffffffffffffffffffffffffffffff166140f4612aaf565b73ffffffffffffffffffffffffffffffffffffffff161461414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161414190617d92565b60405180910390fd5b565b60008061415883615512565b90506004600781111561416e5761416d616539565b5b81600781111561418157614180616539565b5b1461418f578091505061431a565b6000600b60008581526020019081526020016000205490506000801b81036141bb57819250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b81526004016142169190616420565b602060405180830381865afa158015614233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142579190617dde565b156142675760079250505061431a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016142c29190616420565b602060405180830381865afa1580156142df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143039190617dde565b156143135760059250505061431a565b6002925050505b919050565b6000438210614363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435a90617e57565b60405180910390fd5b60008360000180549050905060005b818110156143e75760006143868284615626565b90508486600001828154811061439f5761439e617910565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156143d1578092506143e1565b6001816143de91906174ea565b91505b50614372565b6000821461444c578460000160018361440091906178dc565b8154811061441157614410617910565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661444f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516144aa92919061751e565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061458c612e50565b6145a9614597613c9f565b6001436145a491906178dc565b6133db565b10156145ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145e190617ee9565b60405180910390fd5b60006145ff86868686805190602001206130b3565b90508451865114614645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161463c90617f7b565b60405180910390fd5b8351865114614689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161468090617f7b565b60405180910390fd5b60008651116146cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146c490617fe7565b60405180910390fd5b600060016000838152602001908152602001600020905061472d816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505061564c565b61476c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161476390618079565b60405180910390fd5b600061477e614779611d59565b615666565b61478743615666565b61479191906180ad565b905060006147a56147a061142f565b615666565b826147b091906180ad565b90506147c882846000016156bd90919063ffffffff16565b6147de81846001016156bd90919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614808613c9f565b8b8b8d5167ffffffffffffffff81111561482557614824615b83565b5b60405190808252806020026020018201604052801561485857816020015b60608152602001906001900390816148435790505b508c88888e60405161487299989796959493929190618226565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b81526004016148e69291906182d6565b602060405180830381865afa158015614903573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614927919061709e565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516149839291906182ff565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b60606149ff848484604051806060016040528060298152602001618a5b602991396156ec565b90509392505050565b60008111614a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a429061839a565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614a7e92919061751e565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614ada92919061751e565b60405180910390a18060068190555050565b6000614af6612b9f565b614aff83612570565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614b589190615a88565b602060405180830381865afa158015614b75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b99919061709e565b614ba3919061783a565b614bad91906178ab565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480614c9a57507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d0257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80614d125750614d1182615800565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015614d9557507f000000000000000000000000000000000000000000000000000000000000000046145b15614dc2577f00000000000000000000000000000000000000000000000000000000000000009050614e30565b614e2d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061586a565b90505b90565b60008282604051602001614e48929190618427565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115614ea1576000600391509150614f69565b601b8560ff1614158015614eb95750601c8560ff1614155b15614ecb576000600491509150614f69565b600060018787878760405160008152602001604052604051614ef0949392919061845e565b6020604051602081039080840390855afa158015614f12573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603614f6057600060019250925050614f69565b80600092509250505b94509492505050565b60006004811115614f8657614f85616539565b5b816004811115614f9957614f98616539565b5b031561513b5760016004811115614fb357614fb2616539565b5b816004811115614fc657614fc5616539565b5b03615006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614ffd906184ef565b60405180910390fd5b6002600481111561501a57615019616539565b5b81600481111561502d5761502c616539565b5b0361506d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150649061855b565b60405180910390fd5b6003600481111561508157615080616539565b5b81600481111561509457615093616539565b5b036150d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016150cb906185ed565b60405180910390fd5b6004808111156150e7576150e6616539565b5b8160048111156150fa576150f9616539565b5b0361513a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151319061867f565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156151e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016151db90618711565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561525257615251616539565b5b60ff168460ff160361527e578281600001600082825461527291906174ea565b9250508190555061533a565b6001600281111561529257615291616539565b5b60ff168460ff16036152be57828160010160008282546152b291906174ea565b92505081905550615339565b6002808111156152d1576152d0616539565b5b60ff168460ff16036152fd57828160020160008282546152f191906174ea565b92505081905550615338565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161532f906187a3565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b815260040161545895949392919061739b565b6000604051808303818588803b15801561547157600080fd5b505af1158015615485573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff161561554b576007915050615621565b8060020160019054906101000a900460ff161561556c576002915050615621565b600061557784611cc7565b9050600081036155bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016155b39061880f565b60405180910390fd5b4381106155ce57600092505050615621565b60006155d985612eae565b90504381106155ee5760019350505050615621565b6155f7856158a4565b80156156085750615607856158eb565b5b156156195760049350505050615621565b600393505050505b919050565b6000600282841861563791906178ab565b82841661564491906174ea565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff80168211156156b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016156ac906188a1565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161572890618933565b60405180910390fd5b61573a85615916565b615779576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016157709061899f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516157a291906189f0565b60006040518083038185875af1925050503d80600081146157df576040519150601f19603f3d011682016040523d82523d6000602084013e6157e4565b606091505b50915091506157f4828286615939565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615885959493929190618a07565b6040516020818303038152906040528051906020012090509392505050565b600080600760008481526020019081526020016000209050806002015481600101546158d091906174ea565b6158e16158dc85611cc7565b613586565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561594957829050615999565b60008351111561595c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159909190615e6e565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6159e9816159b4565b81146159f457600080fd5b50565b600081359050615a06816159e0565b92915050565b600060208284031215615a2257615a216159aa565b5b6000615a30848285016159f7565b91505092915050565b60008115159050919050565b615a4e81615a39565b82525050565b6000602082019050615a696000830184615a45565b92915050565b6000819050919050565b615a8281615a6f565b82525050565b6000602082019050615a9d6000830184615a79565b92915050565b615aac81615a6f565b8114615ab757600080fd5b50565b600081359050615ac981615aa3565b92915050565b600060ff82169050919050565b615ae581615acf565b8114615af057600080fd5b50565b600081359050615b0281615adc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615b2d57615b2c615b08565b5b8235905067ffffffffffffffff811115615b4a57615b49615b0d565b5b602083019150836001820283011115615b6657615b65615b12565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615bbb82615b72565b810181811067ffffffffffffffff82111715615bda57615bd9615b83565b5b80604052505050565b6000615bed6159a0565b9050615bf98282615bb2565b919050565b600067ffffffffffffffff821115615c1957615c18615b83565b5b615c2282615b72565b9050602081019050919050565b82818337600083830152505050565b6000615c51615c4c84615bfe565b615be3565b905082815260208101848484011115615c6d57615c6c615b6d565b5b615c78848285615c2f565b509392505050565b600082601f830112615c9557615c94615b08565b5b8135615ca5848260208601615c3e565b91505092915050565b6000819050919050565b615cc181615cae565b8114615ccc57600080fd5b50565b600081359050615cde81615cb8565b92915050565b60008060008060008060008060e0898b031215615d0457615d036159aa565b5b6000615d128b828c01615aba565b9850506020615d238b828c01615af3565b975050604089013567ffffffffffffffff811115615d4457615d436159af565b5b615d508b828c01615b17565b9650965050606089013567ffffffffffffffff811115615d7357615d726159af565b5b615d7f8b828c01615c80565b9450506080615d908b828c01615af3565b93505060a0615da18b828c01615ccf565b92505060c0615db28b828c01615ccf565b9150509295985092959890939650565b600060208284031215615dd857615dd76159aa565b5b6000615de684828501615aba565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015615e29578082015181840152602081019050615e0e565b60008484015250505050565b6000615e4082615def565b615e4a8185615dfa565b9350615e5a818560208601615e0b565b615e6381615b72565b840191505092915050565b60006020820190508181036000830152615e888184615e35565b905092915050565b600067ffffffffffffffff821115615eab57615eaa615b83565b5b615eb482615b72565b9050602081019050919050565b6000615ed4615ecf84615e90565b615be3565b905082815260208101848484011115615ef057615eef615b6d565b5b615efb848285615c2f565b509392505050565b600082601f830112615f1857615f17615b08565b5b8135615f28848260208601615ec1565b91505092915050565b600060208284031215615f4757615f466159aa565b5b600082013567ffffffffffffffff811115615f6557615f646159af565b5b615f7184828501615f03565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615fa582615f7a565b9050919050565b615fb581615f9a565b8114615fc057600080fd5b50565b600081359050615fd281615fac565b92915050565b60008060408385031215615fef57615fee6159aa565b5b6000615ffd85828601615aba565b925050602061600e85828601615fc3565b9150509250929050565b60008060008060808587031215616032576160316159aa565b5b600061604087828801615fc3565b945050602061605187828801615fc3565b935050604061606287828801615aba565b925050606085013567ffffffffffffffff811115616083576160826159af565b5b61608f87828801615c80565b91505092959194509250565b6160a4816159b4565b82525050565b60006020820190506160bf600083018461609b565b92915050565b6160ce81615f9a565b82525050565b60006020820190506160e960008301846160c5565b92915050565b600067ffffffffffffffff82111561610a57616109615b83565b5b602082029050602081019050919050565b600061612e616129846160ef565b615be3565b9050808382526020820190506020840283018581111561615157616150615b12565b5b835b8181101561617a57806161668882615fc3565b845260208401935050602081019050616153565b5050509392505050565b600082601f83011261619957616198615b08565b5b81356161a984826020860161611b565b91505092915050565b600067ffffffffffffffff8211156161cd576161cc615b83565b5b602082029050602081019050919050565b60006161f16161ec846161b2565b615be3565b9050808382526020820190506020840283018581111561621457616213615b12565b5b835b8181101561623d57806162298882615aba565b845260208401935050602081019050616216565b5050509392505050565b600082601f83011261625c5761625b615b08565b5b813561626c8482602086016161de565b91505092915050565b600067ffffffffffffffff8211156162905761628f615b83565b5b602082029050602081019050919050565b60006162b46162af84616275565b615be3565b905080838252602082019050602084028301858111156162d7576162d6615b12565b5b835b8181101561631e57803567ffffffffffffffff8111156162fc576162fb615b08565b5b8086016163098982615c80565b855260208501945050506020810190506162d9565b5050509392505050565b600082601f83011261633d5761633c615b08565b5b813561634d8482602086016162a1565b91505092915050565b600080600080608085870312156163705761636f6159aa565b5b600085013567ffffffffffffffff81111561638e5761638d6159af565b5b61639a87828801616184565b945050602085013567ffffffffffffffff8111156163bb576163ba6159af565b5b6163c787828801616247565b935050604085013567ffffffffffffffff8111156163e8576163e76159af565b5b6163f487828801616328565b925050606061640587828801615ccf565b91505092959194509250565b61641a81615cae565b82525050565b60006020820190506164356000830184616411565b92915050565b600080600080600060a08688031215616457576164566159aa565b5b600061646588828901615aba565b955050602061647688828901615af3565b945050604061648788828901615af3565b935050606061649888828901615ccf565b92505060806164a988828901615ccf565b9150509295509295909350565b600080600080608085870312156164d0576164cf6159aa565b5b600085013567ffffffffffffffff8111156164ee576164ed6159af565b5b6164fa87828801615f03565b945050602061650b87828801615aba565b935050604061651c87828801615aba565b925050606061652d87828801615fc3565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6008811061657957616578616539565b5b50565b600081905061658a82616568565b919050565b600061659a8261657c565b9050919050565b6165aa8161658f565b82525050565b60006020820190506165c560008301846165a1565b92915050565b600481106165dc576165db616539565b5b50565b60008190506165ed826165cb565b919050565b60006165fd826165df565b9050919050565b61660d816165f2565b82525050565b60006020820190506166286000830184616604565b92915050565b60008083601f84011261664457616643615b08565b5b8235905067ffffffffffffffff81111561666157616660615b0d565b5b60208301915083600182028301111561667d5761667c615b12565b5b9250929050565b6000806020838503121561669b5761669a6159aa565b5b600083013567ffffffffffffffff8111156166b9576166b86159af565b5b6166c58582860161662e565b92509250509250929050565b60006060820190506166e66000830186615a79565b6166f36020830185615a79565b6167006040830184615a79565b949350505050565b6000806040838503121561671f5761671e6159aa565b5b600061672d85828601615aba565b925050602061673e85828601615af3565b9150509250929050565b600080600080600060808688031215616764576167636159aa565b5b600061677288828901615aba565b955050602061678388828901615af3565b945050604086013567ffffffffffffffff8111156167a4576167a36159af565b5b6167b088828901615b17565b9350935050606086013567ffffffffffffffff8111156167d3576167d26159af565b5b6167df88828901615c80565b9150509295509295909350565b600060208284031215616802576168016159aa565b5b600082013567ffffffffffffffff8111156168205761681f6159af565b5b61682c84828501615c80565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061685c82616835565b6168668185616840565b9350616876818560208601615e0b565b61687f81615b72565b840191505092915050565b600060408201905061689f6000830185615a45565b81810360208301526168b18184616851565b90509392505050565b6000602082840312156168d0576168cf6159aa565b5b60006168de84828501615fc3565b91505092915050565b60008060008060608587031215616901576169006159aa565b5b600061690f87828801615aba565b945050602061692087828801615af3565b935050604085013567ffffffffffffffff811115616941576169406159af565b5b61694d87828801615b17565b925092505092959194509250565b60008060008060808587031215616975576169746159aa565b5b600085013567ffffffffffffffff811115616993576169926159af565b5b61699f87828801616184565b945050602085013567ffffffffffffffff8111156169c0576169bf6159af565b5b6169cc87828801616247565b935050604085013567ffffffffffffffff8111156169ed576169ec6159af565b5b6169f987828801616328565b925050606085013567ffffffffffffffff811115616a1a57616a196159af565b5b616a2687828801615f03565b91505092959194509250565b600080600060608486031215616a4b57616a4a6159aa565b5b6000616a5986828701615fc3565b9350506020616a6a86828701615aba565b925050604084013567ffffffffffffffff811115616a8b57616a8a6159af565b5b616a9786828701615c80565b9150509250925092565b6000616aac82615f7a565b9050919050565b6000616abe82616aa1565b9050919050565b616ace81616ab3565b8114616ad957600080fd5b50565b600081359050616aeb81616ac5565b92915050565b600060208284031215616b0757616b066159aa565b5b6000616b1584828501616adc565b91505092915050565b600080600080600060a08688031215616b3a57616b396159aa565b5b6000616b4888828901615fc3565b9550506020616b5988828901615fc3565b945050604086013567ffffffffffffffff811115616b7a57616b796159af565b5b616b8688828901616247565b935050606086013567ffffffffffffffff811115616ba757616ba66159af565b5b616bb388828901616247565b925050608086013567ffffffffffffffff811115616bd457616bd36159af565b5b616be088828901615c80565b9150509295509295909350565b60008060008060608587031215616c0757616c066159aa565b5b6000616c1587828801615fc3565b9450506020616c2687828801615aba565b935050604085013567ffffffffffffffff811115616c4757616c466159af565b5b616c538782880161662e565b925092505092959194509250565b60008060408385031215616c7857616c776159aa565b5b6000616c8685828601615aba565b9250506020616c9785828601615aba565b9150509250929050565b60008060408385031215616cb857616cb76159aa565b5b6000616cc685828601615fc3565b9250506020616cd785828601615aba565b9150509250929050565b600080600080600060a08688031215616cfd57616cfc6159aa565b5b6000616d0b88828901615fc3565b9550506020616d1c88828901615fc3565b9450506040616d2d88828901615aba565b9350506060616d3e88828901615aba565b925050608086013567ffffffffffffffff811115616d5f57616d5e6159af565b5b616d6b88828901615c80565b9150509295509295909350565b6000819050919050565b6000616d9d616d98616d9384615f7a565b616d78565b615f7a565b9050919050565b6000616daf82616d82565b9050919050565b6000616dc182616da4565b9050919050565b616dd181616db6565b82525050565b6000602082019050616dec6000830184616dc8565b92915050565b600081905092915050565b6000616e098385616df2565b9350616e16838584615c2f565b82840190509392505050565b6000616e2f828486616dfd565b91508190509392505050565b616e4481615acf565b82525050565b600060a082019050616e5f6000830188616411565b616e6c6020830187615a79565b616e796040830186616e3b565b616e866060830185616411565b616e936080830184616411565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b6000616ed3601883615dfa565b9150616ede82616e9d565b602082019050919050565b60006020820190508181036000830152616f0281616ec6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680616f5057607f821691505b602082108103616f6357616f62616f09565b5b50919050565b50565b6000616f79600083616df2565b9150616f8482616f69565b600082019050919050565b6000616f9a82616f6c565b9150819050919050565b600081905092915050565b6000616fba82615def565b616fc48185616fa4565b9350616fd4818560208601615e0b565b80840191505092915050565b6000616fec8284616faf565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b6000617053602183615dfa565b915061705e82616ff7565b604082019050919050565b6000602082019050818103600083015261708281617046565b9050919050565b60008151905061709881615aa3565b92915050565b6000602082840312156170b4576170b36159aa565b5b60006170c284828501617089565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61710081615f9a565b82525050565b600061711283836170f7565b60208301905092915050565b6000602082019050919050565b6000617136826170cb565b61714081856170d6565b935061714b836170e7565b8060005b8381101561717c5781516171638882617106565b975061716e8361711e565b92505060018101905061714f565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6171be81615a6f565b82525050565b60006171d083836171b5565b60208301905092915050565b6000602082019050919050565b60006171f482617189565b6171fe8185617194565b9350617209836171a5565b8060005b8381101561723a57815161722188826171c4565b975061722c836171dc565b92505060018101905061720d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061728f82616835565b6172998185617273565b93506172a9818560208601615e0b565b6172b281615b72565b840191505092915050565b60006172c98383617284565b905092915050565b6000602082019050919050565b60006172e982617247565b6172f38185617252565b93508360208202850161730585617263565b8060005b85811015617341578484038952815161732285826172bd565b945061732d836172d1565b925060208a01995050600181019050617309565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061738561738061737b84617353565b61735d565b615cae565b9050919050565b6173958161736a565b82525050565b600060a08201905081810360008301526173b5818861712b565b905081810360208301526173c981876171e9565b905081810360408301526173dd81866172de565b90506173ec606083018561738c565b6173f96080830184616411565b9695505050505050565b60008151905061741281615cb8565b92915050565b60006020828403121561742e5761742d6159aa565b5b600061743c84828501617403565b91505092915050565b600060c082019050818103600083015261745f818961712b565b9050818103602083015261747381886171e9565b9050818103604083015261748781876172de565b9050617496606083018661738c565b6174a36080830185616411565b6174b060a0830184615a79565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006174f582615a6f565b915061750083615a6f565b9250828201905080821115617518576175176174bb565b5b92915050565b60006040820190506175336000830185615a79565b6175406020830184615a79565b9392505050565b600060608201905061755c6000830186616411565b6175696020830185615a79565b6175766040830184616e3b565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026175e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826175a3565b6175ea86836175a3565b95508019841693508086168417925050509392505050565b600061761d61761861761384615a6f565b616d78565b615a6f565b9050919050565b6000819050919050565b61763783617602565b61764b61764382617624565b8484546175b0565b825550505050565b600090565b617660617653565b61766b81848461762e565b505050565b5b8181101561768f57617684600082617658565b600181019050617671565b5050565b601f8211156176d4576176a58161757e565b6176ae84617593565b810160208510156176bd578190505b6176d16176c985617593565b830182617670565b50505b505050565b600082821c905092915050565b60006176f7600019846008026176d9565b1980831691505092915050565b600061771083836176e6565b9150826002028217905092915050565b61772982615def565b67ffffffffffffffff81111561774257617741615b83565b5b61774c8254616f38565b617757828285617693565b600060209050601f83116001811461778a5760008415617778578287015190505b6177828582617704565b8655506177ea565b601f1984166177988661757e565b60005b828110156177c05784890151825560018201915060208501945060208101905061779b565b868310156177dd57848901516177d9601f8916826176e6565b8355505b6001600288020188555050505b505050505050565b60006177fd82615a6f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361782f5761782e6174bb565b5b600182019050919050565b600061784582615a6f565b915061785083615a6f565b925082820261785e81615a6f565b91508282048414831517617875576178746174bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006178b682615a6f565b91506178c183615a6f565b9250826178d1576178d061787c565b5b828204905092915050565b60006178e782615a6f565b91506178f283615a6f565b925082820390508181111561790a576179096174bb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006080820190508181036000830152617959818761712b565b9050818103602083015261796d81866171e9565b9050818103604083015261798181856172de565b90506179906060830184616411565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006179f5602683615dfa565b9150617a0082617999565b604082019050919050565b60006020820190508181036000830152617a24816179e8565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617a87602783615dfa565b9150617a9282617a2b565b604082019050919050565b60006020820190508181036000830152617ab681617a7a565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000617b19602683615dfa565b9150617b2482617abd565b604082019050919050565b60006020820190508181036000830152617b4881617b0c565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b6000617bab602383615dfa565b9150617bb682617b4f565b604082019050919050565b60006020820190508181036000830152617bda81617b9e565b9050919050565b6000608082019050617bf66000830187615a79565b617c036020830186616e3b565b617c106040830185615a79565b8181036060830152617c228184615e35565b905095945050505050565b600060a082019050617c426000830188615a79565b617c4f6020830187616e3b565b617c5c6040830186615a79565b8181036060830152617c6e8185615e35565b90508181036080830152617c828184616851565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000617d10604383615dfa565b9150617d1b82617c8e565b606082019050919050565b60006020820190508181036000830152617d3f81617d03565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000617d7c602083615dfa565b9150617d8782617d46565b602082019050919050565b60006020820190508181036000830152617dab81617d6f565b9050919050565b617dbb81615a39565b8114617dc657600080fd5b50565b600081519050617dd881617db2565b92915050565b600060208284031215617df457617df36159aa565b5b6000617e0284828501617dc9565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b6000617e41602083615dfa565b9150617e4c82617e0b565b602082019050919050565b60006020820190508181036000830152617e7081617e34565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b6000617ed3603183615dfa565b9150617ede82617e77565b604082019050919050565b60006020820190508181036000830152617f0281617ec6565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b6000617f65602183615dfa565b9150617f7082617f09565b604082019050919050565b60006020820190508181036000830152617f9481617f58565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b6000617fd1601883615dfa565b9150617fdc82617f9b565b602082019050919050565b6000602082019050818103600083015261800081617fc4565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000618063602183615dfa565b915061806e82618007565b604082019050919050565b6000602082019050818103600083015261809281618056565b9050919050565b600067ffffffffffffffff82169050919050565b60006180b882618099565b91506180c383618099565b9250828201905067ffffffffffffffff8111156180e3576180e26174bb565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061813182615def565b61813b8185618115565b935061814b818560208601615e0b565b61815481615b72565b840191505092915050565b600061816b8383618126565b905092915050565b6000602082019050919050565b600061818b826180e9565b61819581856180f4565b9350836020820285016181a785618105565b8060005b858110156181e357848403895281516181c4858261815f565b94506181cf83618173565b925060208a019950506001810190506181ab565b50829750879550505050505092915050565b600061821061820b61820684618099565b616d78565b615a6f565b9050919050565b618220816181f5565b82525050565b60006101208201905061823c600083018c615a79565b618249602083018b6160c5565b818103604083015261825b818a61712b565b9050818103606083015261826f81896171e9565b905081810360808301526182838188618180565b905081810360a083015261829781876172de565b90506182a660c0830186618217565b6182b360e0830185618217565b8181036101008301526182c68184615e35565b90509a9950505050505050505050565b60006040820190506182eb60008301856160c5565b6182f86020830184615a79565b9392505050565b600060408201905061831460008301856160c5565b61832160208301846160c5565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b6000618384602783615dfa565b915061838f82618328565b604082019050919050565b600060208201905081810360008301526183b381618377565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006183f0600283616fa4565b91506183fb826183ba565b600282019050919050565b6000819050919050565b61842161841c82615cae565b618406565b82525050565b6000618432826183e3565b915061843e8285618410565b60208201915061844e8284618410565b6020820191508190509392505050565b60006080820190506184736000830187616411565b6184806020830186616e3b565b61848d6040830185616411565b61849a6060830184616411565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006184d9601883615dfa565b91506184e4826184a3565b602082019050919050565b60006020820190508181036000830152618508816184cc565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618545601f83615dfa565b91506185508261850f565b602082019050919050565b6000602082019050818103600083015261857481618538565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006185d7602283615dfa565b91506185e28261857b565b604082019050919050565b60006020820190508181036000830152618606816185ca565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618669602283615dfa565b91506186748261860d565b604082019050919050565b600060208201905081810360008301526186988161865c565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b60006186fb602783615dfa565b91506187068261869f565b604082019050919050565b6000602082019050818103600083015261872a816186ee565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b600061878d603583615dfa565b915061879882618731565b604082019050919050565b600060208201905081810360008301526187bc81618780565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b60006187f9601d83615dfa565b9150618804826187c3565b602082019050919050565b60006020820190508181036000830152618828816187ec565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b600061888b602683615dfa565b91506188968261882f565b604082019050919050565b600060208201905081810360008301526188ba8161887e565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061891d602683615dfa565b9150618928826188c1565b604082019050919050565b6000602082019050818103600083015261894c81618910565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618989601d83615dfa565b915061899482618953565b602082019050919050565b600060208201905081810360008301526189b88161897c565b9050919050565b60006189ca82616835565b6189d48185616df2565b93506189e4818560208601615e0b565b80840191505092915050565b60006189fc82846189bf565b915081905092915050565b600060a082019050618a1c6000830188616411565b618a296020830187616411565b618a366040830186616411565b618a436060830185615a79565b618a5060808301846160c5565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220dd4edfac69a6afd6aeac0d468ddba6cc40c7263f1a78654ed0f9586c5980bfef64736f6c63430008110033", + "solcInputHash": "9bb96e2ab1a2d14e7d6f1254972fa73c", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"contract TimelockController\",\"name\":\"_timelock\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDelay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_votingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_quorumPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enteranceFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_daoPercentage\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Empty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__EnteranceFeeNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotApporovedByDao\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__NotEnoughPayment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"FundProject__TransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__UpkeepNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__WithdrawTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FundProject__withdrawFund\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GovernerContract__NeedEnteranceFee\",\"type\":\"error\"},{\"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\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"string[]\",\"name\":\"signatures\",\"type\":\"string[]\"},{\"indexed\":false,\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endBlock\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eta\",\"type\":\"uint256\"}],\"name\":\"ProposalQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"ProposalThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldQuorumNumerator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"QuorumNumeratorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldTimelock\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"TimelockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"VoteCast\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"VoteCastWithParams\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingDelay\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"VotingDelaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldVotingPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"VotingPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_projectOwner\",\"type\":\"address\"}],\"name\":\"enteranceFeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectFundingFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectGoesToFunding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_projectId\",\"type\":\"uint256\"}],\"name\":\"projectSuccessfullyFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"__investor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"__projectId\",\"type\":\"uint256\"}],\"name\":\"withdrawFundSuccessfully\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"COUNTING_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXTENDED_BALLOT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_ProjectFundingStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getBalanceOfProject\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_getHashOfProjectData\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"}],\"name\":\"_getProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"_getProjectStatus\",\"outputs\":[{\"internalType\":\"enum FundProject.ProjectFundingStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"_isApporoveFundingByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isApporovedByDao\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"_isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_isFunding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_ipfsHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_fundingGoalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_projectOwnerAddress\",\"type\":\"address\"}],\"name\":\"apporoveFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"cancelApporovelFundingByDao\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"}],\"name\":\"castVote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"castVoteWithReason\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"castVoteWithReasonAndParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"support\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"castVoteWithReasonAndParamsBySig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"daoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projecID\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"funders\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDaoPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEnteranceFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"getFunderBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"investor\",\"type\":\"address\"}],\"name\":\"getInvestedProjects\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"getTimeleft\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"params\",\"type\":\"bytes\"}],\"name\":\"getVotesWithParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"hashProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"hashToProjectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"idToHash\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"investedProjects\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isEnteranceFeePaid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"is_funding\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeStamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paySubmitFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"performUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFundingGoalAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"projectId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectOwnerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"projectToTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalEta\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposalThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"proposalVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"againstVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"forVotes\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"abstainVotes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"propose\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"calldatas\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"descriptionHash\",\"type\":\"bytes32\"}],\"name\":\"queue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"relay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newProposalThreshold\",\"type\":\"uint256\"}],\"name\":\"setProposalThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingDelay\",\"type\":\"uint256\"}],\"name\":\"setVotingDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newVotingPeriod\",\"type\":\"uint256\"}],\"name\":\"setVotingPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalId\",\"type\":\"uint256\"}],\"name\":\"state\",\"outputs\":[{\"internalType\":\"enum IGovernor.ProposalState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"time\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelock\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IVotes\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newQuorumNumerator\",\"type\":\"uint256\"}],\"name\":\"updateQuorumNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TimelockController\",\"name\":\"newTimelock\",\"type\":\"address\"}],\"name\":\"updateTimelock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_projectID\",\"type\":\"uint256\"}],\"name\":\"withdrawFund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"Empty()\":[{\"details\":\"An operation (e.g. {front}) couldn't be completed due to the queue being empty.\"}]},\"kind\":\"dev\",\"methods\":{\"COUNTING_MODE()\":{\"details\":\"See {IGovernor-COUNTING_MODE}.\"},\"castVote(uint256,uint8)\":{\"details\":\"See {IGovernor-castVote}.\"},\"castVoteBySig(uint256,uint8,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteBySig}.\"},\"castVoteWithReason(uint256,uint8,string)\":{\"details\":\"See {IGovernor-castVoteWithReason}.\"},\"castVoteWithReasonAndParams(uint256,uint8,string,bytes)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParams}.\"},\"castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32)\":{\"details\":\"See {IGovernor-castVoteWithReasonAndParamsBySig}.\"},\"execute(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-execute}.\"},\"getVotes(address,uint256)\":{\"details\":\"See {IGovernor-getVotes}.\"},\"getVotesWithParams(address,uint256,bytes)\":{\"details\":\"See {IGovernor-getVotesWithParams}.\"},\"hasVoted(uint256,address)\":{\"details\":\"See {IGovernor-hasVoted}.\"},\"hashProposal(address[],uint256[],bytes[],bytes32)\":{\"details\":\"See {IGovernor-hashProposal}. The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in advance, before the proposal is submitted. Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the same proposal (with same operation and same description) will have the same id if submitted on multiple governors across multiple networks. This also means that in order to execute the same operation twice (on the same governor) the proposer will have to change the description in order to avoid proposal id conflicts.\"},\"name()\":{\"details\":\"See {IGovernor-name}.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"performUpkeep(bytes)\":{\"details\":\"The input to this method should not be trusted, and the caller of the method should not even be restricted to any single registry. Anyone should be able call it, and the input should be validated, there is no guarantee that the data passed in is the performData returned from checkUpkeep. This could happen due to malicious keepers, racing keepers, or simply a state change while the performUpkeep transaction is waiting for confirmation. Always validate the data passed in.\",\"params\":{\"performData\":\"is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state.\"}},\"proposalDeadline(uint256)\":{\"details\":\"See {IGovernor-proposalDeadline}.\"},\"proposalEta(uint256)\":{\"details\":\"Public accessor to check the eta of a queued proposal\"},\"proposalSnapshot(uint256)\":{\"details\":\"See {IGovernor-proposalSnapshot}.\"},\"proposalVotes(uint256)\":{\"details\":\"Accessor to the internal vote counts.\"},\"queue(address[],uint256[],bytes[],bytes32)\":{\"details\":\"Function to queue a proposal to the timelock.\"},\"quorumDenominator()\":{\"details\":\"Returns the quorum denominator. Defaults to 100, but may be overridden.\"},\"quorumNumerator()\":{\"details\":\"Returns the current quorum numerator. See {quorumDenominator}.\"},\"quorumNumerator(uint256)\":{\"details\":\"Returns the quorum numerator at a specific block number. See {quorumDenominator}.\"},\"relay(address,uint256,bytes)\":{\"details\":\"Relays a transaction or function call to an arbitrary target. In cases where the governance executor is some contract other than the governor itself, like when using a timelock, this function can be invoked in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. Note that if the executor is simply the governor itself, use of `relay` is redundant.\"},\"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.\"},\"setProposalThreshold(uint256)\":{\"details\":\"Update the proposal threshold. This operation can only be performed through a governance proposal. Emits a {ProposalThresholdSet} event.\"},\"setVotingDelay(uint256)\":{\"details\":\"Update the voting delay. This operation can only be performed through a governance proposal. Emits a {VotingDelaySet} event.\"},\"setVotingPeriod(uint256)\":{\"details\":\"Update the voting period. This operation can only be performed through a governance proposal. Emits a {VotingPeriodSet} event.\"},\"timelock()\":{\"details\":\"Public accessor to check the address of the timelock\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateQuorumNumerator(uint256)\":{\"details\":\"Changes the quorum numerator. Emits a {QuorumNumeratorUpdated} event. Requirements: - Must be called through a governance proposal. - New numerator must be smaller or equal to the denominator.\"},\"updateTimelock(address)\":{\"details\":\"Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates must be proposed, scheduled, and executed through governance proposals. CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\"},\"version()\":{\"details\":\"See {IGovernor-version}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"performUpkeep(bytes)\":{\"notice\":\"method that is actually executed by the keepers, via the registry. The data returned by the checkUpkeep simulation will be passed into this method to actually be executed.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/GovernerContract.sol\":\"GovernerContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/AutomationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ncontract AutomationBase {\\n error OnlySimulatedBackend();\\n\\n /**\\n * @notice method that allows it to be simulated via eth_call by checking that\\n * the sender is the zero address.\\n */\\n function preventExecution() internal view {\\n if (tx.origin != address(0)) {\\n revert OnlySimulatedBackend();\\n }\\n }\\n\\n /**\\n * @notice modifier that allows it to be simulated via eth_call by checking\\n * that the sender is the zero address.\\n */\\n modifier cannotExecute() {\\n preventExecution();\\n _;\\n }\\n}\\n\",\"keccak256\":\"0x5d354afa1a97dffe66094397cdcbb0c14713cf3d609d88fd8f9891010e9a351a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AutomationBase.sol\\\";\\nimport \\\"./interfaces/AutomationCompatibleInterface.sol\\\";\\n\\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\\n\",\"keccak256\":\"0x40e5ae0eff4edd0740c1b5590d09c344f84dee031e82d5294563e99603774f80\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\\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 constructor() {\\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\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/Governor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/cryptography/ECDSA.sol\\\";\\nimport \\\"../utils/cryptography/draft-EIP712.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\nimport \\\"../utils/math/SafeCast.sol\\\";\\nimport \\\"../utils/structs/DoubleEndedQueue.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Timers.sol\\\";\\nimport \\\"./IGovernor.sol\\\";\\n\\n/**\\n * @dev Core of the governance system, designed to be extended though various modules.\\n *\\n * This contract is abstract and requires several function to be implemented in various modules:\\n *\\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\\n * - A voting module must implement {_getVotes}\\n * - Additionanly, the {votingPeriod} must also be implemented\\n *\\n * _Available since v4.3._\\n */\\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\\n using SafeCast for uint256;\\n using Timers for Timers.BlockNumber;\\n\\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\\\"Ballot(uint256 proposalId,uint8 support)\\\");\\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\\n keccak256(\\\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\\\");\\n\\n struct ProposalCore {\\n Timers.BlockNumber voteStart;\\n Timers.BlockNumber voteEnd;\\n bool executed;\\n bool canceled;\\n }\\n\\n string private _name;\\n\\n mapping(uint256 => ProposalCore) private _proposals;\\n\\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\\n\\n /**\\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\\n * parameter setters in {GovernorSettings} are protected using this modifier.\\n *\\n * The governance executing address may be different from the Governor's own address, for example it could be a\\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\\n * for example, additional timelock proposers are not able to change governance parameters without going through the\\n * governance protocol (since v4.6).\\n */\\n modifier onlyGovernance() {\\n require(_msgSender() == _executor(), \\\"Governor: onlyGovernance\\\");\\n if (_executor() != address(this)) {\\n bytes32 msgDataHash = keccak256(_msgData());\\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\\n while (_governanceCall.popFront() != msgDataHash) {}\\n }\\n _;\\n }\\n\\n /**\\n * @dev Sets the value for {name} and {version}\\n */\\n constructor(string memory name_) EIP712(name_, version()) {\\n _name = name_;\\n }\\n\\n /**\\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\\n */\\n receive() external payable virtual {\\n require(_executor() == address(this));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\\n // include the castVoteWithReasonAndParams() function as standard\\n return\\n interfaceId ==\\n (type(IGovernor).interfaceId ^\\n this.castVoteWithReasonAndParams.selector ^\\n this.castVoteWithReasonAndParamsBySig.selector ^\\n this.getVotesWithParams.selector) ||\\n interfaceId == type(IGovernor).interfaceId ||\\n interfaceId == type(IERC1155Receiver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IGovernor-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IGovernor-version}.\\n */\\n function version() public view virtual override returns (string memory) {\\n return \\\"1\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hashProposal}.\\n *\\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\\n * advance, before the proposal is submitted.\\n *\\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual override returns (uint256) {\\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\\n }\\n\\n /**\\n * @dev See {IGovernor-state}.\\n */\\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n\\n if (proposal.executed) {\\n return ProposalState.Executed;\\n }\\n\\n if (proposal.canceled) {\\n return ProposalState.Canceled;\\n }\\n\\n uint256 snapshot = proposalSnapshot(proposalId);\\n\\n if (snapshot == 0) {\\n revert(\\\"Governor: unknown proposal id\\\");\\n }\\n\\n if (snapshot >= block.number) {\\n return ProposalState.Pending;\\n }\\n\\n uint256 deadline = proposalDeadline(proposalId);\\n\\n if (deadline >= block.number) {\\n return ProposalState.Active;\\n }\\n\\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\\n return ProposalState.Succeeded;\\n } else {\\n return ProposalState.Defeated;\\n }\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalSnapshot}.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteStart.getDeadline();\\n }\\n\\n /**\\n * @dev See {IGovernor-proposalDeadline}.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\\n return _proposals[proposalId].voteEnd.getDeadline();\\n }\\n\\n /**\\n * @dev Part of the Governor Bravo's interface: _\\\"The number of votes required in order for a voter to become a proposer\\\"_.\\n */\\n function proposalThreshold() public view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Amount of votes already cast passes the threshold limit.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Is the proposal successful or not.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\\n\\n /**\\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) internal view virtual returns (uint256);\\n\\n /**\\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\\n *\\n * Note: Support is generic and can represent various things depending on the voting system used.\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory params\\n ) internal virtual;\\n\\n /**\\n * @dev Default additional encoded parameters used by castVote methods that don't include them\\n *\\n * Note: Should be overridden by specific implementations to use an appropriate value, the\\n * meaning of the additional params, in the context of that implementation\\n */\\n function _defaultParams() internal view virtual returns (bytes memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-propose}.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual override returns (uint256) {\\n require(\\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\\n \\\"Governor: proposer votes below proposal threshold\\\"\\n );\\n\\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\\n\\n require(targets.length == values.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length == calldatas.length, \\\"Governor: invalid proposal length\\\");\\n require(targets.length > 0, \\\"Governor: empty proposal\\\");\\n\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(proposal.voteStart.isUnset(), \\\"Governor: proposal already exists\\\");\\n\\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\\n uint64 deadline = snapshot + votingPeriod().toUint64();\\n\\n proposal.voteStart.setDeadline(snapshot);\\n proposal.voteEnd.setDeadline(deadline);\\n\\n emit ProposalCreated(\\n proposalId,\\n _msgSender(),\\n targets,\\n values,\\n new string[](targets.length),\\n calldatas,\\n snapshot,\\n deadline,\\n description\\n );\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-execute}.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n ProposalState status = state(proposalId);\\n require(\\n status == ProposalState.Succeeded || status == ProposalState.Queued,\\n \\\"Governor: proposal not successful\\\"\\n );\\n _proposals[proposalId].executed = true;\\n\\n emit ProposalExecuted(proposalId);\\n\\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\\n _execute(proposalId, targets, values, calldatas, descriptionHash);\\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n string memory errorMessage = \\\"Governor: call reverted without message\\\";\\n for (uint256 i = 0; i < targets.length; ++i) {\\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\\n Address.verifyCallResult(success, returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Hook before execution is triggered.\\n */\\n function _beforeExecute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory, /* values */\\n bytes[] memory calldatas,\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n for (uint256 i = 0; i < targets.length; ++i) {\\n if (targets[i] == address(this)) {\\n _governanceCall.pushBack(keccak256(calldatas[i]));\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook after execution is triggered.\\n */\\n function _afterExecute(\\n uint256, /* proposalId */\\n address[] memory, /* targets */\\n uint256[] memory, /* values */\\n bytes[] memory, /* calldatas */\\n bytes32 /*descriptionHash*/\\n ) internal virtual {\\n if (_executor() != address(this)) {\\n if (!_governanceCall.empty()) {\\n _governanceCall.clear();\\n }\\n }\\n }\\n\\n /**\\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\\n * canceled to allow distinguishing it from executed proposals.\\n *\\n * Emits a {IGovernor-ProposalCanceled} event.\\n */\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n ProposalState status = state(proposalId);\\n\\n require(\\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\\n \\\"Governor: proposal not active\\\"\\n );\\n _proposals[proposalId].canceled = true;\\n\\n emit ProposalCanceled(proposalId);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotes}.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, _defaultParams());\\n }\\n\\n /**\\n * @dev See {IGovernor-getVotesWithParams}.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual override returns (uint256) {\\n return _getVotes(account, blockNumber, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVote}.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReason}.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual override returns (uint256) {\\n address voter = _msgSender();\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteBySig}.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\\n v,\\n r,\\n s\\n );\\n return _castVote(proposalId, voter, support, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual override returns (uint256) {\\n address voter = ECDSA.recover(\\n _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n EXTENDED_BALLOT_TYPEHASH,\\n proposalId,\\n support,\\n keccak256(bytes(reason)),\\n keccak256(params)\\n )\\n )\\n ),\\n v,\\n r,\\n s\\n );\\n\\n return _castVote(proposalId, voter, support, reason, params);\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason\\n ) internal virtual returns (uint256) {\\n return _castVote(proposalId, account, support, reason, _defaultParams());\\n }\\n\\n /**\\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\\n *\\n * Emits a {IGovernor-VoteCast} event.\\n */\\n function _castVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n string memory reason,\\n bytes memory params\\n ) internal virtual returns (uint256) {\\n ProposalCore storage proposal = _proposals[proposalId];\\n require(state(proposalId) == ProposalState.Active, \\\"Governor: vote not currently active\\\");\\n\\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\\n _countVote(proposalId, account, support, weight, params);\\n\\n if (params.length == 0) {\\n emit VoteCast(account, proposalId, support, weight, reason);\\n } else {\\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\\n }\\n\\n return weight;\\n }\\n\\n /**\\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\\n */\\n function relay(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) external virtual onlyGovernance {\\n Address.functionCallWithValue(target, data, value);\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\\n * through another contract such as a timelock.\\n */\\n function _executor() internal view virtual returns (address) {\\n return address(this);\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x0db2a6141fa677ae237b5f954d7af76553aa436855d32abca3110d92e9b56ec4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/IGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Interface of the {Governor} core.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernor is IERC165 {\\n enum ProposalState {\\n Pending,\\n Active,\\n Canceled,\\n Defeated,\\n Succeeded,\\n Queued,\\n Expired,\\n Executed\\n }\\n\\n /**\\n * @dev Emitted when a proposal is created.\\n */\\n event ProposalCreated(\\n uint256 proposalId,\\n address proposer,\\n address[] targets,\\n uint256[] values,\\n string[] signatures,\\n bytes[] calldatas,\\n uint256 startBlock,\\n uint256 endBlock,\\n string description\\n );\\n\\n /**\\n * @dev Emitted when a proposal is canceled.\\n */\\n event ProposalCanceled(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a proposal is executed.\\n */\\n event ProposalExecuted(uint256 proposalId);\\n\\n /**\\n * @dev Emitted when a vote is cast without params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n */\\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\\n\\n /**\\n * @dev Emitted when a vote is cast with params.\\n *\\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\\n */\\n event VoteCastWithParams(\\n address indexed voter,\\n uint256 proposalId,\\n uint8 support,\\n uint256 weight,\\n string reason,\\n bytes params\\n );\\n\\n /**\\n * @notice module:core\\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\\n */\\n function name() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \\\"1\\\"\\n */\\n function version() public view virtual returns (string memory);\\n\\n /**\\n * @notice module:voting\\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\\n *\\n * There are 2 standard keys: `support` and `quorum`.\\n *\\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\\n * - `quorum=bravo` means that only For votes are counted towards quorum.\\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\\n *\\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\\n * name that describes the behavior. For example:\\n *\\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\\n *\\n * NOTE: The string can be decoded by the standard\\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\\n * JavaScript class.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual returns (string memory);\\n\\n /**\\n * @notice module:core\\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\\n */\\n function hashProposal(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public pure virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Current state of a proposal, following Compound's convention\\n */\\n function state(uint256 proposalId) public view virtual returns (ProposalState);\\n\\n /**\\n * @notice module:core\\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\\n * beginning of the following block.\\n */\\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:core\\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\\n * during this block.\\n */\\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\\n */\\n function votingDelay() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Delay, in number of blocks, between the vote start and vote ends.\\n *\\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\\n * duration compared to the voting delay.\\n */\\n function votingPeriod() public view virtual returns (uint256);\\n\\n /**\\n * @notice module:user-config\\n * @dev Minimum number of cast voted required for a proposal to be successful.\\n *\\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\\n */\\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber`.\\n *\\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\\n * multiple), {ERC20Votes} tokens.\\n */\\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:reputation\\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\\n */\\n function getVotesWithParams(\\n address account,\\n uint256 blockNumber,\\n bytes memory params\\n ) public view virtual returns (uint256);\\n\\n /**\\n * @notice module:voting\\n * @dev Returns weither `account` has cast a vote on `proposalId`.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\\n\\n /**\\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\\n * {IGovernor-votingPeriod} blocks after the voting starts.\\n *\\n * Emits a {ProposalCreated} event.\\n */\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\\n * deadline to be reached.\\n *\\n * Emits a {ProposalExecuted} event.\\n *\\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\\n */\\n function execute(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public payable virtual returns (uint256 proposalId);\\n\\n /**\\n * @dev Cast a vote\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteWithReason(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParams(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} event.\\n */\\n function castVoteBySig(\\n uint256 proposalId,\\n uint8 support,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n\\n /**\\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\\n *\\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\\n */\\n function castVoteWithReasonAndParamsBySig(\\n uint256 proposalId,\\n uint8 support,\\n string calldata reason,\\n bytes memory params,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) public virtual returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0xe1d0cd92e6827b0ca89925a59ec0eadc2b444aa3dd430fecb752a93c36436991\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorCountingSimple is Governor {\\n /**\\n * @dev Supported vote types. Matches Governor Bravo ordering.\\n */\\n enum VoteType {\\n Against,\\n For,\\n Abstain\\n }\\n\\n struct ProposalVote {\\n uint256 againstVotes;\\n uint256 forVotes;\\n uint256 abstainVotes;\\n mapping(address => bool) hasVoted;\\n }\\n\\n mapping(uint256 => ProposalVote) private _proposalVotes;\\n\\n /**\\n * @dev See {IGovernor-COUNTING_MODE}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function COUNTING_MODE() public pure virtual override returns (string memory) {\\n return \\\"support=bravo&quorum=for,abstain\\\";\\n }\\n\\n /**\\n * @dev See {IGovernor-hasVoted}.\\n */\\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\\n return _proposalVotes[proposalId].hasVoted[account];\\n }\\n\\n /**\\n * @dev Accessor to the internal vote counts.\\n */\\n function proposalVotes(uint256 proposalId)\\n public\\n view\\n virtual\\n returns (\\n uint256 againstVotes,\\n uint256 forVotes,\\n uint256 abstainVotes\\n )\\n {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\\n }\\n\\n /**\\n * @dev See {Governor-_quorumReached}.\\n */\\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\\n */\\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n return proposalvote.forVotes > proposalvote.againstVotes;\\n }\\n\\n /**\\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\\n */\\n function _countVote(\\n uint256 proposalId,\\n address account,\\n uint8 support,\\n uint256 weight,\\n bytes memory // params\\n ) internal virtual override {\\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\\n\\n require(!proposalvote.hasVoted[account], \\\"GovernorVotingSimple: vote already cast\\\");\\n proposalvote.hasVoted[account] = true;\\n\\n if (support == uint8(VoteType.Against)) {\\n proposalvote.againstVotes += weight;\\n } else if (support == uint8(VoteType.For)) {\\n proposalvote.forVotes += weight;\\n } else if (support == uint8(VoteType.Abstain)) {\\n proposalvote.abstainVotes += weight;\\n } else {\\n revert(\\\"GovernorVotingSimple: invalid value for enum VoteType\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0xcb82f3524bea8631d077934fe0a250d321440a1528135c8adaf896bcdf92351d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for settings updatable through governance.\\n *\\n * _Available since v4.4._\\n */\\nabstract contract GovernorSettings is Governor {\\n uint256 private _votingDelay;\\n uint256 private _votingPeriod;\\n uint256 private _proposalThreshold;\\n\\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\\n\\n /**\\n * @dev Initialize the governance parameters.\\n */\\n constructor(\\n uint256 initialVotingDelay,\\n uint256 initialVotingPeriod,\\n uint256 initialProposalThreshold\\n ) {\\n _setVotingDelay(initialVotingDelay);\\n _setVotingPeriod(initialVotingPeriod);\\n _setProposalThreshold(initialProposalThreshold);\\n }\\n\\n /**\\n * @dev See {IGovernor-votingDelay}.\\n */\\n function votingDelay() public view virtual override returns (uint256) {\\n return _votingDelay;\\n }\\n\\n /**\\n * @dev See {IGovernor-votingPeriod}.\\n */\\n function votingPeriod() public view virtual override returns (uint256) {\\n return _votingPeriod;\\n }\\n\\n /**\\n * @dev See {Governor-proposalThreshold}.\\n */\\n function proposalThreshold() public view virtual override returns (uint256) {\\n return _proposalThreshold;\\n }\\n\\n /**\\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\\n _setVotingDelay(newVotingDelay);\\n }\\n\\n /**\\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\\n _setVotingPeriod(newVotingPeriod);\\n }\\n\\n /**\\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\\n _setProposalThreshold(newProposalThreshold);\\n }\\n\\n /**\\n * @dev Internal setter for the voting delay.\\n *\\n * Emits a {VotingDelaySet} event.\\n */\\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\\n emit VotingDelaySet(_votingDelay, newVotingDelay);\\n _votingDelay = newVotingDelay;\\n }\\n\\n /**\\n * @dev Internal setter for the voting period.\\n *\\n * Emits a {VotingPeriodSet} event.\\n */\\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\\n // voting period must be at least one block long\\n require(newVotingPeriod > 0, \\\"GovernorSettings: voting period too low\\\");\\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\\n _votingPeriod = newVotingPeriod;\\n }\\n\\n /**\\n * @dev Internal setter for the proposal threshold.\\n *\\n * Emits a {ProposalThresholdSet} event.\\n */\\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\\n _proposalThreshold = newProposalThreshold;\\n }\\n}\\n\",\"keccak256\":\"0xab3781f09dfb447d0c2f5bbb2aafc9ff86333f16c61580ab85d7c8a87491eab9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IGovernorTimelock.sol\\\";\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../TimelockController.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\\n *\\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\\n * inaccessible.\\n *\\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\\n TimelockController private _timelock;\\n mapping(uint256 => bytes32) private _timelockIds;\\n\\n /**\\n * @dev Emitted when the timelock controller used for proposal execution is modified.\\n */\\n event TimelockChange(address oldTimelock, address newTimelock);\\n\\n /**\\n * @dev Set the timelock.\\n */\\n constructor(TimelockController timelockAddress) {\\n _updateTimelock(timelockAddress);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\\n */\\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\\n ProposalState status = super.state(proposalId);\\n\\n if (status != ProposalState.Succeeded) {\\n return status;\\n }\\n\\n // core tracks execution, so we just have to check if successful proposal have been queued.\\n bytes32 queueid = _timelockIds[proposalId];\\n if (queueid == bytes32(0)) {\\n return status;\\n } else if (_timelock.isOperationDone(queueid)) {\\n return ProposalState.Executed;\\n } else if (_timelock.isOperationPending(queueid)) {\\n return ProposalState.Queued;\\n } else {\\n return ProposalState.Canceled;\\n }\\n }\\n\\n /**\\n * @dev Public accessor to check the address of the timelock\\n */\\n function timelock() public view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public accessor to check the eta of a queued proposal\\n */\\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\\n }\\n\\n /**\\n * @dev Function to queue a proposal to the timelock.\\n */\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual override returns (uint256) {\\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\\n\\n require(state(proposalId) == ProposalState.Succeeded, \\\"Governor: proposal not successful\\\");\\n\\n uint256 delay = _timelock.getMinDelay();\\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\\n\\n emit ProposalQueued(proposalId, block.timestamp + delay);\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Overridden execute function that run the already queued proposal through the timelock.\\n */\\n function _execute(\\n uint256, /* proposalId */\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override {\\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\\n }\\n\\n /**\\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\\n * been queued.\\n */\\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\\n // well behaved (according to TimelockController) and this will not happen.\\n // slither-disable-next-line reentrancy-no-eth\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal virtual override returns (uint256) {\\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\\n\\n if (_timelockIds[proposalId] != 0) {\\n _timelock.cancel(_timelockIds[proposalId]);\\n delete _timelockIds[proposalId];\\n }\\n\\n return proposalId;\\n }\\n\\n /**\\n * @dev Address through which the governor executes action. In this case, the timelock.\\n */\\n function _executor() internal view virtual override returns (address) {\\n return address(_timelock);\\n }\\n\\n /**\\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\\n * must be proposed, scheduled, and executed through governance proposals.\\n *\\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\\n */\\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\\n _updateTimelock(newTimelock);\\n }\\n\\n function _updateTimelock(TimelockController newTimelock) private {\\n emit TimelockChange(address(_timelock), address(newTimelock));\\n _timelock = newTimelock;\\n }\\n}\\n\",\"keccak256\":\"0xde79bde0691601228cdf27fc2fdc85cb01eea836d41780e6e73f778e0a886a5e\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Governor.sol\\\";\\nimport \\\"../utils/IVotes.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotes is Governor {\\n IVotes public immutable token;\\n\\n constructor(IVotes tokenAddress) {\\n token = tokenAddress;\\n }\\n\\n /**\\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\\n */\\n function _getVotes(\\n address account,\\n uint256 blockNumber,\\n bytes memory /*params*/\\n ) internal view virtual override returns (uint256) {\\n return token.getPastVotes(account, blockNumber);\\n }\\n}\\n\",\"keccak256\":\"0xf818ee82b0faf7938ced9fcc851600b17202c8f6b1b33e01035702cadda684bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./GovernorVotes.sol\\\";\\nimport \\\"../../utils/Checkpoints.sol\\\";\\nimport \\\"../../utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\\n * fraction of the total supply.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\\n using Checkpoints for Checkpoints.History;\\n\\n uint256 private _quorumNumerator; // DEPRECATED\\n Checkpoints.History private _quorumNumeratorHistory;\\n\\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\\n\\n /**\\n * @dev Initialize quorum as a fraction of the token's total supply.\\n *\\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\\n * customized by overriding {quorumDenominator}.\\n */\\n constructor(uint256 quorumNumeratorValue) {\\n _updateQuorumNumerator(quorumNumeratorValue);\\n }\\n\\n /**\\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\\n */\\n function quorumNumerator() public view virtual returns (uint256) {\\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\\n }\\n\\n /**\\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\\n */\\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\\n // If history is empty, fallback to old storage\\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\\n if (length == 0) {\\n return _quorumNumerator;\\n }\\n\\n // Optimistic search, check the latest checkpoint\\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\\n if (latest._blockNumber <= blockNumber) {\\n return latest._value;\\n }\\n\\n // Otherwize, do the binary search\\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\\n }\\n\\n /**\\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\\n */\\n function quorumDenominator() public view virtual returns (uint256) {\\n return 100;\\n }\\n\\n /**\\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\\n */\\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - Must be called through a governance proposal.\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\\n _updateQuorumNumerator(newQuorumNumerator);\\n }\\n\\n /**\\n * @dev Changes the quorum numerator.\\n *\\n * Emits a {QuorumNumeratorUpdated} event.\\n *\\n * Requirements:\\n *\\n * - New numerator must be smaller or equal to the denominator.\\n */\\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\\n require(\\n newQuorumNumerator <= quorumDenominator(),\\n \\\"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\\\"\\n );\\n\\n uint256 oldQuorumNumerator = quorumNumerator();\\n\\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\\n _quorumNumeratorHistory._checkpoints.push(\\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\\n );\\n }\\n\\n // Set new quorum for future proposals\\n _quorumNumeratorHistory.push(newQuorumNumerator);\\n\\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\\n }\\n}\\n\",\"keccak256\":\"0x5abcc487197ec2aec914c7c04b6a02678341ead6316e9e2f36df6f824419edfe\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IGovernor.sol\\\";\\n\\n/**\\n * @dev Extension of the {IGovernor} for timelock supporting modules.\\n *\\n * _Available since v4.3._\\n */\\nabstract contract IGovernorTimelock is IGovernor {\\n event ProposalQueued(uint256 proposalId, uint256 eta);\\n\\n function timelock() public view virtual returns (address);\\n\\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\\n\\n function queue(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) public virtual returns (uint256 proposalId);\\n}\\n\",\"keccak256\":\"0xe6234ac4ba0508a3371a46543cdf4bf3a1a404d2d3c3470006741a0da294f974\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\\n *\\n * _Available since v4.5._\\n */\\ninterface IVotes {\\n /**\\n * @dev Emitted when an account changes their delegate.\\n */\\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\\n\\n /**\\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\\n */\\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\\n\\n /**\\n * @dev Returns the current amount of votes that `account` has.\\n */\\n function getVotes(address account) external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\\n */\\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\\n *\\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\\n * vote.\\n */\\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\\n\\n /**\\n * @dev Returns the delegate that `account` has chosen.\\n */\\n function delegates(address account) external view returns (address);\\n\\n /**\\n * @dev Delegates votes from the sender to `delegatee`.\\n */\\n function delegate(address delegatee) external;\\n\\n /**\\n * @dev Delegates votes from signer to `delegatee`.\\n */\\n function delegateBySig(\\n address delegatee,\\n uint256 nonce,\\n uint256 expiry,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n}\\n\",\"keccak256\":\"0xf5324a55ee9c0b4a840ea57c055ac9d046f88986ceef567e1cf68113e46a79c0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Checkpoints.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SafeCast.sol\\\";\\n\\n/**\\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\\n * time, and later looking up past values by block number. See {Votes} as an example.\\n *\\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\\n * checkpoint for the current transaction block using the {push} function.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Checkpoints {\\n struct Checkpoint {\\n uint32 _blockNumber;\\n uint224 _value;\\n }\\n\\n struct History {\\n Checkpoint[] _checkpoints;\\n }\\n\\n /**\\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\\n */\\n function latest(History storage self) internal view returns (uint256) {\\n uint256 pos = self._checkpoints.length;\\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\\n }\\n\\n /**\\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\\n * before it is returned, or zero otherwise.\\n */\\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\\n require(blockNumber < block.number, \\\"Checkpoints: block not yet mined\\\");\\n\\n uint256 high = self._checkpoints.length;\\n uint256 low = 0;\\n while (low < high) {\\n uint256 mid = Math.average(low, high);\\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\\n high = mid;\\n } else {\\n low = mid + 1;\\n }\\n }\\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\\n }\\n\\n /**\\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\\n *\\n * Returns previous value and new value.\\n */\\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\\n uint256 pos = self._checkpoints.length;\\n uint256 old = latest(self);\\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\\n } else {\\n self._checkpoints.push(\\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\\n );\\n }\\n return (old, value);\\n }\\n\\n /**\\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\\n * be set to `op(latest, delta)`.\\n *\\n * Returns previous value and new value.\\n */\\n function push(\\n History storage self,\\n function(uint256, uint256) view returns (uint256) op,\\n uint256 delta\\n ) internal returns (uint256, uint256) {\\n return push(self, op(latest(self), delta));\\n }\\n}\\n\",\"keccak256\":\"0x2e109f03a05809288a1478d4d9fcd0804229207e18d1164ce0597fb0958a159c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Timers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Tooling for timepoints, timers and delays\\n */\\nlibrary Timers {\\n struct Timestamp {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(Timestamp storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(Timestamp memory timer) internal view returns (bool) {\\n return timer._deadline > block.timestamp;\\n }\\n\\n function isExpired(Timestamp memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.timestamp;\\n }\\n\\n struct BlockNumber {\\n uint64 _deadline;\\n }\\n\\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\\n return timer._deadline;\\n }\\n\\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\\n timer._deadline = timestamp;\\n }\\n\\n function reset(BlockNumber storage timer) internal {\\n timer._deadline = 0;\\n }\\n\\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline == 0;\\n }\\n\\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\\n return timer._deadline > 0;\\n }\\n\\n function isPending(BlockNumber memory timer) internal view returns (bool) {\\n return timer._deadline > block.number;\\n }\\n\\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\\n return isStarted(timer) && timer._deadline <= block.number;\\n }\\n}\\n\",\"keccak256\":\"0x29791a62950a7983e02a673639c1a781d1e448691800456c2ce4b99715391b14\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.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 ECDSA {\\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 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 {\\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\\\", Strings.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\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x6688fad58b9ec0286d40fa957152e575d5d8bd4c3aa80985efdb11b44f776ae7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a >= b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`.\\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\\n // This gives `2**k < a <= 2**(k+1)` \\u2192 `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1;\\n uint256 x = a;\\n if (x >> 128 > 0) {\\n x >>= 128;\\n result <<= 64;\\n }\\n if (x >> 64 > 0) {\\n x >>= 64;\\n result <<= 32;\\n }\\n if (x >> 32 > 0) {\\n x >>= 32;\\n result <<= 16;\\n }\\n if (x >> 16 > 0) {\\n x >>= 16;\\n result <<= 8;\\n }\\n if (x >> 8 > 0) {\\n x >>= 8;\\n result <<= 4;\\n }\\n if (x >> 4 > 0) {\\n x >>= 4;\\n result <<= 2;\\n }\\n if (x >> 2 > 0) {\\n result <<= 1;\\n }\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = sqrt(a);\\n if (rounding == Rounding.Up && result * result < a) {\\n result += 1;\\n }\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xd15c3e400531f00203839159b2b8e7209c5158b35618f570c695b7e47f12e9f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248) {\\n require(value >= type(int248).min && value <= type(int248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return int248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240) {\\n require(value >= type(int240).min && value <= type(int240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return int240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232) {\\n require(value >= type(int232).min && value <= type(int232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return int232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224) {\\n require(value >= type(int224).min && value <= type(int224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return int224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216) {\\n require(value >= type(int216).min && value <= type(int216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return int216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208) {\\n require(value >= type(int208).min && value <= type(int208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return int208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200) {\\n require(value >= type(int200).min && value <= type(int200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return int200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192) {\\n require(value >= type(int192).min && value <= type(int192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return int192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184) {\\n require(value >= type(int184).min && value <= type(int184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return int184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176) {\\n require(value >= type(int176).min && value <= type(int176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return int176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168) {\\n require(value >= type(int168).min && value <= type(int168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return int168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160) {\\n require(value >= type(int160).min && value <= type(int160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return int160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152) {\\n require(value >= type(int152).min && value <= type(int152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return int152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144) {\\n require(value >= type(int144).min && value <= type(int144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return int144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136) {\\n require(value >= type(int136).min && value <= type(int136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return int136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128) {\\n require(value >= type(int128).min && value <= type(int128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return int128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120) {\\n require(value >= type(int120).min && value <= type(int120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return int120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112) {\\n require(value >= type(int112).min && value <= type(int112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return int112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104) {\\n require(value >= type(int104).min && value <= type(int104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return int104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96) {\\n require(value >= type(int96).min && value <= type(int96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return int96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88) {\\n require(value >= type(int88).min && value <= type(int88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return int88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80) {\\n require(value >= type(int80).min && value <= type(int80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return int80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72) {\\n require(value >= type(int72).min && value <= type(int72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return int72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64) {\\n require(value >= type(int64).min && value <= type(int64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return int64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56) {\\n require(value >= type(int56).min && value <= type(int56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return int56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48) {\\n require(value >= type(int48).min && value <= type(int48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return int48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40) {\\n require(value >= type(int40).min && value <= type(int40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return int40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32) {\\n require(value >= type(int32).min && value <= type(int32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return int32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24) {\\n require(value >= type(int24).min && value <= type(int24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return int24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16) {\\n require(value >= type(int16).min && value <= type(int16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return int16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8) {\\n require(value >= type(int8).min && value <= type(int8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return int8(value);\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x02686c31ccb9ee77a299fa5f47327af5271f251a707a0e24f321957166ff0434\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\\npragma solidity ^0.8.4;\\n\\nimport \\\"../math/SafeCast.sol\\\";\\n\\n/**\\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\\n * the existing queue contents are left in storage.\\n *\\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\\n * used in storage, and not in memory.\\n * ```\\n * DoubleEndedQueue.Bytes32Deque queue;\\n * ```\\n *\\n * _Available since v4.6._\\n */\\nlibrary DoubleEndedQueue {\\n /**\\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\\n */\\n error Empty();\\n\\n /**\\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\\n */\\n error OutOfBounds();\\n\\n /**\\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\\n *\\n * Struct members have an underscore prefix indicating that they are \\\"private\\\" and should not be read or written to\\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\\n * lead to unexpected behavior.\\n *\\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\\n * data[end - 1].\\n */\\n struct Bytes32Deque {\\n int128 _begin;\\n int128 _end;\\n mapping(int128 => bytes32) _data;\\n }\\n\\n /**\\n * @dev Inserts an item at the end of the queue.\\n */\\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 backIndex = deque._end;\\n deque._data[backIndex] = value;\\n unchecked {\\n deque._end = backIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Removes the item at the end of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n value = deque._data[backIndex];\\n delete deque._data[backIndex];\\n deque._end = backIndex;\\n }\\n\\n /**\\n * @dev Inserts an item at the beginning of the queue.\\n */\\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\\n int128 frontIndex;\\n unchecked {\\n frontIndex = deque._begin - 1;\\n }\\n deque._data[frontIndex] = value;\\n deque._begin = frontIndex;\\n }\\n\\n /**\\n * @dev Removes the item at the beginning of the queue and returns it.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n value = deque._data[frontIndex];\\n delete deque._data[frontIndex];\\n unchecked {\\n deque._begin = frontIndex + 1;\\n }\\n }\\n\\n /**\\n * @dev Returns the item at the beginning of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 frontIndex = deque._begin;\\n return deque._data[frontIndex];\\n }\\n\\n /**\\n * @dev Returns the item at the end of the queue.\\n *\\n * Reverts with `Empty` if the queue is empty.\\n */\\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\\n if (empty(deque)) revert Empty();\\n int128 backIndex;\\n unchecked {\\n backIndex = deque._end - 1;\\n }\\n return deque._data[backIndex];\\n }\\n\\n /**\\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\\n * `length(deque) - 1`.\\n *\\n * Reverts with `OutOfBounds` if the index is out of bounds.\\n */\\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\\n // int256(deque._begin) is a safe upcast\\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\\n if (idx >= deque._end) revert OutOfBounds();\\n return deque._data[idx];\\n }\\n\\n /**\\n * @dev Resets the queue back to being empty.\\n *\\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\\n * out on potential gas refunds.\\n */\\n function clear(Bytes32Deque storage deque) internal {\\n deque._begin = 0;\\n deque._end = 0;\\n }\\n\\n /**\\n * @dev Returns the number of items in the queue.\\n */\\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\\n // We also assume there are at most int256.max items in the queue.\\n unchecked {\\n return uint256(int256(deque._end) - int256(deque._begin));\\n }\\n }\\n\\n /**\\n * @dev Returns true if the queue is empty.\\n */\\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\\n return deque._end <= deque._begin;\\n }\\n}\\n\",\"keccak256\":\"0x4859ffd6dd69382a1462930c00b6e394007da80e78e510f56930271034737bf2\",\"license\":\"MIT\"},\"contracts/FundProject.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror FundProject__NotApporovedByDao();\\nerror FundProject__UpkeepNeeded();\\nerror FundProject__TransferFailed(uint256 _projectId);\\nerror FundProject__NotEnoughPayment();\\nerror FundProject__withdrawFund();\\nerror FundProject__WithdrawTransferFailed();\\nerror FundProject__EnteranceFeeNeeded();\\n\\ncontract FundProject is Ownable, AutomationCompatibleInterface {\\n enum ProjectFundingStatus {\\n ONPROGRESS,\\n SUCCESS,\\n FAILED,\\n CANCELED\\n }\\n\\n uint256 public projectId = 1;\\n\\n uint public lastTimeStamp;\\n uint256 public daoPercentage;\\n uint256 public enteranceFee;\\n\\n mapping(uint256 => bool) public _isFunding;\\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\\n mapping(uint256 => uint256) public time;\\n\\n mapping(string => uint256) public hashToProjectId;\\n mapping(uint256 => string) public idToHash;\\n mapping(uint256 => mapping(address => uint256)) public funders; // projectId => funderAddress => funderBalance\\n mapping(uint256 => uint256) public projectFunds;\\n mapping(uint256 => uint256) public projectFundingGoalAmount;\\n mapping(uint256 => bool) public _isApporovedByDao;\\n mapping(uint256 => address) public projectOwnerAddress;\\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\\n mapping(address => bool) public _isEnteranceFeePaid;\\n mapping(address => uint256[]) public investedProjects; // investor address => investedProjects\\n\\n event projectSuccessfullyFunded(uint256 indexed _projectId);\\n event projectFundingFailed(uint256 indexed _projectId);\\n event enteranceFeePaid(address indexed _projectOwner);\\n event projectGoesToFunding(uint256 indexed _projectId);\\n event withdrawFundSuccessfully(\\n address indexed __investor,\\n uint256 indexed __projectId\\n );\\n\\n modifier isApporovedByDao(uint256 _projecID) {\\n if (!_isApporovedByDao[_projecID])\\n revert FundProject__NotApporovedByDao();\\n _;\\n }\\n\\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\\n lastTimeStamp = block.timestamp;\\n daoPercentage = _daoPercentage;\\n enteranceFee = _enteranceFee;\\n }\\n\\n function fund(uint256 _projecID)\\n public\\n payable\\n isApporovedByDao(_projecID)\\n {\\n funders[_projecID][msg.sender] += msg.value;\\n projectFunds[_projecID] += msg.value;\\n investedProjects[msg.sender] = [_projecID]; // need testing\\n }\\n\\n function apporoveFundingByDao(\\n string memory _ipfsHash,\\n uint256 _fundingGoalAmount,\\n uint256 _time,\\n address _projectOwnerAddress\\n ) external onlyOwner {\\n // only dao can call it\\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\\n revert FundProject__EnteranceFeeNeeded();\\n } else {\\n projectToTime[projectId][_time] = block.timestamp;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\\n time[projectId] = _time;\\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\\n hashToProjectId[_ipfsHash] = projectId;\\n idToHash[projectId] = _ipfsHash;\\n projectOwnerAddress[projectId] = _projectOwnerAddress;\\n _isApporovedByDao[projectId] = true;\\n _isFunding[projectId] = true;\\n emit projectGoesToFunding(projectId);\\n projectId++;\\n }\\n }\\n\\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\\n // only dao can call it\\n _isApporovedByDao[_projecID] = false;\\n _isFunding[projectId] = false;\\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\\n }\\n\\n function checkUpkeep(\\n bytes memory /* checkData */\\n )\\n public\\n view\\n override\\n returns (bool upkeepNeeded, bytes memory performData)\\n {\\n for (uint i = 1; i <= projectId; i++) {\\n bool isFunded = _isFunding[i];\\n bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) >\\n time[i];\\n upkeepNeeded = (isFunded && timePassed);\\n if (upkeepNeeded) {\\n performData = abi.encodePacked(i);\\n break;\\n }\\n }\\n }\\n\\n function performUpkeep(bytes calldata performData) external override {\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\n if (!upkeepNeeded) {\\n revert FundProject__UpkeepNeeded();\\n }\\n\\n uint256 ProjectId = uint256(bytes32(performData));\\n _isFunding[ProjectId] = false;\\n _isApporovedByDao[ProjectId] = false;\\n\\n if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) {\\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS;\\n uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) /\\n 100;\\n projectFunds[ProjectId] = 0;\\n (bool success, ) = (projectOwnerAddress[ProjectId]).call{\\n value: fundsToSent\\n }(\\\"\\\");\\n if (!success) {\\n revert FundProject__TransferFailed(projectFunds[ProjectId]);\\n }\\n\\n emit projectSuccessfullyFunded(ProjectId);\\n } else {\\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.FAILED;\\n emit projectFundingFailed(ProjectId);\\n }\\n }\\n\\n function paySubmitFee() public payable {\\n if (msg.value < enteranceFee) {\\n revert FundProject__NotEnoughPayment();\\n } else {\\n _isEnteranceFeePaid[msg.sender] = true;\\n emit enteranceFeePaid(msg.sender);\\n }\\n }\\n\\n function withdrawFund(uint256 _projectID) public {\\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\\n uint256 fundToSent = funders[_projectID][msg.sender];\\n funders[_projectID][msg.sender] = 0;\\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\\n \\\"\\\"\\n );\\n if (!success) {\\n revert FundProject__WithdrawTransferFailed();\\n }\\n emit withdrawFundSuccessfully(msg.sender, projectId);\\n } else {\\n revert FundProject__withdrawFund();\\n }\\n }\\n\\n function _isApporoveFundingByDao(uint256 _projecID)\\n external\\n view\\n returns (bool)\\n {\\n return _isApporovedByDao[_projecID];\\n }\\n\\n function _getHashOfProjectData(uint256 _projecID)\\n public\\n view\\n returns (string memory)\\n {\\n return idToHash[_projecID];\\n }\\n\\n function _getProjectId(string memory _ipfsHash)\\n public\\n view\\n returns (uint256)\\n {\\n return hashToProjectId[_ipfsHash];\\n }\\n\\n function _getBalanceOfProject(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFunds[_projecID];\\n }\\n\\n function _getFundingGoalAmount(uint256 _projecID)\\n public\\n view\\n returns (uint256)\\n {\\n return projectFundingGoalAmount[_projecID];\\n }\\n\\n function is_funding(uint256 _projectID) public view returns (bool) {\\n return _isFunding[_projectID];\\n }\\n\\n function _getProjectStatus(uint256 _projectID)\\n public\\n view\\n returns (ProjectFundingStatus)\\n {\\n return _ProjectFundingStatus[_projectID];\\n }\\n\\n function getEnteranceFee() public view returns (uint256) {\\n return enteranceFee;\\n }\\n\\n function isEnteranceFeePaid(address account) public view returns (bool) {\\n return _isEnteranceFeePaid[account];\\n }\\n\\n function getFunderBalance(uint256 _projectID)\\n public\\n view\\n returns (uint256)\\n {\\n return funders[_projectID][msg.sender];\\n }\\n\\n function getInvestedProjects(address investor)\\n public\\n view\\n returns (uint256[] memory)\\n {\\n return investedProjects[investor]; // need testing\\n }\\n\\n function getDaoPercentage() public view returns (uint256) {\\n return daoPercentage;\\n }\\n\\n function getTimeleft(uint256 _projectID)\\n public\\n view\\n returns (uint256 a, uint256 b)\\n {\\n a = block.timestamp - projectToTime[_projectID][time[_projectID]];\\n b = time[_projectID];\\n }\\n}\\n\",\"keccak256\":\"0x02f9eea250f8d3c01957575bda4d62a5aa8df3d336d7b018b54b7698d17213ed\",\"license\":\"MIT\"},\"contracts/GovernerContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/Governor.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\\\";\\nimport \\\"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\\\";\\nimport \\\"./FundProject.sol\\\";\\n\\ncontract GovernerContract is\\n Governor,\\n GovernorSettings,\\n GovernorCountingSimple,\\n GovernorVotes,\\n GovernorVotesQuorumFraction,\\n GovernorTimelockControl,\\n FundProject\\n{\\n error GovernerContract__NeedEnteranceFee();\\n\\n constructor(\\n IVotes _token,\\n TimelockController _timelock,\\n uint256 _votingDelay,\\n uint256 _votingPeriod,\\n uint256 _quorumPercentage,\\n uint256 _enteranceFee,\\n uint256 _daoPercentage\\n )\\n Governor(\\\"GovernerContract\\\")\\n GovernorSettings(\\n _votingDelay, /* 1 block */\\n _votingPeriod, /* 45818 blocks = ~1 week */\\n 0\\n )\\n GovernorVotes(_token)\\n GovernorVotesQuorumFraction(_quorumPercentage)\\n GovernorTimelockControl(_timelock)\\n FundProject(_enteranceFee, _daoPercentage)\\n {}\\n\\n // The following functions are overrides required by Solidity.\\n\\n function votingDelay()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingDelay();\\n }\\n\\n function votingPeriod()\\n public\\n view\\n override(IGovernor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.votingPeriod();\\n }\\n\\n function quorum(uint256 blockNumber)\\n public\\n view\\n override(IGovernor, GovernorVotesQuorumFraction)\\n returns (uint256)\\n {\\n return super.quorum(blockNumber);\\n }\\n\\n function state(uint256 proposalId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (ProposalState)\\n {\\n return super.state(proposalId);\\n }\\n\\n function propose(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n string memory description\\n ) public override(Governor, IGovernor) returns (uint256) {\\n if (!_isEnteranceFeePaid[msg.sender]) {\\n revert GovernerContract__NeedEnteranceFee();\\n }\\n return super.propose(targets, values, calldatas, description);\\n }\\n\\n function proposalThreshold()\\n public\\n view\\n override(Governor, GovernorSettings)\\n returns (uint256)\\n {\\n return super.proposalThreshold();\\n }\\n\\n function _execute(\\n uint256 proposalId,\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) {\\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\\n }\\n\\n function _cancel(\\n address[] memory targets,\\n uint256[] memory values,\\n bytes[] memory calldatas,\\n bytes32 descriptionHash\\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\\n return super._cancel(targets, values, calldatas, descriptionHash);\\n }\\n\\n function _executor()\\n internal\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (address)\\n {\\n return super._executor();\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(Governor, GovernorTimelockControl)\\n returns (bool)\\n {\\n return super.supportsInterface(interfaceId);\\n }\\n}\\n\",\"keccak256\":\"0x1713670032ac0e6e45120b9ea97b9727a23883448ec04fc1f6722a7c8520c8be\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101606040526001600d553480156200001757600080fd5b506040516200a4a93803806200a4a983398181016040528101906200003d919062000bff565b818187858a898960006040518060400160405280601081526020017f476f7665726e6572436f6e747261637400000000000000000000000000000000815250806200008d6200022660201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620000f68184846200026360201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050806000908162000150919062000f22565b505062000163836200029f60201b60201c565b6200017482620002e660201b60201c565b62000185816200037360201b60201c565b5050508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff168152505050620001cf81620003ba60201b60201c565b50620001e1816200059960201b60201c565b5062000202620001f66200063a60201b60201c565b6200064260201b60201c565b42600e8190555080600f81905550816010819055505050505050505050506200142d565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b600083838346306040516020016200028095949392919062001046565b6040516020818303038152906040528051906020012090509392505050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a9360045482604051620002d4929190620010a3565b60405180910390a18060048190555050565b600081116200032c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003239062001157565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e88286005548260405162000361929190620010a3565b60405180910390a18060058190555050565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051620003a8929190620010a3565b60405180910390a18060068190555050565b620003ca6200070860201b60201c565b8111156200040f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004069062001215565b60405180910390fd5b6000620004216200071160201b60201c565b9050600081141580156200043d57506000600960000180549050145b156200053d5760096000016040518060400160405280600063ffffffff16815260200162000476846200074960201b62003abd1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b62000558826009620007b760201b62003b281790919060201c565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b463399781836040516200058d929190620010a3565b60405180910390a15050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051620005ee92919062001237565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006064905090565b6000806009600001805490501462000740576200073a6009620009f560201b62003d2a1760201c565b62000744565b6008545b905090565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115620007af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007a690620012da565b60405180910390fd5b819050919050565b6000806000846000018054905090506000620007d986620009f560201b60201c565b90506000821180156200083557504386600001600184620007fb91906200132b565b815481106200080f576200080e62001366565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008d95762000851856200074960201b62003abd1760201c565b866000016001846200086491906200132b565b8154811062000878576200087762001366565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009e6565b856000016040518060400160405280620008fe4362000a9760201b62003dc51760201c565b63ffffffff1681526020016200091f886200074960201b62003abd1760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b600080826000018054905090506000811462000a6e578260000160018262000a1e91906200132b565b8154811062000a325762000a3162001366565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1662000a71565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff801682111562000ae5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000adc906200140b565b60405180910390fd5b819050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b1f8262000af2565b9050919050565b600062000b338262000b12565b9050919050565b62000b458162000b26565b811462000b5157600080fd5b50565b60008151905062000b658162000b3a565b92915050565b600062000b788262000af2565b9050919050565b600062000b8c8262000b6b565b9050919050565b62000b9e8162000b7f565b811462000baa57600080fd5b50565b60008151905062000bbe8162000b93565b92915050565b6000819050919050565b62000bd98162000bc4565b811462000be557600080fd5b50565b60008151905062000bf98162000bce565b92915050565b600080600080600080600060e0888a03121562000c215762000c2062000aed565b5b600062000c318a828b0162000b54565b975050602062000c448a828b0162000bad565b965050604062000c578a828b0162000be8565b955050606062000c6a8a828b0162000be8565b945050608062000c7d8a828b0162000be8565b93505060a062000c908a828b0162000be8565b92505060c062000ca38a828b0162000be8565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d3457607f821691505b60208210810362000d4a5762000d4962000cec565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000db47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000d75565b62000dc0868362000d75565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000e0362000dfd62000df78462000bc4565b62000dd8565b62000bc4565b9050919050565b6000819050919050565b62000e1f8362000de2565b62000e3762000e2e8262000e0a565b84845462000d82565b825550505050565b600090565b62000e4e62000e3f565b62000e5b81848462000e14565b505050565b5b8181101562000e835762000e7760008262000e44565b60018101905062000e61565b5050565b601f82111562000ed25762000e9c8162000d50565b62000ea78462000d65565b8101602085101562000eb7578190505b62000ecf62000ec68562000d65565b83018262000e60565b50505b505050565b600082821c905092915050565b600062000ef76000198460080262000ed7565b1980831691505092915050565b600062000f12838362000ee4565b9150826002028217905092915050565b62000f2d8262000cb2565b67ffffffffffffffff81111562000f495762000f4862000cbd565b5b62000f55825462000d1b565b62000f6282828562000e87565b600060209050601f83116001811462000f9a576000841562000f85578287015190505b62000f91858262000f04565b86555062001001565b601f19841662000faa8662000d50565b60005b8281101562000fd45784890151825560018201915060208501945060208101905062000fad565b8683101562000ff4578489015162000ff0601f89168262000ee4565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6200101e8162001009565b82525050565b6200102f8162000bc4565b82525050565b620010408162000b12565b82525050565b600060a0820190506200105d600083018862001013565b6200106c602083018762001013565b6200107b604083018662001013565b6200108a606083018562001024565b62001099608083018462001035565b9695505050505050565b6000604082019050620010ba600083018562001024565b620010c9602083018462001024565b9392505050565b600082825260208201905092915050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006200113f602783620010d0565b91506200114c82620010e1565b604082019050919050565b60006020820190508181036000830152620011728162001130565b9050919050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b6000620011fd604383620010d0565b91506200120a8262001179565b606082019050919050565b600060208201905081810360008301526200123081620011ee565b9050919050565b60006040820190506200124e600083018562001035565b6200125d602083018462001035565b9392505050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620012c2602783620010d0565b9150620012cf8262001264565b604082019050919050565b60006020820190508181036000830152620012f581620012b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620013388262000bc4565b9150620013458362000bc4565b925082820390508181111562001360576200135f620012fc565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620013f3602683620010d0565b9150620014008262001395565b604082019050919050565b600060208201905081810360008301526200142681620013e4565b9050919050565b60805160a05160c05160e05161010051610120516101405161901362001496600039600081816139c201528181614cb50152614f29015260006151ef0152600061523101526000615210015260006151450152600061519b015260006151c401526190136000f3fe6080604052600436106104825760003560e01c8063794d556011610255578063bd1c9e4911610144578063deaaa7cc116100c1578063ece40cc111610085578063ece40cc114611464578063f23a6e611461148d578063f2fde38b146114ca578063f8ce560a146114f3578063fc0c546a14611530578063fea856a11461155b576104c8565b8063deaaa7cc14611358578063e0c410cc14611383578063e8405801146113c0578063ea0217cf146113fe578063eb9019d414611427576104c8565b8063ca1d209d11610108578063ca1d209d1461126c578063cf68625914611288578063d33219b4146112c5578063dc73204b146112f0578063dd4e2ba51461132d576104c8565b8063bd1c9e4914611161578063c01f9e371461118c578063c0d55329146111c9578063c28bc2fa14611206578063c59057e41461122f576104c8565b806397c3d334116101d2578063abe1aae611610196578063abe1aae614611042578063b58131b01461107f578063b59d18a0146110aa578063bba9c219146110e7578063bc197c8114611124576104c8565b806397c3d33414610f495780639a802a6d14610f74578063a7713a7014610fb1578063a890c91014610fdc578063ab58fb8e14611005576104c8565b806387030f4d1161021957806387030f4d14610e505780638da5cb5b14610e795780638fb5548f14610ea4578063902bfa2414610ee157806396aa167e14610f1e576104c8565b8063794d556014610d315780637b3c71d314610d6e5780637d5e81e214610dab578063809b268e14610de8578063868661cb14610e25576104c8565b80633fafa127116103715780635b6b4652116102ee5780636ee8e8ef116102b25780636ee8e8ef14610c3a57806370084d7a14610c7757806370b0f66014610cb457806370c753f014610cdd578063715018a614610d1a576104c8565b80635b6b465214610b085780635ced7d4014610b455780635f398a1414610b8257806360c4247f14610bbf5780636e04ff0d14610bfc576104c8565b80634fac2bb7116103355780634fac2bb7146109f9578063535bf50f14610a36578063544ffc9c14610a6157806354fd4d5014610aa05780635678138814610acb576104c8565b80633fafa127146108ee5780633fd1c809146109195780634385963214610956578063446a156f146109935780634585e33b146109d0576104c8565b8063160cbed7116103ff5780633932abb1116103c35780633932abb1146107f55780633bccf4fd146108205780633be2f2a31461085d5780633e4f49e6146108865780633f3b3b27146108c3576104c8565b8063160cbed7146106e35780632656227d146107205780632d63f693146107505780632fe3e2611461078d57806335debf2d146107b8576104c8565b80630cee1725116104465780630cee1725146105c6578063141a6c22146105ef578063148038b01461062c578063150b7a0214610669578063156277be146106a6576104c8565b806301ffc9a7146104cd57806302a251a31461050a578063034201811461053557806306f3f9e61461057257806306fdde031461059b576104c8565b366104c8573073ffffffffffffffffffffffffffffffffffffffff166104a6611565565b73ffffffffffffffffffffffffffffffffffffffff16146104c657600080fd5b005b600080fd5b3480156104d957600080fd5b506104f460048036038101906104ef9190615e9e565b611574565b6040516105019190615ee6565b60405180910390f35b34801561051657600080fd5b5061051f611586565b60405161052c9190615f1a565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190616176565b611595565b6040516105699190615f1a565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190616254565b61167a565b005b3480156105a757600080fd5b506105b0611771565b6040516105bd9190616300565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190616254565b611803565b005b3480156105fb57600080fd5b50610616600480360381019061061191906163c3565b611a1f565b6040516106239190615f1a565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e919061646a565b611a47565b6040516106609190615f1a565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b91906164aa565b611a6c565b60405161069d919061653c565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190616254565b611a80565b6040516106da9190616566565b60405180910390f35b3480156106ef57600080fd5b5061070a600480360381019061070591906167e8565b611ab3565b6040516107179190615f1a565b60405180910390f35b61073a600480360381019061073591906167e8565b611d6d565b6040516107479190615f1a565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190616254565b611eba565b6040516107849190615f1a565b60405180910390f35b34801561079957600080fd5b506107a2611f28565b6040516107af91906168b2565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da91906168cd565b611f4c565b6040516107ec91906169b8565b60405180910390f35b34801561080157600080fd5b5061080a611fe3565b6040516108179190615f1a565b60405180910390f35b34801561082c57600080fd5b50610847600480360381019061084291906169da565b611ff2565b6040516108549190615f1a565b60405180910390f35b34801561086957600080fd5b50610884600480360381019061087f9190616a55565b61207c565b005b34801561089257600080fd5b506108ad60048036038101906108a89190616254565b6122e9565b6040516108ba9190616b4f565b60405180910390f35b3480156108cf57600080fd5b506108d86122fb565b6040516108e59190615f1a565b60405180910390f35b3480156108fa57600080fd5b50610903612301565b6040516109109190615f1a565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b9190616254565b612307565b60405161094d9190615f1a565b60405180910390f35b34801561096257600080fd5b5061097d6004803603810190610978919061646a565b612361565b60405161098a9190615ee6565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190616254565b6123cc565b6040516109c79190616bb2565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190616c23565b6123f6565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190616254565b612702565b604051610a2d9190615ee6565b60405180910390f35b348015610a4257600080fd5b50610a4b612722565b604051610a589190615f1a565b60405180910390f35b348015610a6d57600080fd5b50610a886004803603810190610a839190616254565b61272c565b604051610a9793929190616c70565b60405180910390f35b348015610aac57600080fd5b50610ab5612764565b604051610ac29190616300565b60405180910390f35b348015610ad757600080fd5b50610af26004803603810190610aed9190616ca7565b6127a1565b604051610aff9190615f1a565b60405180910390f35b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190616254565b6127d2565b604051610b3c9190615f1a565b60405180910390f35b348015610b5157600080fd5b50610b6c6004803603810190610b679190616254565b6127ea565b604051610b799190615f1a565b60405180910390f35b348015610b8e57600080fd5b50610ba96004803603810190610ba49190616ce7565b612802565b604051610bb69190615f1a565b60405180910390f35b348015610bcb57600080fd5b50610be66004803603810190610be19190616254565b61286c565b604051610bf39190615f1a565b60405180910390f35b348015610c0857600080fd5b50610c236004803603810190610c1e9190616d8b565b6129b8565b604051610c31929190616e29565b60405180910390f35b348015610c4657600080fd5b50610c616004803603810190610c5c91906168cd565b612aa3565b604051610c6e9190615ee6565b60405180910390f35b348015610c8357600080fd5b50610c9e6004803603810190610c999190616254565b612ac3565b604051610cab9190616bb2565b60405180910390f35b348015610cc057600080fd5b50610cdb6004803603810190610cd69190616254565b612ae3565b005b348015610ce957600080fd5b50610d046004803603810190610cff9190616e59565b612bda565b604051610d119190615f1a565b60405180910390f35b348015610d2657600080fd5b50610d2f612c0b565b005b348015610d3d57600080fd5b50610d586004803603810190610d539190616254565b612c1f565b604051610d659190615f1a565b60405180910390f35b348015610d7a57600080fd5b50610d956004803603810190610d909190616e99565b612c37565b604051610da29190615f1a565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd9190616f0d565b612c9f565b604051610ddf9190615f1a565b60405180910390f35b348015610df457600080fd5b50610e0f6004803603810190610e0a9190616254565b612d3a565b604051610e1c9190615ee6565b60405180910390f35b348015610e3157600080fd5b50610e3a612d64565b604051610e479190615f1a565b60405180910390f35b348015610e5c57600080fd5b50610e776004803603810190610e729190616254565b612d6a565b005b348015610e8557600080fd5b50610e8e612e0d565b604051610e9b9190616566565b60405180910390f35b348015610eb057600080fd5b50610ecb6004803603810190610ec69190616254565b612e37565b604051610ed89190616300565b60405180910390f35b348015610eed57600080fd5b50610f086004803603810190610f039190616254565b612ed7565b604051610f159190615ee6565b60405180910390f35b348015610f2a57600080fd5b50610f33612ef7565b604051610f409190615f1a565b60405180910390f35b348015610f5557600080fd5b50610f5e612efd565b604051610f6b9190615f1a565b60405180910390f35b348015610f8057600080fd5b50610f9b6004803603810190610f969190616fe4565b612f06565b604051610fa89190615f1a565b60405180910390f35b348015610fbd57600080fd5b50610fc6612f1c565b604051610fd39190615f1a565b60405180910390f35b348015610fe857600080fd5b506110036004803603810190610ffe91906170a3565b612f45565b005b34801561101157600080fd5b5061102c60048036038101906110279190616254565b61303c565b6040516110399190615f1a565b60405180910390f35b34801561104e57600080fd5b5061106960048036038101906110649190616254565b613109565b6040516110769190616300565b60405180910390f35b34801561108b57600080fd5b506110946131ae565b6040516110a19190615f1a565b60405180910390f35b3480156110b657600080fd5b506110d160048036038101906110cc9190616254565b6131bd565b6040516110de9190615f1a565b60405180910390f35b3480156110f357600080fd5b5061110e60048036038101906111099190616254565b6131da565b60405161111b9190615f1a565b60405180910390f35b34801561113057600080fd5b5061114b600480360381019061114691906170d0565b6131f7565b604051611158919061653c565b60405180910390f35b34801561116d57600080fd5b5061117661320c565b6040516111839190615f1a565b60405180910390f35b34801561119857600080fd5b506111b360048036038101906111ae9190616254565b613216565b6040516111c09190615f1a565b60405180910390f35b3480156111d557600080fd5b506111f060048036038101906111eb91906168cd565b613284565b6040516111fd9190615ee6565b60405180910390f35b34801561121257600080fd5b5061122d6004803603810190611228919061719f565b6132da565b005b34801561123b57600080fd5b50611256600480360381019061125191906167e8565b61341b565b6040516112639190615f1a565b60405180910390f35b61128660048036038101906112819190616254565b613457565b005b34801561129457600080fd5b506112af60048036038101906112aa91906163c3565b6135a1565b6040516112bc9190615f1a565b60405180910390f35b3480156112d157600080fd5b506112da6135cf565b6040516112e79190616566565b60405180910390f35b3480156112fc57600080fd5b5061131760048036038101906113129190617213565b6135f9565b6040516113249190615f1a565b60405180910390f35b34801561133957600080fd5b5061134261361e565b60405161134f9190616300565b60405180910390f35b34801561136457600080fd5b5061136d61365b565b60405161137a91906168b2565b60405180910390f35b34801561138f57600080fd5b506113aa60048036038101906113a59190616254565b61367f565b6040516113b79190615ee6565b60405180910390f35b3480156113cc57600080fd5b506113e760048036038101906113e29190616254565b6136a9565b6040516113f5929190617253565b60405180910390f35b34801561140a57600080fd5b5061142560048036038101906114209190616254565b61370c565b005b34801561143357600080fd5b5061144e60048036038101906114499190616e59565b613803565b60405161145b9190615f1a565b60405180910390f35b34801561147057600080fd5b5061148b60048036038101906114869190616254565b61381f565b005b34801561149957600080fd5b506114b460048036038101906114af919061727c565b613916565b6040516114c1919061653c565b60405180910390f35b3480156114d657600080fd5b506114f160048036038101906114ec91906168cd565b61392b565b005b3480156114ff57600080fd5b5061151a60048036038101906115159190616254565b6139ae565b6040516115279190615f1a565b60405180910390f35b34801561153c57600080fd5b506115456139c0565b6040516115529190617372565b60405180910390f35b6115636139e4565b005b600061156f613e18565b905090565b600061157f82613e42565b9050919050565b6000611590613ebc565b905090565b6000806116186116107fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c6040516115d19291906173bd565b60405180910390208b805190602001206040516020016115f59594939291906173e5565b60405160208183030381529060405280519060200120613ec6565b868686613ee0565b905061166b8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613f0b565b91505098975050505050505050565b611682611565565b73ffffffffffffffffffffffffffffffffffffffff166116a06140c7565b73ffffffffffffffffffffffffffffffffffffffff16146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611715611565565b73ffffffffffffffffffffffffffffffffffffffff161461176557600061173a6140cf565b6040516117489291906173bd565b604051809103902090505b8061175e60026140dc565b0361175357505b61176e816141b8565b50565b606060008054611780906174d3565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac906174d3565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b5050505050905090565b6002600381111561181757611816616ad8565b5b601b600083815260200190815260200160002060009054906101000a900460ff16600381111561184a57611849616ad8565b5b036119ea5760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16826040516119209061752a565b60006040518083038185875af1925050503d806000811461195d576040519150601f19603f3d011682016040523d82523d6000602084013e611962565b606091505b505090508061199d576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d543373ffffffffffffffffffffffffffffffffffffffff167f370c08173448a868859170331cf95622fc6b9ca192121cc9aae246cf05b3ab7c60405160405180910390a35050611a1c565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000601482604051611a31919061757b565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611ac28686868661341b565b905060046007811115611ad857611ad7616ad8565b5b611ae1826122e9565b6007811115611af357611af2616ad8565b5b14611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a90617604565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190617639565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611c2c959493929190617878565b602060405180830381865afa158015611c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6d91906178f5565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611cea96959493929190617922565b600060405180830381600087803b158015611d0457600080fd5b505af1158015611d18573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611d4a91906179c7565b604051611d58929190617253565b60405180910390a18192505050949350505050565b600080611d7c8686868661341b565b90506000611d89826122e9565b905060046007811115611d9f57611d9e616ad8565b5b816007811115611db257611db1616ad8565b5b1480611de2575060056007811115611dcd57611dcc616ad8565b5b816007811115611de057611ddf616ad8565b5b145b611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890617604565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611e7e9190615f1a565b60405180910390a1611e93828888888861436c565b611ea0828888888861444f565b611ead8288888888614463565b8192505050949350505050565b6000611f17600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6060601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611fd757602002820191906000526020600020905b815481526020019060010190808311611fc3575b50505050509050919050565b6000611fed6144cc565b905090565b60008061205361204b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001612030939291906179fb565b60405160208183030381529060405280519060200120613ec6565b868686613ee0565b9050612070878288604051806020016040528060008152506144d6565b91505095945050505050565b6120846144f6565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612107576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561216b5761216a616ad8565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d546014856040516121b7919061757b565b9081526020016040518091039020819055508360156000600d54815260200190815260200160002090816121eb9190617bd4565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d60008154809291906122de90617ca6565b919050555050505050565b60006122f482614574565b9050919050565b600e5481565b600d5481565b60006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000612410604051806020016040528060008152506129b8565b5090508061244a576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008383906124599190617cf9565b60001c905060006011600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601860008281526020019081526020016000205460176000838152602001908152602001600020541115612692576001601b600083815260200190815260200160002060006101000a81548160ff0219169083600381111561251b5761251a616ad8565b5b021790555060006064600f5460176000858152602001908152602001600020546125459190617d58565b61254f9190617dc9565b9050600060176000848152602001908152602001600020819055506000601a600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516125c39061752a565b60006040518083038185875af1925050503d8060008114612600576040519150601f19603f3d011682016040523d82523d6000602084013e612605565b606091505b505090508061265e5760176000848152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016126559190615f1a565b60405180910390fd5b827f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a250506126fc565b6002601b600083815260200190815260200160002060006101000a81548160ff021916908360038111156126c9576126c8616ad8565b5b0217905550807f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b50505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806127ac6140c7565b90506127c9848285604051806020016040528060008152506144d6565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b60008061280d6140c7565b905061286087828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613f0b565b91505095945050505050565b60008060096000018054905090506000810361288d576008549150506129b3565b600060096000016001836128a19190617dfa565b815481106128b2576128b1617e2e565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161299a5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506129b3565b6129ae84600961474790919063ffffffff16565b925050505b919050565b600060606000600190505b600d548111612a9d5760006011600083815260200190815260200160002060009054906101000a900460ff16905060006013600084815260200190815260200160002054601260008581526020019081526020016000206000601360008781526020019081526020016000205481526020019081526020016000205442612a4a9190617dfa565b119050818015612a575750805b94508415612a885782604051602001612a709190617e7e565b60405160208183030381529060405293505050612a9d565b50508080612a9590617ca6565b9150506129c3565b50915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b612aeb611565565b73ffffffffffffffffffffffffffffffffffffffff16612b096140c7565b73ffffffffffffffffffffffffffffffffffffffff1614612b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5690617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612b7e611565565b73ffffffffffffffffffffffffffffffffffffffff1614612bce576000612ba36140cf565b604051612bb19291906173bd565b604051809103902090505b80612bc760026140dc565b03612bbc57505b612bd78161489f565b50565b601d6020528160005260406000208181548110612bf657600080fd5b90600052602060002001600091509150505481565b612c136144f6565b612c1d60006148e4565b565b60176020528060005260406000206000915090505481565b600080612c426140c7565b9050612c9486828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506144d6565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d24576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d30858585856149aa565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612d726144f6565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612e0557612e04616ad8565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612e56906174d3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e82906174d3565b8015612ecf5780601f10612ea457610100808354040283529160200191612ecf565b820191906000526020600020905b815481529060010190602001808311612eb257829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612f13848484614cb1565b90509392505050565b60008060096000018054905014612f3c57612f376009613d2a565b612f40565b6008545b905090565b612f4d611565565b73ffffffffffffffffffffffffffffffffffffffff16612f6b6140c7565b73ffffffffffffffffffffffffffffffffffffffff1614612fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb890617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612fe0611565565b73ffffffffffffffffffffffffffffffffffffffff16146130305760006130056140cf565b6040516130139291906173bd565b604051809103902090505b8061302960026140dc565b0361301e57505b61303981614d58565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b81526004016130ad91906168b2565b602060405180830381865afa1580156130ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ee9190617639565b9050600181146130fe5780613101565b60005b915050919050565b6060601560008381526020019081526020016000208054613129906174d3565b80601f0160208091040260200160405190810160405280929190818152602001828054613155906174d3565b80156131a25780601f10613177576101008083540402835291602001916131a2565b820191906000526020600020905b81548152906001019060200180831161318557829003601f168201915b50505050509050919050565b60006131b8614df7565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000600f54905090565b6000613273600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6132e2611565565b73ffffffffffffffffffffffffffffffffffffffff166133006140c7565b73ffffffffffffffffffffffffffffffffffffffff1614613356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334d90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16613375611565565b73ffffffffffffffffffffffffffffffffffffffff16146133c557600061339a6140cf565b6040516133a89291906173bd565b604051809103902090505b806133be60026140dc565b036133b357505b6134148483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085614e01565b5050505050565b6000848484846040516020016134349493929190617e99565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff166134af576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461350f91906179c7565b925050819055503460176000848152602001908152602001600020600082825461353991906179c7565b92505081905550604051806020016040528083815250601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090600161359c929190615dc8565b505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806012600084815260200190815260200160002060006013600086815260200190815260200160002054815260200190815260200160002054426136ef9190617dfa565b915060136000848152602001908152602001600020549050915091565b613714611565565b73ffffffffffffffffffffffffffffffffffffffff166137326140c7565b73ffffffffffffffffffffffffffffffffffffffff1614613788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377f90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166137a7611565565b73ffffffffffffffffffffffffffffffffffffffff16146137f75760006137cc6140cf565b6040516137da9291906173bd565b604051809103902090505b806137f060026140dc565b036137e557505b61380081614e30565b50565b60006138178383613812614eb8565b614cb1565b905092915050565b613827611565565b73ffffffffffffffffffffffffffffffffffffffff166138456140c7565b73ffffffffffffffffffffffffffffffffffffffff161461389b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389290617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166138ba611565565b73ffffffffffffffffffffffffffffffffffffffff161461390a5760006138df6140cf565b6040516138ed9291906173bd565b604051809103902090505b8061390360026140dc565b036138f857505b61391381614ecf565b50565b600063f23a6e6160e01b905095945050505050565b6139336144f6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036139a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399990617f65565b60405180910390fd5b6139ab816148e4565b50565b60006139b982614f14565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601054341015613a20576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1790617ff7565b60405180910390fd5b819050919050565b6000806000846000018054905090506000613b4286613d2a565b9050600082118015613b9857504386600001600184613b619190617dfa565b81548110613b7257613b71617e2e565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15613c2857613ba685613abd565b86600001600184613bb79190617dfa565b81548110613bc857613bc7617e2e565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613d1b565b856000016040518060400160405280613c4043613dc5565b63ffffffff168152602001613c5488613abd565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613d9c5782600001600182613d509190617dfa565b81548110613d6157613d60617e2e565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613d9f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115613e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e0790618089565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613eb55750613eb482614fdc565b5b9050919050565b6000600554905090565b6000613ed9613ed3615141565b8361525b565b9050919050565b6000806000613ef18787878761528e565b91509150613efe8161539a565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613f3757613f36616ad8565b5b613f40886122e9565b6007811115613f5257613f51616ad8565b5b14613f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f899061811b565b60405180910390fd5b6000613ff187613fe1846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff1686614cb1565b90506140008888888488615566565b6000845103614062578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051614055949392919061813b565b60405180910390a26140b9565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb871289888489896040516140b0959493929190618187565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b60006140e78261576a565b1561411e576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b6141c0612efd565b811115614202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141f990618280565b60405180910390fd5b600061420c612f1c565b90506000811415801561422757506000600960000180549050145b156143195760096000016040518060400160405280600063ffffffff16815260200161425284613abd565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b61432d826009613b2890919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051614360929190617253565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff1661438b611565565b73ffffffffffffffffffffffffffffffffffffffff16146144485760005b8451811015614446573073ffffffffffffffffffffffffffffffffffffffff168582815181106143dc576143db617e2e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036144355761443483828151811061441557614414617e2e565b5b602002602001015180519060200120600261579f90919063ffffffff16565b5b8061443f90617ca6565b90506143a9565b505b5050505050565b61445c858585858561581b565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff16614482611565565b73ffffffffffffffffffffffffffffffffffffffff16146144b7576144a7600261576a565b6144b6576144b560026158b9565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006144ec858585856144e7614eb8565b613f0b565b9050949350505050565b6144fe6140c7565b73ffffffffffffffffffffffffffffffffffffffff1661451c612e0d565b73ffffffffffffffffffffffffffffffffffffffff1614614572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614569906182ec565b60405180910390fd5b565b6000806145808361593a565b90506004600781111561459657614595616ad8565b5b8160078111156145a9576145a8616ad8565b5b146145b75780915050614742565b6000600b60008581526020019081526020016000205490506000801b81036145e3578192505050614742565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b815260040161463e91906168b2565b602060405180830381865afa15801561465b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467f9190618338565b1561468f57600792505050614742565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016146ea91906168b2565b602060405180830381865afa158015614707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061472b9190618338565b1561473b57600592505050614742565b6002925050505b919050565b600043821061478b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614782906183b1565b60405180910390fd5b60008360000180549050905060005b8181101561480f5760006147ae8284615a4e565b9050848660000182815481106147c7576147c6617e2e565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156147f957809250614809565b60018161480691906179c7565b91505b5061479a565b6000821461487457846000016001836148289190617dfa565b8154811061483957614838617e2e565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16614877565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516148d2929190617253565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006149b46131ae565b6149d16149bf6140c7565b6001436149cc9190617dfa565b613803565b1015614a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a0990618443565b60405180910390fd5b6000614a27868686868051906020012061341b565b90508451865114614a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a64906184d5565b60405180910390fd5b8351865114614ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aa8906184d5565b60405180910390fd5b6000865111614af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aec90618541565b60405180910390fd5b6000600160008381526020019081526020016000209050614b55816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050615a74565b614b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b8b906185d3565b60405180910390fd5b6000614ba6614ba1611fe3565b615a8e565b614baf43615a8e565b614bb99190618607565b90506000614bcd614bc8611586565b615a8e565b82614bd89190618607565b9050614bf08284600001615ae590919063ffffffff16565b614c068184600101615ae590919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614c306140c7565b8b8b8d5167ffffffffffffffff811115614c4d57614c4c616015565b5b604051908082528060200260200182016040528015614c8057816020015b6060815260200190600190039081614c6b5790505b508c88888e604051614c9a99989796959493929190618780565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401614d0e929190618830565b602060405180830381865afa158015614d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d4f9190617639565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051614dab929190618859565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b6060614e27848484604051806060016040528060298152602001618fb560299139615b14565b90509392505050565b60008111614e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614e6a906188f4565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614ea6929190617253565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614f02929190617253565b60405180910390a18060068190555050565b6000614f1e612efd565b614f278361286c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614f809190615f1a565b602060405180830381865afa158015614f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fc19190617639565b614fcb9190617d58565b614fd59190617dc9565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806150c257507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061512a57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061513a575061513982615c28565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156151bd57507f000000000000000000000000000000000000000000000000000000000000000046145b156151ea577f00000000000000000000000000000000000000000000000000000000000000009050615258565b6152557f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000615c92565b90505b90565b60008282604051602001615270929190618981565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156152c9576000600391509150615391565b601b8560ff16141580156152e15750601c8560ff1614155b156152f3576000600491509150615391565b60006001878787876040516000815260200160405260405161531894939291906189b8565b6020604051602081039080840390855afa15801561533a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361538857600060019250925050615391565b80600092509250505b94509492505050565b600060048111156153ae576153ad616ad8565b5b8160048111156153c1576153c0616ad8565b5b031561556357600160048111156153db576153da616ad8565b5b8160048111156153ee576153ed616ad8565b5b0361542e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161542590618a49565b60405180910390fd5b6002600481111561544257615441616ad8565b5b81600481111561545557615454616ad8565b5b03615495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161548c90618ab5565b60405180910390fd5b600360048111156154a9576154a8616ad8565b5b8160048111156154bc576154bb616ad8565b5b036154fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016154f390618b47565b60405180910390fd5b60048081111561550f5761550e616ad8565b5b81600481111561552257615521616ad8565b5b03615562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161555990618bd9565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561560c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161560390618c6b565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561567a57615679616ad8565b5b60ff168460ff16036156a6578281600001600082825461569a91906179c7565b92505081905550615762565b600160028111156156ba576156b9616ad8565b5b60ff168460ff16036156e657828160010160008282546156da91906179c7565b92505081905550615761565b6002808111156156f9576156f8616ad8565b5b60ff168460ff1603615725578281600201600082825461571991906179c7565b92505081905550615760565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161575790618cfd565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401615880959493929190617878565b6000604051808303818588803b15801561589957600080fd5b505af11580156158ad573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615615973576007915050615a49565b8060020160019054906101000a900460ff1615615994576002915050615a49565b600061599f84611eba565b9050600081036159e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159db90618d69565b60405180910390fd5b4381106159f657600092505050615a49565b6000615a0185613216565b9050438110615a165760019350505050615a49565b615a1f85615ccc565b8015615a305750615a2f85615d13565b5b15615a415760049350505050615a49565b600393505050505b919050565b60006002828418615a5f9190617dc9565b828416615a6c91906179c7565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115615add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615ad490618dfb565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b5090618e8d565b60405180910390fd5b615b6285615d3e565b615ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b9890618ef9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615bca9190618f4a565b60006040518083038185875af1925050503d8060008114615c07576040519150601f19603f3d011682016040523d82523d6000602084013e615c0c565b606091505b5091509150615c1c828286615d61565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615cad959493929190618f61565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154615cf891906179c7565b615d09615d0485611eba565b6139ae565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315615d7157829050615dc1565b600083511115615d845782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615db89190616300565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215615e04579160200282015b82811115615e03578251825591602001919060010190615de8565b5b509050615e119190615e15565b5090565b5b80821115615e2e576000816000905550600101615e16565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b615e7b81615e46565b8114615e8657600080fd5b50565b600081359050615e9881615e72565b92915050565b600060208284031215615eb457615eb3615e3c565b5b6000615ec284828501615e89565b91505092915050565b60008115159050919050565b615ee081615ecb565b82525050565b6000602082019050615efb6000830184615ed7565b92915050565b6000819050919050565b615f1481615f01565b82525050565b6000602082019050615f2f6000830184615f0b565b92915050565b615f3e81615f01565b8114615f4957600080fd5b50565b600081359050615f5b81615f35565b92915050565b600060ff82169050919050565b615f7781615f61565b8114615f8257600080fd5b50565b600081359050615f9481615f6e565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615fbf57615fbe615f9a565b5b8235905067ffffffffffffffff811115615fdc57615fdb615f9f565b5b602083019150836001820283011115615ff857615ff7615fa4565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61604d82616004565b810181811067ffffffffffffffff8211171561606c5761606b616015565b5b80604052505050565b600061607f615e32565b905061608b8282616044565b919050565b600067ffffffffffffffff8211156160ab576160aa616015565b5b6160b482616004565b9050602081019050919050565b82818337600083830152505050565b60006160e36160de84616090565b616075565b9050828152602081018484840111156160ff576160fe615fff565b5b61610a8482856160c1565b509392505050565b600082601f83011261612757616126615f9a565b5b81356161378482602086016160d0565b91505092915050565b6000819050919050565b61615381616140565b811461615e57600080fd5b50565b6000813590506161708161614a565b92915050565b60008060008060008060008060e0898b03121561619657616195615e3c565b5b60006161a48b828c01615f4c565b98505060206161b58b828c01615f85565b975050604089013567ffffffffffffffff8111156161d6576161d5615e41565b5b6161e28b828c01615fa9565b9650965050606089013567ffffffffffffffff81111561620557616204615e41565b5b6162118b828c01616112565b94505060806162228b828c01615f85565b93505060a06162338b828c01616161565b92505060c06162448b828c01616161565b9150509295985092959890939650565b60006020828403121561626a57616269615e3c565b5b600061627884828501615f4c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156162bb5780820151818401526020810190506162a0565b60008484015250505050565b60006162d282616281565b6162dc818561628c565b93506162ec81856020860161629d565b6162f581616004565b840191505092915050565b6000602082019050818103600083015261631a81846162c7565b905092915050565b600067ffffffffffffffff82111561633d5761633c616015565b5b61634682616004565b9050602081019050919050565b600061636661636184616322565b616075565b90508281526020810184848401111561638257616381615fff565b5b61638d8482856160c1565b509392505050565b600082601f8301126163aa576163a9615f9a565b5b81356163ba848260208601616353565b91505092915050565b6000602082840312156163d9576163d8615e3c565b5b600082013567ffffffffffffffff8111156163f7576163f6615e41565b5b61640384828501616395565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006164378261640c565b9050919050565b6164478161642c565b811461645257600080fd5b50565b6000813590506164648161643e565b92915050565b6000806040838503121561648157616480615e3c565b5b600061648f85828601615f4c565b92505060206164a085828601616455565b9150509250929050565b600080600080608085870312156164c4576164c3615e3c565b5b60006164d287828801616455565b94505060206164e387828801616455565b93505060406164f487828801615f4c565b925050606085013567ffffffffffffffff81111561651557616514615e41565b5b61652187828801616112565b91505092959194509250565b61653681615e46565b82525050565b6000602082019050616551600083018461652d565b92915050565b6165608161642c565b82525050565b600060208201905061657b6000830184616557565b92915050565b600067ffffffffffffffff82111561659c5761659b616015565b5b602082029050602081019050919050565b60006165c06165bb84616581565b616075565b905080838252602082019050602084028301858111156165e3576165e2615fa4565b5b835b8181101561660c57806165f88882616455565b8452602084019350506020810190506165e5565b5050509392505050565b600082601f83011261662b5761662a615f9a565b5b813561663b8482602086016165ad565b91505092915050565b600067ffffffffffffffff82111561665f5761665e616015565b5b602082029050602081019050919050565b600061668361667e84616644565b616075565b905080838252602082019050602084028301858111156166a6576166a5615fa4565b5b835b818110156166cf57806166bb8882615f4c565b8452602084019350506020810190506166a8565b5050509392505050565b600082601f8301126166ee576166ed615f9a565b5b81356166fe848260208601616670565b91505092915050565b600067ffffffffffffffff82111561672257616721616015565b5b602082029050602081019050919050565b600061674661674184616707565b616075565b9050808382526020820190506020840283018581111561676957616768615fa4565b5b835b818110156167b057803567ffffffffffffffff81111561678e5761678d615f9a565b5b80860161679b8982616112565b8552602085019450505060208101905061676b565b5050509392505050565b600082601f8301126167cf576167ce615f9a565b5b81356167df848260208601616733565b91505092915050565b6000806000806080858703121561680257616801615e3c565b5b600085013567ffffffffffffffff8111156168205761681f615e41565b5b61682c87828801616616565b945050602085013567ffffffffffffffff81111561684d5761684c615e41565b5b616859878288016166d9565b935050604085013567ffffffffffffffff81111561687a57616879615e41565b5b616886878288016167ba565b925050606061689787828801616161565b91505092959194509250565b6168ac81616140565b82525050565b60006020820190506168c760008301846168a3565b92915050565b6000602082840312156168e3576168e2615e3c565b5b60006168f184828501616455565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61692f81615f01565b82525050565b60006169418383616926565b60208301905092915050565b6000602082019050919050565b6000616965826168fa565b61696f8185616905565b935061697a83616916565b8060005b838110156169ab5781516169928882616935565b975061699d8361694d565b92505060018101905061697e565b5085935050505092915050565b600060208201905081810360008301526169d2818461695a565b905092915050565b600080600080600060a086880312156169f6576169f5615e3c565b5b6000616a0488828901615f4c565b9550506020616a1588828901615f85565b9450506040616a2688828901615f85565b9350506060616a3788828901616161565b9250506080616a4888828901616161565b9150509295509295909350565b60008060008060808587031215616a6f57616a6e615e3c565b5b600085013567ffffffffffffffff811115616a8d57616a8c615e41565b5b616a9987828801616395565b9450506020616aaa87828801615f4c565b9350506040616abb87828801615f4c565b9250506060616acc87828801616455565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110616b1857616b17616ad8565b5b50565b6000819050616b2982616b07565b919050565b6000616b3982616b1b565b9050919050565b616b4981616b2e565b82525050565b6000602082019050616b646000830184616b40565b92915050565b60048110616b7b57616b7a616ad8565b5b50565b6000819050616b8c82616b6a565b919050565b6000616b9c82616b7e565b9050919050565b616bac81616b91565b82525050565b6000602082019050616bc76000830184616ba3565b92915050565b60008083601f840112616be357616be2615f9a565b5b8235905067ffffffffffffffff811115616c0057616bff615f9f565b5b602083019150836001820283011115616c1c57616c1b615fa4565b5b9250929050565b60008060208385031215616c3a57616c39615e3c565b5b600083013567ffffffffffffffff811115616c5857616c57615e41565b5b616c6485828601616bcd565b92509250509250929050565b6000606082019050616c856000830186615f0b565b616c926020830185615f0b565b616c9f6040830184615f0b565b949350505050565b60008060408385031215616cbe57616cbd615e3c565b5b6000616ccc85828601615f4c565b9250506020616cdd85828601615f85565b9150509250929050565b600080600080600060808688031215616d0357616d02615e3c565b5b6000616d1188828901615f4c565b9550506020616d2288828901615f85565b945050604086013567ffffffffffffffff811115616d4357616d42615e41565b5b616d4f88828901615fa9565b9350935050606086013567ffffffffffffffff811115616d7257616d71615e41565b5b616d7e88828901616112565b9150509295509295909350565b600060208284031215616da157616da0615e3c565b5b600082013567ffffffffffffffff811115616dbf57616dbe615e41565b5b616dcb84828501616112565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000616dfb82616dd4565b616e058185616ddf565b9350616e1581856020860161629d565b616e1e81616004565b840191505092915050565b6000604082019050616e3e6000830185615ed7565b8181036020830152616e508184616df0565b90509392505050565b60008060408385031215616e7057616e6f615e3c565b5b6000616e7e85828601616455565b9250506020616e8f85828601615f4c565b9150509250929050565b60008060008060608587031215616eb357616eb2615e3c565b5b6000616ec187828801615f4c565b9450506020616ed287828801615f85565b935050604085013567ffffffffffffffff811115616ef357616ef2615e41565b5b616eff87828801615fa9565b925092505092959194509250565b60008060008060808587031215616f2757616f26615e3c565b5b600085013567ffffffffffffffff811115616f4557616f44615e41565b5b616f5187828801616616565b945050602085013567ffffffffffffffff811115616f7257616f71615e41565b5b616f7e878288016166d9565b935050604085013567ffffffffffffffff811115616f9f57616f9e615e41565b5b616fab878288016167ba565b925050606085013567ffffffffffffffff811115616fcc57616fcb615e41565b5b616fd887828801616395565b91505092959194509250565b600080600060608486031215616ffd57616ffc615e3c565b5b600061700b86828701616455565b935050602061701c86828701615f4c565b925050604084013567ffffffffffffffff81111561703d5761703c615e41565b5b61704986828701616112565b9150509250925092565b600061705e8261640c565b9050919050565b600061707082617053565b9050919050565b61708081617065565b811461708b57600080fd5b50565b60008135905061709d81617077565b92915050565b6000602082840312156170b9576170b8615e3c565b5b60006170c78482850161708e565b91505092915050565b600080600080600060a086880312156170ec576170eb615e3c565b5b60006170fa88828901616455565b955050602061710b88828901616455565b945050604086013567ffffffffffffffff81111561712c5761712b615e41565b5b617138888289016166d9565b935050606086013567ffffffffffffffff81111561715957617158615e41565b5b617165888289016166d9565b925050608086013567ffffffffffffffff81111561718657617185615e41565b5b61719288828901616112565b9150509295509295909350565b600080600080606085870312156171b9576171b8615e3c565b5b60006171c787828801616455565b94505060206171d887828801615f4c565b935050604085013567ffffffffffffffff8111156171f9576171f8615e41565b5b61720587828801616bcd565b925092505092959194509250565b6000806040838503121561722a57617229615e3c565b5b600061723885828601615f4c565b925050602061724985828601615f4c565b9150509250929050565b60006040820190506172686000830185615f0b565b6172756020830184615f0b565b9392505050565b600080600080600060a0868803121561729857617297615e3c565b5b60006172a688828901616455565b95505060206172b788828901616455565b94505060406172c888828901615f4c565b93505060606172d988828901615f4c565b925050608086013567ffffffffffffffff8111156172fa576172f9615e41565b5b61730688828901616112565b9150509295509295909350565b6000819050919050565b600061733861733361732e8461640c565b617313565b61640c565b9050919050565b600061734a8261731d565b9050919050565b600061735c8261733f565b9050919050565b61736c81617351565b82525050565b60006020820190506173876000830184617363565b92915050565b600081905092915050565b60006173a4838561738d565b93506173b18385846160c1565b82840190509392505050565b60006173ca828486617398565b91508190509392505050565b6173df81615f61565b82525050565b600060a0820190506173fa60008301886168a3565b6174076020830187615f0b565b61741460408301866173d6565b61742160608301856168a3565b61742e60808301846168a3565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b600061746e60188361628c565b915061747982617438565b602082019050919050565b6000602082019050818103600083015261749d81617461565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806174eb57607f821691505b6020821081036174fe576174fd6174a4565b5b50919050565b50565b600061751460008361738d565b915061751f82617504565b600082019050919050565b600061753582617507565b9150819050919050565b600081905092915050565b600061755582616281565b61755f818561753f565b935061756f81856020860161629d565b80840191505092915050565b6000617587828461754a565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006175ee60218361628c565b91506175f982617592565b604082019050919050565b6000602082019050818103600083015261761d816175e1565b9050919050565b60008151905061763381615f35565b92915050565b60006020828403121561764f5761764e615e3c565b5b600061765d84828501617624565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61769b8161642c565b82525050565b60006176ad8383617692565b60208301905092915050565b6000602082019050919050565b60006176d182617666565b6176db8185617671565b93506176e683617682565b8060005b838110156177175781516176fe88826176a1565b9750617709836176b9565b9250506001810190506176ea565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061776c82616dd4565b6177768185617750565b935061778681856020860161629d565b61778f81616004565b840191505092915050565b60006177a68383617761565b905092915050565b6000602082019050919050565b60006177c682617724565b6177d0818561772f565b9350836020820285016177e285617740565b8060005b8581101561781e57848403895281516177ff858261779a565b945061780a836177ae565b925060208a019950506001810190506177e6565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061786261785d61785884617830565b61783a565b616140565b9050919050565b61787281617847565b82525050565b600060a082019050818103600083015261789281886176c6565b905081810360208301526178a6818761695a565b905081810360408301526178ba81866177bb565b90506178c96060830185617869565b6178d660808301846168a3565b9695505050505050565b6000815190506178ef8161614a565b92915050565b60006020828403121561790b5761790a615e3c565b5b6000617919848285016178e0565b91505092915050565b600060c082019050818103600083015261793c81896176c6565b90508181036020830152617950818861695a565b9050818103604083015261796481876177bb565b90506179736060830186617869565b61798060808301856168a3565b61798d60a0830184615f0b565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006179d282615f01565b91506179dd83615f01565b92508282019050808211156179f5576179f4617998565b5b92915050565b6000606082019050617a1060008301866168a3565b617a1d6020830185615f0b565b617a2a60408301846173d6565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302617a947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617a57565b617a9e8683617a57565b95508019841693508086168417925050509392505050565b6000617ad1617acc617ac784615f01565b617313565b615f01565b9050919050565b6000819050919050565b617aeb83617ab6565b617aff617af782617ad8565b848454617a64565b825550505050565b600090565b617b14617b07565b617b1f818484617ae2565b505050565b5b81811015617b4357617b38600082617b0c565b600181019050617b25565b5050565b601f821115617b8857617b5981617a32565b617b6284617a47565b81016020851015617b71578190505b617b85617b7d85617a47565b830182617b24565b50505b505050565b600082821c905092915050565b6000617bab60001984600802617b8d565b1980831691505092915050565b6000617bc48383617b9a565b9150826002028217905092915050565b617bdd82616281565b67ffffffffffffffff811115617bf657617bf5616015565b5b617c0082546174d3565b617c0b828285617b47565b600060209050601f831160018114617c3e5760008415617c2c578287015190505b617c368582617bb8565b865550617c9e565b601f198416617c4c86617a32565b60005b82811015617c7457848901518255600182019150602085019450602081019050617c4f565b86831015617c915784890151617c8d601f891682617b9a565b8355505b6001600288020188555050505b505050505050565b6000617cb182615f01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203617ce357617ce2617998565b5b600182019050919050565b600082905092915050565b6000617d058383617cee565b82617d108135616140565b92506020821015617d5057617d4b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802617a57565b831692505b505092915050565b6000617d6382615f01565b9150617d6e83615f01565b9250828202617d7c81615f01565b91508282048414831517617d9357617d92617998565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000617dd482615f01565b9150617ddf83615f01565b925082617def57617dee617d9a565b5b828204905092915050565b6000617e0582615f01565b9150617e1083615f01565b9250828203905081811115617e2857617e27617998565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b617e78617e7382615f01565b617e5d565b82525050565b6000617e8a8284617e67565b60208201915081905092915050565b60006080820190508181036000830152617eb381876176c6565b90508181036020830152617ec7818661695a565b90508181036040830152617edb81856177bb565b9050617eea60608301846168a3565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000617f4f60268361628c565b9150617f5a82617ef3565b604082019050919050565b60006020820190508181036000830152617f7e81617f42565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617fe160278361628c565b9150617fec82617f85565b604082019050919050565b6000602082019050818103600083015261801081617fd4565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b600061807360268361628c565b915061807e82618017565b604082019050919050565b600060208201905081810360008301526180a281618066565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b600061810560238361628c565b9150618110826180a9565b604082019050919050565b60006020820190508181036000830152618134816180f8565b9050919050565b60006080820190506181506000830187615f0b565b61815d60208301866173d6565b61816a6040830185615f0b565b818103606083015261817c81846162c7565b905095945050505050565b600060a08201905061819c6000830188615f0b565b6181a960208301876173d6565b6181b66040830186615f0b565b81810360608301526181c881856162c7565b905081810360808301526181dc8184616df0565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b600061826a60438361628c565b9150618275826181e8565b606082019050919050565b600060208201905081810360008301526182998161825d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006182d660208361628c565b91506182e1826182a0565b602082019050919050565b60006020820190508181036000830152618305816182c9565b9050919050565b61831581615ecb565b811461832057600080fd5b50565b6000815190506183328161830c565b92915050565b60006020828403121561834e5761834d615e3c565b5b600061835c84828501618323565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b600061839b60208361628c565b91506183a682618365565b602082019050919050565b600060208201905081810360008301526183ca8161838e565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b600061842d60318361628c565b9150618438826183d1565b604082019050919050565b6000602082019050818103600083015261845c81618420565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006184bf60218361628c565b91506184ca82618463565b604082019050919050565b600060208201905081810360008301526184ee816184b2565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b600061852b60188361628c565b9150618536826184f5565b602082019050919050565b6000602082019050818103600083015261855a8161851e565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006185bd60218361628c565b91506185c882618561565b604082019050919050565b600060208201905081810360008301526185ec816185b0565b9050919050565b600067ffffffffffffffff82169050919050565b6000618612826185f3565b915061861d836185f3565b9250828201905067ffffffffffffffff81111561863d5761863c617998565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061868b82616281565b618695818561866f565b93506186a581856020860161629d565b6186ae81616004565b840191505092915050565b60006186c58383618680565b905092915050565b6000602082019050919050565b60006186e582618643565b6186ef818561864e565b9350836020820285016187018561865f565b8060005b8581101561873d578484038952815161871e85826186b9565b9450618729836186cd565b925060208a01995050600181019050618705565b50829750879550505050505092915050565b600061876a618765618760846185f3565b617313565b615f01565b9050919050565b61877a8161874f565b82525050565b600061012082019050618796600083018c615f0b565b6187a3602083018b616557565b81810360408301526187b5818a6176c6565b905081810360608301526187c9818961695a565b905081810360808301526187dd81886186da565b905081810360a08301526187f181876177bb565b905061880060c0830186618771565b61880d60e0830185618771565b81810361010083015261882081846162c7565b90509a9950505050505050505050565b60006040820190506188456000830185616557565b6188526020830184615f0b565b9392505050565b600060408201905061886e6000830185616557565b61887b6020830184616557565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006188de60278361628c565b91506188e982618882565b604082019050919050565b6000602082019050818103600083015261890d816188d1565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061894a60028361753f565b915061895582618914565b600282019050919050565b6000819050919050565b61897b61897682616140565b618960565b82525050565b600061898c8261893d565b9150618998828561896a565b6020820191506189a8828461896a565b6020820191508190509392505050565b60006080820190506189cd60008301876168a3565b6189da60208301866173d6565b6189e760408301856168a3565b6189f460608301846168a3565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000618a3360188361628c565b9150618a3e826189fd565b602082019050919050565b60006020820190508181036000830152618a6281618a26565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618a9f601f8361628c565b9150618aaa82618a69565b602082019050919050565b60006020820190508181036000830152618ace81618a92565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618b3160228361628c565b9150618b3c82618ad5565b604082019050919050565b60006020820190508181036000830152618b6081618b24565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618bc360228361628c565b9150618bce82618b67565b604082019050919050565b60006020820190508181036000830152618bf281618bb6565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b6000618c5560278361628c565b9150618c6082618bf9565b604082019050919050565b60006020820190508181036000830152618c8481618c48565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b6000618ce760358361628c565b9150618cf282618c8b565b604082019050919050565b60006020820190508181036000830152618d1681618cda565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b6000618d53601d8361628c565b9150618d5e82618d1d565b602082019050919050565b60006020820190508181036000830152618d8281618d46565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b6000618de560268361628c565b9150618df082618d89565b604082019050919050565b60006020820190508181036000830152618e1481618dd8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000618e7760268361628c565b9150618e8282618e1b565b604082019050919050565b60006020820190508181036000830152618ea681618e6a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618ee3601d8361628c565b9150618eee82618ead565b602082019050919050565b60006020820190508181036000830152618f1281618ed6565b9050919050565b6000618f2482616dd4565b618f2e818561738d565b9350618f3e81856020860161629d565b80840191505092915050565b6000618f568284618f19565b915081905092915050565b600060a082019050618f7660008301886168a3565b618f8360208301876168a3565b618f9060408301866168a3565b618f9d6060830185615f0b565b618faa6080830184616557565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220e4c4ef21389682e5feb911735f43d26b7f768b1c9cb28c392aa5dda9dbadea4264736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106104825760003560e01c8063794d556011610255578063bd1c9e4911610144578063deaaa7cc116100c1578063ece40cc111610085578063ece40cc114611464578063f23a6e611461148d578063f2fde38b146114ca578063f8ce560a146114f3578063fc0c546a14611530578063fea856a11461155b576104c8565b8063deaaa7cc14611358578063e0c410cc14611383578063e8405801146113c0578063ea0217cf146113fe578063eb9019d414611427576104c8565b8063ca1d209d11610108578063ca1d209d1461126c578063cf68625914611288578063d33219b4146112c5578063dc73204b146112f0578063dd4e2ba51461132d576104c8565b8063bd1c9e4914611161578063c01f9e371461118c578063c0d55329146111c9578063c28bc2fa14611206578063c59057e41461122f576104c8565b806397c3d334116101d2578063abe1aae611610196578063abe1aae614611042578063b58131b01461107f578063b59d18a0146110aa578063bba9c219146110e7578063bc197c8114611124576104c8565b806397c3d33414610f495780639a802a6d14610f74578063a7713a7014610fb1578063a890c91014610fdc578063ab58fb8e14611005576104c8565b806387030f4d1161021957806387030f4d14610e505780638da5cb5b14610e795780638fb5548f14610ea4578063902bfa2414610ee157806396aa167e14610f1e576104c8565b8063794d556014610d315780637b3c71d314610d6e5780637d5e81e214610dab578063809b268e14610de8578063868661cb14610e25576104c8565b80633fafa127116103715780635b6b4652116102ee5780636ee8e8ef116102b25780636ee8e8ef14610c3a57806370084d7a14610c7757806370b0f66014610cb457806370c753f014610cdd578063715018a614610d1a576104c8565b80635b6b465214610b085780635ced7d4014610b455780635f398a1414610b8257806360c4247f14610bbf5780636e04ff0d14610bfc576104c8565b80634fac2bb7116103355780634fac2bb7146109f9578063535bf50f14610a36578063544ffc9c14610a6157806354fd4d5014610aa05780635678138814610acb576104c8565b80633fafa127146108ee5780633fd1c809146109195780634385963214610956578063446a156f146109935780634585e33b146109d0576104c8565b8063160cbed7116103ff5780633932abb1116103c35780633932abb1146107f55780633bccf4fd146108205780633be2f2a31461085d5780633e4f49e6146108865780633f3b3b27146108c3576104c8565b8063160cbed7146106e35780632656227d146107205780632d63f693146107505780632fe3e2611461078d57806335debf2d146107b8576104c8565b80630cee1725116104465780630cee1725146105c6578063141a6c22146105ef578063148038b01461062c578063150b7a0214610669578063156277be146106a6576104c8565b806301ffc9a7146104cd57806302a251a31461050a578063034201811461053557806306f3f9e61461057257806306fdde031461059b576104c8565b366104c8573073ffffffffffffffffffffffffffffffffffffffff166104a6611565565b73ffffffffffffffffffffffffffffffffffffffff16146104c657600080fd5b005b600080fd5b3480156104d957600080fd5b506104f460048036038101906104ef9190615e9e565b611574565b6040516105019190615ee6565b60405180910390f35b34801561051657600080fd5b5061051f611586565b60405161052c9190615f1a565b60405180910390f35b34801561054157600080fd5b5061055c60048036038101906105579190616176565b611595565b6040516105699190615f1a565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190616254565b61167a565b005b3480156105a757600080fd5b506105b0611771565b6040516105bd9190616300565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190616254565b611803565b005b3480156105fb57600080fd5b50610616600480360381019061061191906163c3565b611a1f565b6040516106239190615f1a565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e919061646a565b611a47565b6040516106609190615f1a565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b91906164aa565b611a6c565b60405161069d919061653c565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c89190616254565b611a80565b6040516106da9190616566565b60405180910390f35b3480156106ef57600080fd5b5061070a600480360381019061070591906167e8565b611ab3565b6040516107179190615f1a565b60405180910390f35b61073a600480360381019061073591906167e8565b611d6d565b6040516107479190615f1a565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190616254565b611eba565b6040516107849190615f1a565b60405180910390f35b34801561079957600080fd5b506107a2611f28565b6040516107af91906168b2565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da91906168cd565b611f4c565b6040516107ec91906169b8565b60405180910390f35b34801561080157600080fd5b5061080a611fe3565b6040516108179190615f1a565b60405180910390f35b34801561082c57600080fd5b50610847600480360381019061084291906169da565b611ff2565b6040516108549190615f1a565b60405180910390f35b34801561086957600080fd5b50610884600480360381019061087f9190616a55565b61207c565b005b34801561089257600080fd5b506108ad60048036038101906108a89190616254565b6122e9565b6040516108ba9190616b4f565b60405180910390f35b3480156108cf57600080fd5b506108d86122fb565b6040516108e59190615f1a565b60405180910390f35b3480156108fa57600080fd5b50610903612301565b6040516109109190615f1a565b60405180910390f35b34801561092557600080fd5b50610940600480360381019061093b9190616254565b612307565b60405161094d9190615f1a565b60405180910390f35b34801561096257600080fd5b5061097d6004803603810190610978919061646a565b612361565b60405161098a9190615ee6565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190616254565b6123cc565b6040516109c79190616bb2565b60405180910390f35b3480156109dc57600080fd5b506109f760048036038101906109f29190616c23565b6123f6565b005b348015610a0557600080fd5b50610a206004803603810190610a1b9190616254565b612702565b604051610a2d9190615ee6565b60405180910390f35b348015610a4257600080fd5b50610a4b612722565b604051610a589190615f1a565b60405180910390f35b348015610a6d57600080fd5b50610a886004803603810190610a839190616254565b61272c565b604051610a9793929190616c70565b60405180910390f35b348015610aac57600080fd5b50610ab5612764565b604051610ac29190616300565b60405180910390f35b348015610ad757600080fd5b50610af26004803603810190610aed9190616ca7565b6127a1565b604051610aff9190615f1a565b60405180910390f35b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190616254565b6127d2565b604051610b3c9190615f1a565b60405180910390f35b348015610b5157600080fd5b50610b6c6004803603810190610b679190616254565b6127ea565b604051610b799190615f1a565b60405180910390f35b348015610b8e57600080fd5b50610ba96004803603810190610ba49190616ce7565b612802565b604051610bb69190615f1a565b60405180910390f35b348015610bcb57600080fd5b50610be66004803603810190610be19190616254565b61286c565b604051610bf39190615f1a565b60405180910390f35b348015610c0857600080fd5b50610c236004803603810190610c1e9190616d8b565b6129b8565b604051610c31929190616e29565b60405180910390f35b348015610c4657600080fd5b50610c616004803603810190610c5c91906168cd565b612aa3565b604051610c6e9190615ee6565b60405180910390f35b348015610c8357600080fd5b50610c9e6004803603810190610c999190616254565b612ac3565b604051610cab9190616bb2565b60405180910390f35b348015610cc057600080fd5b50610cdb6004803603810190610cd69190616254565b612ae3565b005b348015610ce957600080fd5b50610d046004803603810190610cff9190616e59565b612bda565b604051610d119190615f1a565b60405180910390f35b348015610d2657600080fd5b50610d2f612c0b565b005b348015610d3d57600080fd5b50610d586004803603810190610d539190616254565b612c1f565b604051610d659190615f1a565b60405180910390f35b348015610d7a57600080fd5b50610d956004803603810190610d909190616e99565b612c37565b604051610da29190615f1a565b60405180910390f35b348015610db757600080fd5b50610dd26004803603810190610dcd9190616f0d565b612c9f565b604051610ddf9190615f1a565b60405180910390f35b348015610df457600080fd5b50610e0f6004803603810190610e0a9190616254565b612d3a565b604051610e1c9190615ee6565b60405180910390f35b348015610e3157600080fd5b50610e3a612d64565b604051610e479190615f1a565b60405180910390f35b348015610e5c57600080fd5b50610e776004803603810190610e729190616254565b612d6a565b005b348015610e8557600080fd5b50610e8e612e0d565b604051610e9b9190616566565b60405180910390f35b348015610eb057600080fd5b50610ecb6004803603810190610ec69190616254565b612e37565b604051610ed89190616300565b60405180910390f35b348015610eed57600080fd5b50610f086004803603810190610f039190616254565b612ed7565b604051610f159190615ee6565b60405180910390f35b348015610f2a57600080fd5b50610f33612ef7565b604051610f409190615f1a565b60405180910390f35b348015610f5557600080fd5b50610f5e612efd565b604051610f6b9190615f1a565b60405180910390f35b348015610f8057600080fd5b50610f9b6004803603810190610f969190616fe4565b612f06565b604051610fa89190615f1a565b60405180910390f35b348015610fbd57600080fd5b50610fc6612f1c565b604051610fd39190615f1a565b60405180910390f35b348015610fe857600080fd5b506110036004803603810190610ffe91906170a3565b612f45565b005b34801561101157600080fd5b5061102c60048036038101906110279190616254565b61303c565b6040516110399190615f1a565b60405180910390f35b34801561104e57600080fd5b5061106960048036038101906110649190616254565b613109565b6040516110769190616300565b60405180910390f35b34801561108b57600080fd5b506110946131ae565b6040516110a19190615f1a565b60405180910390f35b3480156110b657600080fd5b506110d160048036038101906110cc9190616254565b6131bd565b6040516110de9190615f1a565b60405180910390f35b3480156110f357600080fd5b5061110e60048036038101906111099190616254565b6131da565b60405161111b9190615f1a565b60405180910390f35b34801561113057600080fd5b5061114b600480360381019061114691906170d0565b6131f7565b604051611158919061653c565b60405180910390f35b34801561116d57600080fd5b5061117661320c565b6040516111839190615f1a565b60405180910390f35b34801561119857600080fd5b506111b360048036038101906111ae9190616254565b613216565b6040516111c09190615f1a565b60405180910390f35b3480156111d557600080fd5b506111f060048036038101906111eb91906168cd565b613284565b6040516111fd9190615ee6565b60405180910390f35b34801561121257600080fd5b5061122d6004803603810190611228919061719f565b6132da565b005b34801561123b57600080fd5b50611256600480360381019061125191906167e8565b61341b565b6040516112639190615f1a565b60405180910390f35b61128660048036038101906112819190616254565b613457565b005b34801561129457600080fd5b506112af60048036038101906112aa91906163c3565b6135a1565b6040516112bc9190615f1a565b60405180910390f35b3480156112d157600080fd5b506112da6135cf565b6040516112e79190616566565b60405180910390f35b3480156112fc57600080fd5b5061131760048036038101906113129190617213565b6135f9565b6040516113249190615f1a565b60405180910390f35b34801561133957600080fd5b5061134261361e565b60405161134f9190616300565b60405180910390f35b34801561136457600080fd5b5061136d61365b565b60405161137a91906168b2565b60405180910390f35b34801561138f57600080fd5b506113aa60048036038101906113a59190616254565b61367f565b6040516113b79190615ee6565b60405180910390f35b3480156113cc57600080fd5b506113e760048036038101906113e29190616254565b6136a9565b6040516113f5929190617253565b60405180910390f35b34801561140a57600080fd5b5061142560048036038101906114209190616254565b61370c565b005b34801561143357600080fd5b5061144e60048036038101906114499190616e59565b613803565b60405161145b9190615f1a565b60405180910390f35b34801561147057600080fd5b5061148b60048036038101906114869190616254565b61381f565b005b34801561149957600080fd5b506114b460048036038101906114af919061727c565b613916565b6040516114c1919061653c565b60405180910390f35b3480156114d657600080fd5b506114f160048036038101906114ec91906168cd565b61392b565b005b3480156114ff57600080fd5b5061151a60048036038101906115159190616254565b6139ae565b6040516115279190615f1a565b60405180910390f35b34801561153c57600080fd5b506115456139c0565b6040516115529190617372565b60405180910390f35b6115636139e4565b005b600061156f613e18565b905090565b600061157f82613e42565b9050919050565b6000611590613ebc565b905090565b6000806116186116107fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c6040516115d19291906173bd565b60405180910390208b805190602001206040516020016115f59594939291906173e5565b60405160208183030381529060405280519060200120613ec6565b868686613ee0565b905061166b8a828b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a613f0b565b91505098975050505050505050565b611682611565565b73ffffffffffffffffffffffffffffffffffffffff166116a06140c7565b73ffffffffffffffffffffffffffffffffffffffff16146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16611715611565565b73ffffffffffffffffffffffffffffffffffffffff161461176557600061173a6140cf565b6040516117489291906173bd565b604051809103902090505b8061175e60026140dc565b0361175357505b61176e816141b8565b50565b606060008054611780906174d3565b80601f01602080910402602001604051908101604052809291908181526020018280546117ac906174d3565b80156117f95780601f106117ce576101008083540402835291602001916117f9565b820191906000526020600020905b8154815290600101906020018083116117dc57829003601f168201915b5050505050905090565b6002600381111561181757611816616ad8565b5b601b600083815260200190815260200160002060009054906101000a900460ff16600381111561184a57611849616ad8565b5b036119ea5760006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060003373ffffffffffffffffffffffffffffffffffffffff16826040516119209061752a565b60006040518083038185875af1925050503d806000811461195d576040519150601f19603f3d011682016040523d82523d6000602084013e611962565b606091505b505090508061199d576040517f9370a94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d543373ffffffffffffffffffffffffffffffffffffffff167f370c08173448a868859170331cf95622fc6b9ca192121cc9aae246cf05b3ab7c60405160405180910390a35050611a1c565b6040517f3cb39c3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000601482604051611a31919061757b565b9081526020016040518091039020549050919050565b6016602052816000526040600020602052806000526040600020600091509150505481565b600063150b7a0260e01b9050949350505050565b601a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080611ac28686868661341b565b905060046007811115611ad857611ad7616ad8565b5b611ae1826122e9565b6007811115611af357611af2616ad8565b5b14611b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2a90617604565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f27a0c926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190617639565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b1c5f4278888886000896040518663ffffffff1660e01b8152600401611c2c959493929190617878565b602060405180830381865afa158015611c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6d91906178f5565b600b600084815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f2a0bb0888888600089876040518763ffffffff1660e01b8152600401611cea96959493929190617922565b600060405180830381600087803b158015611d0457600080fd5b505af1158015611d18573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242611d4a91906179c7565b604051611d58929190617253565b60405180910390a18192505050949350505050565b600080611d7c8686868661341b565b90506000611d89826122e9565b905060046007811115611d9f57611d9e616ad8565b5b816007811115611db257611db1616ad8565b5b1480611de2575060056007811115611dcd57611dcc616ad8565b5b816007811115611de057611ddf616ad8565b5b145b611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890617604565b60405180910390fd5b600180600084815260200190815260200160002060020160006101000a81548160ff0219169083151502179055507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611e7e9190615f1a565b60405180910390a1611e93828888888861436c565b611ea0828888888861444f565b611ead8288888888614463565b8192505050949350505050565b6000611f17600160008481526020019081526020016000206000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff169050919050565b7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b6060601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611fd757602002820191906000526020600020905b815481526020019060010190808311611fc3575b50505050509050919050565b6000611fed6144cc565b905090565b60008061205361204b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f8989604051602001612030939291906179fb565b60405160208183030381529060405280519060200120613ec6565b868686613ee0565b9050612070878288604051806020016040528060008152506144d6565b91505095945050505050565b6120846144f6565b601c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612107576040517f05ed74eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4260126000600d5481526020019081526020016000206000848152602001908152602001600020819055506000601b6000600d54815260200190815260200160002060006101000a81548160ff0219169083600381111561216b5761216a616ad8565b5b02179055508160136000600d548152602001908152602001600020819055508260186000600d54815260200190815260200160002081905550600d546014856040516121b7919061757b565b9081526020016040518091039020819055508360156000600d54815260200190815260200160002090816121eb9190617bd4565b5080601a6000600d54815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160196000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600d54815260200190815260200160002060006101000a81548160ff021916908315150217905550600d547f786d1c7563663debc82f8c0117f799155168b2e814d7030810e1902c91ddf08d60405160405180910390a2600d60008154809291906122de90617ca6565b919050555050505050565b60006122f482614574565b9050919050565b600e5481565b600d5481565b60006016600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006007600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601b600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000612410604051806020016040528060008152506129b8565b5090508061244a576040517f443ce01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008383906124599190617cf9565b60001c905060006011600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601860008281526020019081526020016000205460176000838152602001908152602001600020541115612692576001601b600083815260200190815260200160002060006101000a81548160ff0219169083600381111561251b5761251a616ad8565b5b021790555060006064600f5460176000858152602001908152602001600020546125459190617d58565b61254f9190617dc9565b9050600060176000848152602001908152602001600020819055506000601a600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516125c39061752a565b60006040518083038185875af1925050503d8060008114612600576040519150601f19603f3d011682016040523d82523d6000602084013e612605565b606091505b505090508061265e5760176000848152602001908152602001600020546040517f265b39fb0000000000000000000000000000000000000000000000000000000081526004016126559190615f1a565b60405180910390fd5b827f1fd348a1f60f7b0ef569f04e42cfb3a6ff4c91400932970947875415514ad17260405160405180910390a250506126fc565b6002601b600083815260200190815260200160002060006101000a81548160ff021916908360038111156126c9576126c8616ad8565b5b0217905550807f4540ebb54491dc4fd8cd7a13ba536a737551e94cf1d0ed602242bdec63da4d0360405160405180910390a25b50505050565b60196020528060005260406000206000915054906101000a900460ff1681565b6000601054905090565b600080600080600760008681526020019081526020016000209050806000015481600101548260020154935093509350509193909250565b60606040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250905090565b6000806127ac6140c7565b90506127c9848285604051806020016040528060008152506144d6565b91505092915050565b60186020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b60008061280d6140c7565b905061286087828888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505087613f0b565b91505095945050505050565b60008060096000018054905090506000810361288d576008549150506129b3565b600060096000016001836128a19190617dfa565b815481106128b2576128b1617e2e565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905083816000015163ffffffff161161299a5780602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925050506129b3565b6129ae84600961474790919063ffffffff16565b925050505b919050565b600060606000600190505b600d548111612a9d5760006011600083815260200190815260200160002060009054906101000a900460ff16905060006013600084815260200190815260200160002054601260008581526020019081526020016000206000601360008781526020019081526020016000205481526020019081526020016000205442612a4a9190617dfa565b119050818015612a575750805b94508415612a885782604051602001612a709190617e7e565b60405160208183030381529060405293505050612a9d565b50508080612a9590617ca6565b9150506129c3565b50915091565b601c6020528060005260406000206000915054906101000a900460ff1681565b601b6020528060005260406000206000915054906101000a900460ff1681565b612aeb611565565b73ffffffffffffffffffffffffffffffffffffffff16612b096140c7565b73ffffffffffffffffffffffffffffffffffffffff1614612b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5690617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612b7e611565565b73ffffffffffffffffffffffffffffffffffffffff1614612bce576000612ba36140cf565b604051612bb19291906173bd565b604051809103902090505b80612bc760026140dc565b03612bbc57505b612bd78161489f565b50565b601d6020528160005260406000208181548110612bf657600080fd5b90600052602060002001600091509150505481565b612c136144f6565b612c1d60006148e4565b565b60176020528060005260406000206000915090505481565b600080612c426140c7565b9050612c9486828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506144d6565b915050949350505050565b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612d24576040517f4018425300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d30858585856149aa565b9050949350505050565b60006011600083815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b612d726144f6565b60006019600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600060116000600d54815260200190815260200160002060006101000a81548160ff0219169083151502179055506003601b6000600d54815260200190815260200160002060006101000a81548160ff02191690836003811115612e0557612e04616ad8565b5b021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090508054612e56906174d3565b80601f0160208091040260200160405190810160405280929190818152602001828054612e82906174d3565b8015612ecf5780601f10612ea457610100808354040283529160200191612ecf565b820191906000526020600020905b815481529060010190602001808311612eb257829003601f168201915b505050505081565b60116020528060005260406000206000915054906101000a900460ff1681565b60105481565b60006064905090565b6000612f13848484614cb1565b90509392505050565b60008060096000018054905014612f3c57612f376009613d2a565b612f40565b6008545b905090565b612f4d611565565b73ffffffffffffffffffffffffffffffffffffffff16612f6b6140c7565b73ffffffffffffffffffffffffffffffffffffffff1614612fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb890617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16612fe0611565565b73ffffffffffffffffffffffffffffffffffffffff16146130305760006130056140cf565b6040516130139291906173bd565b604051809103902090505b8061302960026140dc565b0361301e57505b61303981614d58565b50565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d45c4435600b6000868152602001908152602001600020546040518263ffffffff1660e01b81526004016130ad91906168b2565b602060405180830381865afa1580156130ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ee9190617639565b9050600181146130fe5780613101565b60005b915050919050565b6060601560008381526020019081526020016000208054613129906174d3565b80601f0160208091040260200160405190810160405280929190818152602001828054613155906174d3565b80156131a25780601f10613177576101008083540402835291602001916131a2565b820191906000526020600020905b81548152906001019060200180831161318557829003601f168201915b50505050509050919050565b60006131b8614df7565b905090565b600060186000838152602001908152602001600020549050919050565b600060176000838152602001908152602001600020549050919050565b600063bc197c8160e01b905095945050505050565b6000600f54905090565b6000613273600160008481526020019081526020016000206001016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff169050919050565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6132e2611565565b73ffffffffffffffffffffffffffffffffffffffff166133006140c7565b73ffffffffffffffffffffffffffffffffffffffff1614613356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334d90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16613375611565565b73ffffffffffffffffffffffffffffffffffffffff16146133c557600061339a6140cf565b6040516133a89291906173bd565b604051809103902090505b806133be60026140dc565b036133b357505b6134148483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505085614e01565b5050505050565b6000848484846040516020016134349493929190617e99565b6040516020818303038152906040528051906020012060001c9050949350505050565b806019600082815260200190815260200160002060009054906101000a900460ff166134af576040517f528d75ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346016600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461350f91906179c7565b925050819055503460176000848152602001908152602001600020600082825461353991906179c7565b92505081905550604051806020016040528083815250601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090600161359c929190615dc8565b505050565b6014818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6012602052816000526040600020602052806000526040600020600091509150505481565b60606040518060400160405280602081526020017f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e815250905090565b7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b60006019600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000806012600084815260200190815260200160002060006013600086815260200190815260200160002054815260200190815260200160002054426136ef9190617dfa565b915060136000848152602001908152602001600020549050915091565b613714611565565b73ffffffffffffffffffffffffffffffffffffffff166137326140c7565b73ffffffffffffffffffffffffffffffffffffffff1614613788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377f90617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166137a7611565565b73ffffffffffffffffffffffffffffffffffffffff16146137f75760006137cc6140cf565b6040516137da9291906173bd565b604051809103902090505b806137f060026140dc565b036137e557505b61380081614e30565b50565b60006138178383613812614eb8565b614cb1565b905092915050565b613827611565565b73ffffffffffffffffffffffffffffffffffffffff166138456140c7565b73ffffffffffffffffffffffffffffffffffffffff161461389b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389290617484565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff166138ba611565565b73ffffffffffffffffffffffffffffffffffffffff161461390a5760006138df6140cf565b6040516138ed9291906173bd565b604051809103902090505b8061390360026140dc565b036138f857505b61391381614ecf565b50565b600063f23a6e6160e01b905095945050505050565b6139336144f6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036139a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399990617f65565b60405180910390fd5b6139ab816148e4565b50565b60006139b982614f14565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601054341015613a20576040517f63dc8b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f08589d6aa50e04ad7909247eece8eb5c4e8ab2d708d7d76becf8a96298b6ee4f60405160405180910390a2565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1790617ff7565b60405180910390fd5b819050919050565b6000806000846000018054905090506000613b4286613d2a565b9050600082118015613b9857504386600001600184613b619190617dfa565b81548110613b7257613b71617e2e565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15613c2857613ba685613abd565b86600001600184613bb79190617dfa565b81548110613bc857613bc7617e2e565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613d1b565b856000016040518060400160405280613c4043613dc5565b63ffffffff168152602001613c5488613abd565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b6000808260000180549050905060008114613d9c5782600001600182613d509190617dfa565b81548110613d6157613d60617e2e565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613d9f565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600063ffffffff8016821115613e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e0790618089565b60405180910390fd5b819050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f6e665ced000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613eb55750613eb482614fdc565b5b9050919050565b6000600554905090565b6000613ed9613ed3615141565b8361525b565b9050919050565b6000806000613ef18787878761528e565b91509150613efe8161539a565b8192505050949350505050565b60008060016000888152602001908152602001600020905060016007811115613f3757613f36616ad8565b5b613f40886122e9565b6007811115613f5257613f51616ad8565b5b14613f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f899061811b565b60405180910390fd5b6000613ff187613fe1846000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250506144be565b67ffffffffffffffff1686614cb1565b90506140008888888488615566565b6000845103614062578673ffffffffffffffffffffffffffffffffffffffff167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051614055949392919061813b565b60405180910390a26140b9565b8673ffffffffffffffffffffffffffffffffffffffff167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb871289888489896040516140b0959493929190618187565b60405180910390a25b809250505095945050505050565b600033905090565b3660008036915091509091565b60006140e78261576a565b1561411e576040517f3db2a12a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260000160009054906101000a9004600f0b905082600101600082600f0b600f0b815260200190815260200160002054915082600101600082600f0b600f0b815260200190815260200160002060009055600181018360000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050919050565b6141c0612efd565b811115614202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141f990618280565b60405180910390fd5b600061420c612f1c565b90506000811415801561422757506000600960000180549050145b156143195760096000016040518060400160405280600063ffffffff16815260200161425284613abd565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b61432d826009613b2890919063ffffffff16565b50507f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b46339978183604051614360929190617253565b60405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff1661438b611565565b73ffffffffffffffffffffffffffffffffffffffff16146144485760005b8451811015614446573073ffffffffffffffffffffffffffffffffffffffff168582815181106143dc576143db617e2e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036144355761443483828151811061441557614414617e2e565b5b602002602001015180519060200120600261579f90919063ffffffff16565b5b8061443f90617ca6565b90506143a9565b505b5050505050565b61445c858585858561581b565b5050505050565b3073ffffffffffffffffffffffffffffffffffffffff16614482611565565b73ffffffffffffffffffffffffffffffffffffffff16146144b7576144a7600261576a565b6144b6576144b560026158b9565b5b5b5050505050565b600081600001519050919050565b6000600454905090565b60006144ec858585856144e7614eb8565b613f0b565b9050949350505050565b6144fe6140c7565b73ffffffffffffffffffffffffffffffffffffffff1661451c612e0d565b73ffffffffffffffffffffffffffffffffffffffff1614614572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614569906182ec565b60405180910390fd5b565b6000806145808361593a565b90506004600781111561459657614595616ad8565b5b8160078111156145a9576145a8616ad8565b5b146145b75780915050614742565b6000600b60008581526020019081526020016000205490506000801b81036145e3578192505050614742565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ab0f529826040518263ffffffff1660e01b815260040161463e91906168b2565b602060405180830381865afa15801561465b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467f9190618338565b1561468f57600792505050614742565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663584b153e826040518263ffffffff1660e01b81526004016146ea91906168b2565b602060405180830381865afa158015614707573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061472b9190618338565b1561473b57600592505050614742565b6002925050505b919050565b600043821061478b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614782906183b1565b60405180910390fd5b60008360000180549050905060005b8181101561480f5760006147ae8284615a4e565b9050848660000182815481106147c7576147c6617e2e565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff1611156147f957809250614809565b60018161480691906179c7565b91505b5061479a565b6000821461487457846000016001836148289190617dfa565b8154811061483957614838617e2e565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16614877565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b7fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93600454826040516148d2929190617253565b60405180910390a18060048190555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006149b46131ae565b6149d16149bf6140c7565b6001436149cc9190617dfa565b613803565b1015614a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a0990618443565b60405180910390fd5b6000614a27868686868051906020012061341b565b90508451865114614a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a64906184d5565b60405180910390fd5b8351865114614ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aa8906184d5565b60405180910390fd5b6000865111614af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614aec90618541565b60405180910390fd5b6000600160008381526020019081526020016000209050614b55816000016040518060200160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050615a74565b614b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614b8b906185d3565b60405180910390fd5b6000614ba6614ba1611fe3565b615a8e565b614baf43615a8e565b614bb99190618607565b90506000614bcd614bc8611586565b615a8e565b82614bd89190618607565b9050614bf08284600001615ae590919063ffffffff16565b614c068184600101615ae590919063ffffffff16565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084614c306140c7565b8b8b8d5167ffffffffffffffff811115614c4d57614c4c616015565b5b604051908082528060200260200182016040528015614c8057816020015b6060815260200190600190039081614c6b5790505b508c88888e604051614c9a99989796959493929190618780565b60405180910390a183945050505050949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a46b1a885856040518363ffffffff1660e01b8152600401614d0e929190618830565b602060405180830381865afa158015614d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d4f9190617639565b90509392505050565b7f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051614dab929190618859565b60405180910390a180600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600654905090565b6060614e27848484604051806060016040528060298152602001618fb560299139615b14565b90509392505050565b60008111614e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614e6a906188f4565b60405180910390fd5b7f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882860055482604051614ea6929190617253565b60405180910390a18060058190555050565b606060405180602001604052806000815250905090565b7fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc0546160065482604051614f02929190617253565b60405180910390a18060068190555050565b6000614f1e612efd565b614f278361286c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e539e8c856040518263ffffffff1660e01b8152600401614f809190615f1a565b602060405180830381865afa158015614f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fc19190617639565b614fcb9190617d58565b614fd59190617dc9565b9050919050565b6000639a802a6d60e01b630342018160e01b635f398a1460e01b7f79dd796f000000000000000000000000000000000000000000000000000000001818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806150c257507f79dd796f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061512a57507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061513a575061513982615c28565b5b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156151bd57507f000000000000000000000000000000000000000000000000000000000000000046145b156151ea577f00000000000000000000000000000000000000000000000000000000000000009050615258565b6152557f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000615c92565b90505b90565b60008282604051602001615270929190618981565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156152c9576000600391509150615391565b601b8560ff16141580156152e15750601c8560ff1614155b156152f3576000600491509150615391565b60006001878787876040516000815260200160405260405161531894939291906189b8565b6020604051602081039080840390855afa15801561533a573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361538857600060019250925050615391565b80600092509250505b94509492505050565b600060048111156153ae576153ad616ad8565b5b8160048111156153c1576153c0616ad8565b5b031561556357600160048111156153db576153da616ad8565b5b8160048111156153ee576153ed616ad8565b5b0361542e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161542590618a49565b60405180910390fd5b6002600481111561544257615441616ad8565b5b81600481111561545557615454616ad8565b5b03615495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161548c90618ab5565b60405180910390fd5b600360048111156154a9576154a8616ad8565b5b8160048111156154bc576154bb616ad8565b5b036154fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016154f390618b47565b60405180910390fd5b60048081111561550f5761550e616ad8565b5b81600481111561552257615521616ad8565b5b03615562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161555990618bd9565b60405180910390fd5b5b50565b60006007600087815260200190815260200160002090508060030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561560c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161560390618c6b565b60405180910390fd5b60018160030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600281111561567a57615679616ad8565b5b60ff168460ff16036156a6578281600001600082825461569a91906179c7565b92505081905550615762565b600160028111156156ba576156b9616ad8565b5b60ff168460ff16036156e657828160010160008282546156da91906179c7565b92505081905550615761565b6002808111156156f9576156f8616ad8565b5b60ff168460ff1603615725578281600201600082825461571991906179c7565b92505081905550615760565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161575790618cfd565b60405180910390fd5b5b5b505050505050565b60008160000160009054906101000a9004600f0b600f0b8260000160109054906101000a9004600f0b600f0b13159050919050565b60008260000160109054906101000a9004600f0b90508183600101600083600f0b600f0b815260200190815260200160002081905550600181018360000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e38335e5348686866000876040518763ffffffff1660e01b8152600401615880959493929190617878565b6000604051808303818588803b15801561589957600080fd5b505af11580156158ad573d6000803e3d6000fd5b50505050505050505050565b60008160000160006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555060008160000160106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555050565b6000806001600084815260200190815260200160002090508060020160009054906101000a900460ff1615615973576007915050615a49565b8060020160019054906101000a900460ff1615615994576002915050615a49565b600061599f84611eba565b9050600081036159e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016159db90618d69565b60405180910390fd5b4381106159f657600092505050615a49565b6000615a0185613216565b9050438110615a165760019350505050615a49565b615a1f85615ccc565b8015615a305750615a2f85615d13565b5b15615a415760049350505050615a49565b600393505050505b919050565b60006002828418615a5f9190617dc9565b828416615a6c91906179c7565b905092915050565b600080826000015167ffffffffffffffff16149050919050565b600067ffffffffffffffff8016821115615add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615ad490618dfb565b60405180910390fd5b819050919050565b808260000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b606082471015615b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b5090618e8d565b60405180910390fd5b615b6285615d3e565b615ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615b9890618ef9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051615bca9190618f4a565b60006040518083038185875af1925050503d8060008114615c07576040519150601f19603f3d011682016040523d82523d6000602084013e615c0c565b606091505b5091509150615c1c828286615d61565b92505050949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008383834630604051602001615cad959493929190618f61565b6040516020818303038152906040528051906020012090509392505050565b60008060076000848152602001908152602001600020905080600201548160010154615cf891906179c7565b615d09615d0485611eba565b6139ae565b1115915050919050565b6000806007600084815260200190815260200160002090508060000154816001015411915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315615d7157829050615dc1565b600083511115615d845782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401615db89190616300565b60405180910390fd5b9392505050565b828054828255906000526020600020908101928215615e04579160200282015b82811115615e03578251825591602001919060010190615de8565b5b509050615e119190615e15565b5090565b5b80821115615e2e576000816000905550600101615e16565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b615e7b81615e46565b8114615e8657600080fd5b50565b600081359050615e9881615e72565b92915050565b600060208284031215615eb457615eb3615e3c565b5b6000615ec284828501615e89565b91505092915050565b60008115159050919050565b615ee081615ecb565b82525050565b6000602082019050615efb6000830184615ed7565b92915050565b6000819050919050565b615f1481615f01565b82525050565b6000602082019050615f2f6000830184615f0b565b92915050565b615f3e81615f01565b8114615f4957600080fd5b50565b600081359050615f5b81615f35565b92915050565b600060ff82169050919050565b615f7781615f61565b8114615f8257600080fd5b50565b600081359050615f9481615f6e565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112615fbf57615fbe615f9a565b5b8235905067ffffffffffffffff811115615fdc57615fdb615f9f565b5b602083019150836001820283011115615ff857615ff7615fa4565b5b9250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61604d82616004565b810181811067ffffffffffffffff8211171561606c5761606b616015565b5b80604052505050565b600061607f615e32565b905061608b8282616044565b919050565b600067ffffffffffffffff8211156160ab576160aa616015565b5b6160b482616004565b9050602081019050919050565b82818337600083830152505050565b60006160e36160de84616090565b616075565b9050828152602081018484840111156160ff576160fe615fff565b5b61610a8482856160c1565b509392505050565b600082601f83011261612757616126615f9a565b5b81356161378482602086016160d0565b91505092915050565b6000819050919050565b61615381616140565b811461615e57600080fd5b50565b6000813590506161708161614a565b92915050565b60008060008060008060008060e0898b03121561619657616195615e3c565b5b60006161a48b828c01615f4c565b98505060206161b58b828c01615f85565b975050604089013567ffffffffffffffff8111156161d6576161d5615e41565b5b6161e28b828c01615fa9565b9650965050606089013567ffffffffffffffff81111561620557616204615e41565b5b6162118b828c01616112565b94505060806162228b828c01615f85565b93505060a06162338b828c01616161565b92505060c06162448b828c01616161565b9150509295985092959890939650565b60006020828403121561626a57616269615e3c565b5b600061627884828501615f4c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156162bb5780820151818401526020810190506162a0565b60008484015250505050565b60006162d282616281565b6162dc818561628c565b93506162ec81856020860161629d565b6162f581616004565b840191505092915050565b6000602082019050818103600083015261631a81846162c7565b905092915050565b600067ffffffffffffffff82111561633d5761633c616015565b5b61634682616004565b9050602081019050919050565b600061636661636184616322565b616075565b90508281526020810184848401111561638257616381615fff565b5b61638d8482856160c1565b509392505050565b600082601f8301126163aa576163a9615f9a565b5b81356163ba848260208601616353565b91505092915050565b6000602082840312156163d9576163d8615e3c565b5b600082013567ffffffffffffffff8111156163f7576163f6615e41565b5b61640384828501616395565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006164378261640c565b9050919050565b6164478161642c565b811461645257600080fd5b50565b6000813590506164648161643e565b92915050565b6000806040838503121561648157616480615e3c565b5b600061648f85828601615f4c565b92505060206164a085828601616455565b9150509250929050565b600080600080608085870312156164c4576164c3615e3c565b5b60006164d287828801616455565b94505060206164e387828801616455565b93505060406164f487828801615f4c565b925050606085013567ffffffffffffffff81111561651557616514615e41565b5b61652187828801616112565b91505092959194509250565b61653681615e46565b82525050565b6000602082019050616551600083018461652d565b92915050565b6165608161642c565b82525050565b600060208201905061657b6000830184616557565b92915050565b600067ffffffffffffffff82111561659c5761659b616015565b5b602082029050602081019050919050565b60006165c06165bb84616581565b616075565b905080838252602082019050602084028301858111156165e3576165e2615fa4565b5b835b8181101561660c57806165f88882616455565b8452602084019350506020810190506165e5565b5050509392505050565b600082601f83011261662b5761662a615f9a565b5b813561663b8482602086016165ad565b91505092915050565b600067ffffffffffffffff82111561665f5761665e616015565b5b602082029050602081019050919050565b600061668361667e84616644565b616075565b905080838252602082019050602084028301858111156166a6576166a5615fa4565b5b835b818110156166cf57806166bb8882615f4c565b8452602084019350506020810190506166a8565b5050509392505050565b600082601f8301126166ee576166ed615f9a565b5b81356166fe848260208601616670565b91505092915050565b600067ffffffffffffffff82111561672257616721616015565b5b602082029050602081019050919050565b600061674661674184616707565b616075565b9050808382526020820190506020840283018581111561676957616768615fa4565b5b835b818110156167b057803567ffffffffffffffff81111561678e5761678d615f9a565b5b80860161679b8982616112565b8552602085019450505060208101905061676b565b5050509392505050565b600082601f8301126167cf576167ce615f9a565b5b81356167df848260208601616733565b91505092915050565b6000806000806080858703121561680257616801615e3c565b5b600085013567ffffffffffffffff8111156168205761681f615e41565b5b61682c87828801616616565b945050602085013567ffffffffffffffff81111561684d5761684c615e41565b5b616859878288016166d9565b935050604085013567ffffffffffffffff81111561687a57616879615e41565b5b616886878288016167ba565b925050606061689787828801616161565b91505092959194509250565b6168ac81616140565b82525050565b60006020820190506168c760008301846168a3565b92915050565b6000602082840312156168e3576168e2615e3c565b5b60006168f184828501616455565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61692f81615f01565b82525050565b60006169418383616926565b60208301905092915050565b6000602082019050919050565b6000616965826168fa565b61696f8185616905565b935061697a83616916565b8060005b838110156169ab5781516169928882616935565b975061699d8361694d565b92505060018101905061697e565b5085935050505092915050565b600060208201905081810360008301526169d2818461695a565b905092915050565b600080600080600060a086880312156169f6576169f5615e3c565b5b6000616a0488828901615f4c565b9550506020616a1588828901615f85565b9450506040616a2688828901615f85565b9350506060616a3788828901616161565b9250506080616a4888828901616161565b9150509295509295909350565b60008060008060808587031215616a6f57616a6e615e3c565b5b600085013567ffffffffffffffff811115616a8d57616a8c615e41565b5b616a9987828801616395565b9450506020616aaa87828801615f4c565b9350506040616abb87828801615f4c565b9250506060616acc87828801616455565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110616b1857616b17616ad8565b5b50565b6000819050616b2982616b07565b919050565b6000616b3982616b1b565b9050919050565b616b4981616b2e565b82525050565b6000602082019050616b646000830184616b40565b92915050565b60048110616b7b57616b7a616ad8565b5b50565b6000819050616b8c82616b6a565b919050565b6000616b9c82616b7e565b9050919050565b616bac81616b91565b82525050565b6000602082019050616bc76000830184616ba3565b92915050565b60008083601f840112616be357616be2615f9a565b5b8235905067ffffffffffffffff811115616c0057616bff615f9f565b5b602083019150836001820283011115616c1c57616c1b615fa4565b5b9250929050565b60008060208385031215616c3a57616c39615e3c565b5b600083013567ffffffffffffffff811115616c5857616c57615e41565b5b616c6485828601616bcd565b92509250509250929050565b6000606082019050616c856000830186615f0b565b616c926020830185615f0b565b616c9f6040830184615f0b565b949350505050565b60008060408385031215616cbe57616cbd615e3c565b5b6000616ccc85828601615f4c565b9250506020616cdd85828601615f85565b9150509250929050565b600080600080600060808688031215616d0357616d02615e3c565b5b6000616d1188828901615f4c565b9550506020616d2288828901615f85565b945050604086013567ffffffffffffffff811115616d4357616d42615e41565b5b616d4f88828901615fa9565b9350935050606086013567ffffffffffffffff811115616d7257616d71615e41565b5b616d7e88828901616112565b9150509295509295909350565b600060208284031215616da157616da0615e3c565b5b600082013567ffffffffffffffff811115616dbf57616dbe615e41565b5b616dcb84828501616112565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000616dfb82616dd4565b616e058185616ddf565b9350616e1581856020860161629d565b616e1e81616004565b840191505092915050565b6000604082019050616e3e6000830185615ed7565b8181036020830152616e508184616df0565b90509392505050565b60008060408385031215616e7057616e6f615e3c565b5b6000616e7e85828601616455565b9250506020616e8f85828601615f4c565b9150509250929050565b60008060008060608587031215616eb357616eb2615e3c565b5b6000616ec187828801615f4c565b9450506020616ed287828801615f85565b935050604085013567ffffffffffffffff811115616ef357616ef2615e41565b5b616eff87828801615fa9565b925092505092959194509250565b60008060008060808587031215616f2757616f26615e3c565b5b600085013567ffffffffffffffff811115616f4557616f44615e41565b5b616f5187828801616616565b945050602085013567ffffffffffffffff811115616f7257616f71615e41565b5b616f7e878288016166d9565b935050604085013567ffffffffffffffff811115616f9f57616f9e615e41565b5b616fab878288016167ba565b925050606085013567ffffffffffffffff811115616fcc57616fcb615e41565b5b616fd887828801616395565b91505092959194509250565b600080600060608486031215616ffd57616ffc615e3c565b5b600061700b86828701616455565b935050602061701c86828701615f4c565b925050604084013567ffffffffffffffff81111561703d5761703c615e41565b5b61704986828701616112565b9150509250925092565b600061705e8261640c565b9050919050565b600061707082617053565b9050919050565b61708081617065565b811461708b57600080fd5b50565b60008135905061709d81617077565b92915050565b6000602082840312156170b9576170b8615e3c565b5b60006170c78482850161708e565b91505092915050565b600080600080600060a086880312156170ec576170eb615e3c565b5b60006170fa88828901616455565b955050602061710b88828901616455565b945050604086013567ffffffffffffffff81111561712c5761712b615e41565b5b617138888289016166d9565b935050606086013567ffffffffffffffff81111561715957617158615e41565b5b617165888289016166d9565b925050608086013567ffffffffffffffff81111561718657617185615e41565b5b61719288828901616112565b9150509295509295909350565b600080600080606085870312156171b9576171b8615e3c565b5b60006171c787828801616455565b94505060206171d887828801615f4c565b935050604085013567ffffffffffffffff8111156171f9576171f8615e41565b5b61720587828801616bcd565b925092505092959194509250565b6000806040838503121561722a57617229615e3c565b5b600061723885828601615f4c565b925050602061724985828601615f4c565b9150509250929050565b60006040820190506172686000830185615f0b565b6172756020830184615f0b565b9392505050565b600080600080600060a0868803121561729857617297615e3c565b5b60006172a688828901616455565b95505060206172b788828901616455565b94505060406172c888828901615f4c565b93505060606172d988828901615f4c565b925050608086013567ffffffffffffffff8111156172fa576172f9615e41565b5b61730688828901616112565b9150509295509295909350565b6000819050919050565b600061733861733361732e8461640c565b617313565b61640c565b9050919050565b600061734a8261731d565b9050919050565b600061735c8261733f565b9050919050565b61736c81617351565b82525050565b60006020820190506173876000830184617363565b92915050565b600081905092915050565b60006173a4838561738d565b93506173b18385846160c1565b82840190509392505050565b60006173ca828486617398565b91508190509392505050565b6173df81615f61565b82525050565b600060a0820190506173fa60008301886168a3565b6174076020830187615f0b565b61741460408301866173d6565b61742160608301856168a3565b61742e60808301846168a3565b9695505050505050565b7f476f7665726e6f723a206f6e6c79476f7665726e616e63650000000000000000600082015250565b600061746e60188361628c565b915061747982617438565b602082019050919050565b6000602082019050818103600083015261749d81617461565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806174eb57607f821691505b6020821081036174fe576174fd6174a4565b5b50919050565b50565b600061751460008361738d565b915061751f82617504565b600082019050919050565b600061753582617507565b9150819050919050565b600081905092915050565b600061755582616281565b61755f818561753f565b935061756f81856020860161629d565b80840191505092915050565b6000617587828461754a565b915081905092915050565b7f476f7665726e6f723a2070726f706f73616c206e6f742073756363657373667560008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b60006175ee60218361628c565b91506175f982617592565b604082019050919050565b6000602082019050818103600083015261761d816175e1565b9050919050565b60008151905061763381615f35565b92915050565b60006020828403121561764f5761764e615e3c565b5b600061765d84828501617624565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61769b8161642c565b82525050565b60006176ad8383617692565b60208301905092915050565b6000602082019050919050565b60006176d182617666565b6176db8185617671565b93506176e683617682565b8060005b838110156177175781516176fe88826176a1565b9750617709836176b9565b9250506001810190506176ea565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061776c82616dd4565b6177768185617750565b935061778681856020860161629d565b61778f81616004565b840191505092915050565b60006177a68383617761565b905092915050565b6000602082019050919050565b60006177c682617724565b6177d0818561772f565b9350836020820285016177e285617740565b8060005b8581101561781e57848403895281516177ff858261779a565b945061780a836177ae565b925060208a019950506001810190506177e6565b50829750879550505050505092915050565b6000819050919050565b60008160001b9050919050565b600061786261785d61785884617830565b61783a565b616140565b9050919050565b61787281617847565b82525050565b600060a082019050818103600083015261789281886176c6565b905081810360208301526178a6818761695a565b905081810360408301526178ba81866177bb565b90506178c96060830185617869565b6178d660808301846168a3565b9695505050505050565b6000815190506178ef8161614a565b92915050565b60006020828403121561790b5761790a615e3c565b5b6000617919848285016178e0565b91505092915050565b600060c082019050818103600083015261793c81896176c6565b90508181036020830152617950818861695a565b9050818103604083015261796481876177bb565b90506179736060830186617869565b61798060808301856168a3565b61798d60a0830184615f0b565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006179d282615f01565b91506179dd83615f01565b92508282019050808211156179f5576179f4617998565b5b92915050565b6000606082019050617a1060008301866168a3565b617a1d6020830185615f0b565b617a2a60408301846173d6565b949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302617a947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82617a57565b617a9e8683617a57565b95508019841693508086168417925050509392505050565b6000617ad1617acc617ac784615f01565b617313565b615f01565b9050919050565b6000819050919050565b617aeb83617ab6565b617aff617af782617ad8565b848454617a64565b825550505050565b600090565b617b14617b07565b617b1f818484617ae2565b505050565b5b81811015617b4357617b38600082617b0c565b600181019050617b25565b5050565b601f821115617b8857617b5981617a32565b617b6284617a47565b81016020851015617b71578190505b617b85617b7d85617a47565b830182617b24565b50505b505050565b600082821c905092915050565b6000617bab60001984600802617b8d565b1980831691505092915050565b6000617bc48383617b9a565b9150826002028217905092915050565b617bdd82616281565b67ffffffffffffffff811115617bf657617bf5616015565b5b617c0082546174d3565b617c0b828285617b47565b600060209050601f831160018114617c3e5760008415617c2c578287015190505b617c368582617bb8565b865550617c9e565b601f198416617c4c86617a32565b60005b82811015617c7457848901518255600182019150602085019450602081019050617c4f565b86831015617c915784890151617c8d601f891682617b9a565b8355505b6001600288020188555050505b505050505050565b6000617cb182615f01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203617ce357617ce2617998565b5b600182019050919050565b600082905092915050565b6000617d058383617cee565b82617d108135616140565b92506020821015617d5057617d4b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802617a57565b831692505b505092915050565b6000617d6382615f01565b9150617d6e83615f01565b9250828202617d7c81615f01565b91508282048414831517617d9357617d92617998565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000617dd482615f01565b9150617ddf83615f01565b925082617def57617dee617d9a565b5b828204905092915050565b6000617e0582615f01565b9150617e1083615f01565b9250828203905081811115617e2857617e27617998565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b617e78617e7382615f01565b617e5d565b82525050565b6000617e8a8284617e67565b60208201915081905092915050565b60006080820190508181036000830152617eb381876176c6565b90508181036020830152617ec7818661695a565b90508181036040830152617edb81856177bb565b9050617eea60608301846168a3565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000617f4f60268361628c565b9150617f5a82617ef3565b604082019050919050565b60006020820190508181036000830152617f7e81617f42565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000617fe160278361628c565b9150617fec82617f85565b604082019050919050565b6000602082019050818103600083015261801081617fd4565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b600061807360268361628c565b915061807e82618017565b604082019050919050565b600060208201905081810360008301526180a281618066565b9050919050565b7f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460008201527f6976650000000000000000000000000000000000000000000000000000000000602082015250565b600061810560238361628c565b9150618110826180a9565b604082019050919050565b60006020820190508181036000830152618134816180f8565b9050919050565b60006080820190506181506000830187615f0b565b61815d60208301866173d6565b61816a6040830185615f0b565b818103606083015261817c81846162c7565b905095945050505050565b600060a08201905061819c6000830188615f0b565b6181a960208301876173d6565b6181b66040830186615f0b565b81810360608301526181c881856162c7565b905081810360808301526181dc8184616df0565b90509695505050505050565b7f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60008201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e6160208201527f746f720000000000000000000000000000000000000000000000000000000000604082015250565b600061826a60438361628c565b9150618275826181e8565b606082019050919050565b600060208201905081810360008301526182998161825d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006182d660208361628c565b91506182e1826182a0565b602082019050919050565b60006020820190508181036000830152618305816182c9565b9050919050565b61831581615ecb565b811461832057600080fd5b50565b6000815190506183328161830c565b92915050565b60006020828403121561834e5761834d615e3c565b5b600061835c84828501618323565b91505092915050565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b600061839b60208361628c565b91506183a682618365565b602082019050919050565b600060208201905081810360008301526183ca8161838e565b9050919050565b7f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f77207060008201527f726f706f73616c207468726573686f6c64000000000000000000000000000000602082015250565b600061842d60318361628c565b9150618438826183d1565b604082019050919050565b6000602082019050818103600083015261845c81618420565b9050919050565b7f476f7665726e6f723a20696e76616c69642070726f706f73616c206c656e677460008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b60006184bf60218361628c565b91506184ca82618463565b604082019050919050565b600060208201905081810360008301526184ee816184b2565b9050919050565b7f476f7665726e6f723a20656d7074792070726f706f73616c0000000000000000600082015250565b600061852b60188361628c565b9150618536826184f5565b602082019050919050565b6000602082019050818103600083015261855a8161851e565b9050919050565b7f476f7665726e6f723a2070726f706f73616c20616c726561647920657869737460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006185bd60218361628c565b91506185c882618561565b604082019050919050565b600060208201905081810360008301526185ec816185b0565b9050919050565b600067ffffffffffffffff82169050919050565b6000618612826185f3565b915061861d836185f3565b9250828201905067ffffffffffffffff81111561863d5761863c617998565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061868b82616281565b618695818561866f565b93506186a581856020860161629d565b6186ae81616004565b840191505092915050565b60006186c58383618680565b905092915050565b6000602082019050919050565b60006186e582618643565b6186ef818561864e565b9350836020820285016187018561865f565b8060005b8581101561873d578484038952815161871e85826186b9565b9450618729836186cd565b925060208a01995050600181019050618705565b50829750879550505050505092915050565b600061876a618765618760846185f3565b617313565b615f01565b9050919050565b61877a8161874f565b82525050565b600061012082019050618796600083018c615f0b565b6187a3602083018b616557565b81810360408301526187b5818a6176c6565b905081810360608301526187c9818961695a565b905081810360808301526187dd81886186da565b905081810360a08301526187f181876177bb565b905061880060c0830186618771565b61880d60e0830185618771565b81810361010083015261882081846162c7565b90509a9950505050505050505050565b60006040820190506188456000830185616557565b6188526020830184615f0b565b9392505050565b600060408201905061886e6000830185616557565b61887b6020830184616557565b9392505050565b7f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f642060008201527f746f6f206c6f7700000000000000000000000000000000000000000000000000602082015250565b60006188de60278361628c565b91506188e982618882565b604082019050919050565b6000602082019050818103600083015261890d816188d1565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061894a60028361753f565b915061895582618914565b600282019050919050565b6000819050919050565b61897b61897682616140565b618960565b82525050565b600061898c8261893d565b9150618998828561896a565b6020820191506189a8828461896a565b6020820191508190509392505050565b60006080820190506189cd60008301876168a3565b6189da60208301866173d6565b6189e760408301856168a3565b6189f460608301846168a3565b95945050505050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000618a3360188361628c565b9150618a3e826189fd565b602082019050919050565b60006020820190508181036000830152618a6281618a26565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000618a9f601f8361628c565b9150618aaa82618a69565b602082019050919050565b60006020820190508181036000830152618ace81618a92565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618b3160228361628c565b9150618b3c82618ad5565b604082019050919050565b60006020820190508181036000830152618b6081618b24565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000618bc360228361628c565b9150618bce82618b67565b604082019050919050565b60006020820190508181036000830152618bf281618bb6565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c72656160008201527f6479206361737400000000000000000000000000000000000000000000000000602082015250565b6000618c5560278361628c565b9150618c6082618bf9565b604082019050919050565b60006020820190508181036000830152618c8481618c48565b9050919050565b7f476f7665726e6f72566f74696e6753696d706c653a20696e76616c696420766160008201527f6c756520666f7220656e756d20566f7465547970650000000000000000000000602082015250565b6000618ce760358361628c565b9150618cf282618c8b565b604082019050919050565b60006020820190508181036000830152618d1681618cda565b9050919050565b7f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c206964000000600082015250565b6000618d53601d8361628c565b9150618d5e82618d1d565b602082019050919050565b60006020820190508181036000830152618d8281618d46565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203660008201527f3420626974730000000000000000000000000000000000000000000000000000602082015250565b6000618de560268361628c565b9150618df082618d89565b604082019050919050565b60006020820190508181036000830152618e1481618dd8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000618e7760268361628c565b9150618e8282618e1b565b604082019050919050565b60006020820190508181036000830152618ea681618e6a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000618ee3601d8361628c565b9150618eee82618ead565b602082019050919050565b60006020820190508181036000830152618f1281618ed6565b9050919050565b6000618f2482616dd4565b618f2e818561738d565b9350618f3e81856020860161629d565b80840191505092915050565b6000618f568284618f19565b915081905092915050565b600060a082019050618f7660008301886168a3565b618f8360208301876168a3565b618f9060408301866168a3565b618f9d6060830185615f0b565b618faa6080830184616557565b969550505050505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220e4c4ef21389682e5feb911735f43d26b7f768b1c9cb28c392aa5dda9dbadea4264736f6c63430008110033", "devdoc": { "errors": { "Empty()": [ @@ -2118,6 +2236,12 @@ "owner()": { "details": "Returns the address of the current owner." }, + "performUpkeep(bytes)": { + "details": "The input to this method should not be trusted, and the caller of the method should not even be restricted to any single registry. Anyone should be able call it, and the input should be validated, there is no guarantee that the data passed in is the performData returned from checkUpkeep. This could happen due to malicious keepers, racing keepers, or simply a state change while the performUpkeep transaction is waiting for confirmation. Always validate the data passed in.", + "params": { + "performData": "is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state." + } + }, "proposalDeadline(uint256)": { "details": "See {IGovernor-proposalDeadline}." }, @@ -2177,7 +2301,11 @@ }, "userdoc": { "kind": "user", - "methods": {}, + "methods": { + "performUpkeep(bytes)": { + "notice": "method that is actually executed by the keepers, via the registry. The data returned by the checkUpkeep simulation will be passed into this method to actually be executed." + } + }, "version": 1 }, "storageLayout": { @@ -2204,7 +2332,7 @@ "label": "_governanceCall", "offset": 0, "slot": "2", - "type": "t_struct(Bytes32Deque)8209_storage" + "type": "t_struct(Bytes32Deque)9817_storage" }, { "astId": 3296, @@ -2252,7 +2380,7 @@ "label": "_quorumNumeratorHistory", "offset": 0, "slot": "9", - "type": "t_struct(History)4576_storage" + "type": "t_struct(History)6110_storage" }, { "astId": 3479, @@ -2279,7 +2407,7 @@ "type": "t_address" }, { - "astId": 8563, + "astId": 10172, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectId", "offset": 0, @@ -2287,7 +2415,7 @@ "type": "t_uint256" }, { - "astId": 8565, + "astId": 10174, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "lastTimeStamp", "offset": 0, @@ -2295,7 +2423,7 @@ "type": "t_uint256" }, { - "astId": 8567, + "astId": 10176, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "daoPercentage", "offset": 0, @@ -2303,7 +2431,7 @@ "type": "t_uint256" }, { - "astId": 8569, + "astId": 10178, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "enteranceFee", "offset": 0, @@ -2311,7 +2439,7 @@ "type": "t_uint256" }, { - "astId": 8573, + "astId": 10182, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_isFunding", "offset": 0, @@ -2319,7 +2447,7 @@ "type": "t_mapping(t_uint256,t_bool)" }, { - "astId": 8579, + "astId": 10188, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectToTime", "offset": 0, @@ -2327,7 +2455,7 @@ "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))" }, { - "astId": 8583, + "astId": 10192, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "time", "offset": 0, @@ -2335,7 +2463,7 @@ "type": "t_mapping(t_uint256,t_uint256)" }, { - "astId": 8587, + "astId": 10196, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "hashToProjectId", "offset": 0, @@ -2343,7 +2471,7 @@ "type": "t_mapping(t_string_memory_ptr,t_uint256)" }, { - "astId": 8591, + "astId": 10200, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "idToHash", "offset": 0, @@ -2351,7 +2479,7 @@ "type": "t_mapping(t_uint256,t_string_storage)" }, { - "astId": 8597, + "astId": 10206, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "funders", "offset": 0, @@ -2359,7 +2487,7 @@ "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" }, { - "astId": 8601, + "astId": 10210, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectFunds", "offset": 0, @@ -2367,7 +2495,7 @@ "type": "t_mapping(t_uint256,t_uint256)" }, { - "astId": 8605, + "astId": 10214, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectFundingGoalAmount", "offset": 0, @@ -2375,7 +2503,7 @@ "type": "t_mapping(t_uint256,t_uint256)" }, { - "astId": 8609, + "astId": 10218, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_isApporovedByDao", "offset": 0, @@ -2383,7 +2511,7 @@ "type": "t_mapping(t_uint256,t_bool)" }, { - "astId": 8613, + "astId": 10222, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "projectOwnerAddress", "offset": 0, @@ -2391,20 +2519,28 @@ "type": "t_mapping(t_uint256,t_address)" }, { - "astId": 8618, + "astId": 10227, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_ProjectFundingStatus", "offset": 0, "slot": "27", - "type": "t_mapping(t_uint256,t_enum(ProjectFundingStatus)8560)" + "type": "t_mapping(t_uint256,t_enum(ProjectFundingStatus)10169)" }, { - "astId": 8622, + "astId": 10231, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_isEnteranceFeePaid", "offset": 0, "slot": "28", "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 10236, + "contract": "contracts/GovernerContract.sol:GovernerContract", + "label": "investedProjects", + "offset": 0, + "slot": "29", + "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)" } ], "types": { @@ -2413,12 +2549,18 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)4571_storage)dyn_storage": { - "base": "t_struct(Checkpoint)4571_storage", + "t_array(t_struct(Checkpoint)6105_storage)dyn_storage": { + "base": "t_struct(Checkpoint)6105_storage", "encoding": "dynamic_array", "label": "struct Checkpoints.Checkpoint[]", "numberOfBytes": "32" }, + "t_array(t_uint256)dyn_storage": { + "base": "t_uint256", + "encoding": "dynamic_array", + "label": "uint256[]", + "numberOfBytes": "32" + }, "t_bool": { "encoding": "inplace", "label": "bool", @@ -2434,7 +2576,7 @@ "label": "contract TimelockController", "numberOfBytes": "20" }, - "t_enum(ProjectFundingStatus)8560": { + "t_enum(ProjectFundingStatus)10169": { "encoding": "inplace", "label": "enum FundProject.ProjectFundingStatus", "numberOfBytes": "1" @@ -2444,6 +2586,13 @@ "label": "int128", "numberOfBytes": "16" }, + "t_mapping(t_address,t_array(t_uint256)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256[])", + "numberOfBytes": "32", + "value": "t_array(t_uint256)dyn_storage" + }, "t_mapping(t_address,t_bool)": { "encoding": "mapping", "key": "t_address", @@ -2493,12 +2642,12 @@ "numberOfBytes": "32", "value": "t_bytes32" }, - "t_mapping(t_uint256,t_enum(ProjectFundingStatus)8560)": { + "t_mapping(t_uint256,t_enum(ProjectFundingStatus)10169)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => enum FundProject.ProjectFundingStatus)", "numberOfBytes": "32", - "value": "t_enum(ProjectFundingStatus)8560" + "value": "t_enum(ProjectFundingStatus)10169" }, "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { "encoding": "mapping", @@ -2552,12 +2701,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(BlockNumber)5154_storage": { + "t_struct(BlockNumber)6762_storage": { "encoding": "inplace", "label": "struct Timers.BlockNumber", "members": [ { - "astId": 5153, + "astId": 6761, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_deadline", "offset": 0, @@ -2567,12 +2716,12 @@ ], "numberOfBytes": "32" }, - "t_struct(Bytes32Deque)8209_storage": { + "t_struct(Bytes32Deque)9817_storage": { "encoding": "inplace", "label": "struct DoubleEndedQueue.Bytes32Deque", "members": [ { - "astId": 8202, + "astId": 9810, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_begin", "offset": 0, @@ -2580,7 +2729,7 @@ "type": "t_int128" }, { - "astId": 8204, + "astId": 9812, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_end", "offset": 16, @@ -2588,7 +2737,7 @@ "type": "t_int128" }, { - "astId": 8208, + "astId": 9816, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_data", "offset": 0, @@ -2598,12 +2747,12 @@ ], "numberOfBytes": "64" }, - "t_struct(Checkpoint)4571_storage": { + "t_struct(Checkpoint)6105_storage": { "encoding": "inplace", "label": "struct Checkpoints.Checkpoint", "members": [ { - "astId": 4568, + "astId": 6102, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_blockNumber", "offset": 0, @@ -2611,7 +2760,7 @@ "type": "t_uint32" }, { - "astId": 4570, + "astId": 6104, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_value", "offset": 4, @@ -2621,17 +2770,17 @@ ], "numberOfBytes": "32" }, - "t_struct(History)4576_storage": { + "t_struct(History)6110_storage": { "encoding": "inplace", "label": "struct Checkpoints.History", "members": [ { - "astId": 4575, + "astId": 6109, "contract": "contracts/GovernerContract.sol:GovernerContract", "label": "_checkpoints", "offset": 0, "slot": "0", - "type": "t_array(t_struct(Checkpoint)4571_storage)dyn_storage" + "type": "t_array(t_struct(Checkpoint)6105_storage)dyn_storage" } ], "numberOfBytes": "32" @@ -2646,7 +2795,7 @@ "label": "voteStart", "offset": 0, "slot": "0", - "type": "t_struct(BlockNumber)5154_storage" + "type": "t_struct(BlockNumber)6762_storage" }, { "astId": 616, @@ -2654,7 +2803,7 @@ "label": "voteEnd", "offset": 0, "slot": "1", - "type": "t_struct(BlockNumber)5154_storage" + "type": "t_struct(BlockNumber)6762_storage" }, { "astId": 618, diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json index 77e97f0..b11de39 100644 --- a/deployments/localhost/TimeLock.json +++ b/deployments/localhost/TimeLock.json @@ -875,7 +875,7 @@ "transactionIndex": 0, "gasUsed": "3021451", "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000000000001000000000000000000000200000010200000000000000000000000000010000000000000000000000000000000000001000000000040020000400000000100800800000004000000000000020000000000000000000000000000000000000000000000000000000000080000000200000000000000000020000000000000000000000000000000000000001000000000000000000040000000204000000000000000000200002008000100000100200020000000000000001000000000000000000000000000000000000000000000000000", - "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c", + "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13", "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", "logs": [ { @@ -891,7 +891,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" + "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" }, { "transactionIndex": 0, @@ -906,7 +906,7 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" + "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" }, { "transactionIndex": 0, @@ -921,7 +921,7 @@ ], "data": "0x", "logIndex": 2, - "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" + "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" }, { "transactionIndex": 0, @@ -936,7 +936,7 @@ ], "data": "0x", "logIndex": 3, - "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" + "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" }, { "transactionIndex": 0, @@ -951,7 +951,7 @@ ], "data": "0x", "logIndex": 4, - "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" + "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" }, { "transactionIndex": 0, @@ -966,7 +966,7 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" + "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" }, { "transactionIndex": 0, @@ -978,7 +978,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 6, - "blockHash": "0x0cbdb073ee2774797d67eb1cf8942c773b2ae4584e88e45245ca55ff8297454c" + "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" } ], "blockNumber": 1, @@ -992,7 +992,7 @@ [] ], "numDeployments": 1, - "solcInputHash": "e037150c05e743a0afcdb8bf195f828d", + "solcInputHash": "9bb96e2ab1a2d14e7d6f1254972fa73c", "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minDelay\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"proposers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"executers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"CallExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"CallScheduled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"Cancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDuration\",\"type\":\"uint256\"}],\"name\":\"MinDelayChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CANCELLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"EXECUTOR_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROPOSER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TIMELOCK_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"cancel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"executeBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"}],\"name\":\"hashOperationBatch\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperation\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"registered\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationDone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"done\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationPending\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"isOperationReady\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"ready\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"schedule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"targets\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"predecessor\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delay\",\"type\":\"uint256\"}],\"name\":\"scheduleBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newDelay\",\"type\":\"uint256\"}],\"name\":\"updateDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"cancel(bytes32)\":{\"details\":\"Cancel an operation. Requirements: - the caller must have the 'canceller' role.\"},\"execute(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a single transaction. Emits a {CallExecuted} event. Requirements: - the caller must have the 'executor' role.\"},\"executeBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Execute an (ready) operation containing a batch of transactions. Emits one {CallExecuted} event per transaction in the batch. Requirements: - the caller must have the 'executor' role.\"},\"getMinDelay()\":{\"details\":\"Returns the minimum delay for an operation to become valid. This value can be changed by executing an operation that calls `updateDelay`.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp at with an operation becomes ready (0 for unset operations, 1 for done operations).\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"hashOperation(address,uint256,bytes,bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a single transaction.\"},\"hashOperationBatch(address[],uint256[],bytes[],bytes32,bytes32)\":{\"details\":\"Returns the identifier of an operation containing a batch of transactions.\"},\"isOperation(bytes32)\":{\"details\":\"Returns whether an id correspond to a registered operation. This includes both Pending, Ready and Done operations.\"},\"isOperationDone(bytes32)\":{\"details\":\"Returns whether an operation is done or not.\"},\"isOperationPending(bytes32)\":{\"details\":\"Returns whether an operation is pending or not.\"},\"isOperationReady(bytes32)\":{\"details\":\"Returns whether an operation is ready or not.\"},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155BatchReceived}.\"},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155Receiver-onERC1155Received}.\"},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"schedule(address,uint256,bytes,bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a single transaction. Emits a {CallScheduled} event. Requirements: - the caller must have the 'proposer' role.\"},\"scheduleBatch(address[],uint256[],bytes[],bytes32,bytes32,uint256)\":{\"details\":\"Schedule an operation containing a batch of transactions. Emits one {CallScheduled} event per transaction in the batch. Requirements: - the caller must have the 'proposer' role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"updateDelay(uint256)\":{\"details\":\"Changes the minimum timelock duration for future operations. Emits a {MinDelayChange} event. Requirements: - the caller must be the timelock itself. This can only be achieved by scheduling and later executing an operation where the timelock is the target and the data is the ABI-encoded call to this function.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TimeLock.sol\":\"TimeLock\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5b35d8e68aeaccc685239bd9dd79b9ba01a0357930f8a3307ab85511733d9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/governance/TimelockController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../access/AccessControl.sol\\\";\\nimport \\\"../token/ERC721/IERC721Receiver.sol\\\";\\nimport \\\"../token/ERC1155/IERC1155Receiver.sol\\\";\\nimport \\\"../utils/Address.sol\\\";\\n\\n/**\\n * @dev Contract module which acts as a timelocked controller. When set as the\\n * owner of an `Ownable` smart contract, it enforces a timelock on all\\n * `onlyOwner` maintenance operations. This gives time for users of the\\n * controlled contract to exit before a potentially dangerous maintenance\\n * operation is applied.\\n *\\n * By default, this contract is self administered, meaning administration tasks\\n * have to go through the timelock process. The proposer (resp executor) role\\n * is in charge of proposing (resp executing) operations. A common use case is\\n * to position this {TimelockController} as the owner of a smart contract, with\\n * a multisig or a DAO as the sole proposer.\\n *\\n * _Available since v3.3._\\n */\\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\\\"TIMELOCK_ADMIN_ROLE\\\");\\n bytes32 public constant PROPOSER_ROLE = keccak256(\\\"PROPOSER_ROLE\\\");\\n bytes32 public constant EXECUTOR_ROLE = keccak256(\\\"EXECUTOR_ROLE\\\");\\n bytes32 public constant CANCELLER_ROLE = keccak256(\\\"CANCELLER_ROLE\\\");\\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\\n\\n mapping(bytes32 => uint256) private _timestamps;\\n uint256 private _minDelay;\\n\\n /**\\n * @dev Emitted when a call is scheduled as part of operation `id`.\\n */\\n event CallScheduled(\\n bytes32 indexed id,\\n uint256 indexed index,\\n address target,\\n uint256 value,\\n bytes data,\\n bytes32 predecessor,\\n uint256 delay\\n );\\n\\n /**\\n * @dev Emitted when a call is performed as part of operation `id`.\\n */\\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\\n\\n /**\\n * @dev Emitted when operation `id` is cancelled.\\n */\\n event Cancelled(bytes32 indexed id);\\n\\n /**\\n * @dev Emitted when the minimum delay for future operations is modified.\\n */\\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\\n\\n /**\\n * @dev Initializes the contract with a given `minDelay`, and a list of\\n * initial proposers and executors. The proposers receive both the\\n * proposer and the canceller role (for backward compatibility). The\\n * executors receive the executor role.\\n *\\n * NOTE: At construction, both the deployer and the timelock itself are\\n * administrators. This helps further configuration of the timelock by the\\n * deployer. After configuration is done, it is recommended that the\\n * deployer renounces its admin position and relies on timelocked\\n * operations to perform future maintenance.\\n */\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executors\\n ) {\\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\\n\\n // deployer + self administration\\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\\n\\n // register proposers and cancellers\\n for (uint256 i = 0; i < proposers.length; ++i) {\\n _setupRole(PROPOSER_ROLE, proposers[i]);\\n _setupRole(CANCELLER_ROLE, proposers[i]);\\n }\\n\\n // register executors\\n for (uint256 i = 0; i < executors.length; ++i) {\\n _setupRole(EXECUTOR_ROLE, executors[i]);\\n }\\n\\n _minDelay = minDelay;\\n emit MinDelayChange(0, minDelay);\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only by a certain role. In\\n * addition to checking the sender's role, `address(0)` 's role is also\\n * considered. Granting a role to `address(0)` is equivalent to enabling\\n * this role for everyone.\\n */\\n modifier onlyRoleOrOpenRole(bytes32 role) {\\n if (!hasRole(role, address(0))) {\\n _checkRole(role, _msgSender());\\n }\\n _;\\n }\\n\\n /**\\n * @dev Contract might receive/hold ETH as part of the maintenance process.\\n */\\n receive() external payable {}\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns whether an id correspond to a registered operation. This\\n * includes both Pending, Ready and Done operations.\\n */\\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\\n return getTimestamp(id) > 0;\\n }\\n\\n /**\\n * @dev Returns whether an operation is pending or not.\\n */\\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\\n return getTimestamp(id) > _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns whether an operation is ready or not.\\n */\\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\\n uint256 timestamp = getTimestamp(id);\\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\\n }\\n\\n /**\\n * @dev Returns whether an operation is done or not.\\n */\\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\\n return getTimestamp(id) == _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Returns the timestamp at with an operation becomes ready (0 for\\n * unset operations, 1 for done operations).\\n */\\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\\n return _timestamps[id];\\n }\\n\\n /**\\n * @dev Returns the minimum delay for an operation to become valid.\\n *\\n * This value can be changed by executing an operation that calls `updateDelay`.\\n */\\n function getMinDelay() public view virtual returns (uint256 duration) {\\n return _minDelay;\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a single\\n * transaction.\\n */\\n function hashOperation(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(target, value, data, predecessor, salt));\\n }\\n\\n /**\\n * @dev Returns the identifier of an operation containing a batch of\\n * transactions.\\n */\\n function hashOperationBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public pure virtual returns (bytes32 hash) {\\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\\n }\\n\\n /**\\n * @dev Schedule an operation containing a single transaction.\\n *\\n * Emits a {CallScheduled} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function schedule(\\n address target,\\n uint256 value,\\n bytes calldata data,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\\n _schedule(id, delay);\\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\\n }\\n\\n /**\\n * @dev Schedule an operation containing a batch of transactions.\\n *\\n * Emits one {CallScheduled} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'proposer' role.\\n */\\n function scheduleBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt,\\n uint256 delay\\n ) public virtual onlyRole(PROPOSER_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n _schedule(id, delay);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\\n }\\n }\\n\\n /**\\n * @dev Schedule an operation that is to becomes valid after a given delay.\\n */\\n function _schedule(bytes32 id, uint256 delay) private {\\n require(!isOperation(id), \\\"TimelockController: operation already scheduled\\\");\\n require(delay >= getMinDelay(), \\\"TimelockController: insufficient delay\\\");\\n _timestamps[id] = block.timestamp + delay;\\n }\\n\\n /**\\n * @dev Cancel an operation.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'canceller' role.\\n */\\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\\n require(isOperationPending(id), \\\"TimelockController: operation cannot be cancelled\\\");\\n delete _timestamps[id];\\n\\n emit Cancelled(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a single transaction.\\n *\\n * Emits a {CallExecuted} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\\n // thus any modifications to the operation during reentrancy should be caught.\\n // slither-disable-next-line reentrancy-eth\\n function execute(\\n address target,\\n uint256 value,\\n bytes calldata payload,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n _execute(target, value, payload);\\n emit CallExecuted(id, 0, target, value, payload);\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an (ready) operation containing a batch of transactions.\\n *\\n * Emits one {CallExecuted} event per transaction in the batch.\\n *\\n * Requirements:\\n *\\n * - the caller must have the 'executor' role.\\n */\\n function executeBatch(\\n address[] calldata targets,\\n uint256[] calldata values,\\n bytes[] calldata payloads,\\n bytes32 predecessor,\\n bytes32 salt\\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\\n require(targets.length == values.length, \\\"TimelockController: length mismatch\\\");\\n require(targets.length == payloads.length, \\\"TimelockController: length mismatch\\\");\\n\\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\\n\\n _beforeCall(id, predecessor);\\n for (uint256 i = 0; i < targets.length; ++i) {\\n address target = targets[i];\\n uint256 value = values[i];\\n bytes calldata payload = payloads[i];\\n _execute(target, value, payload);\\n emit CallExecuted(id, i, target, value, payload);\\n }\\n _afterCall(id);\\n }\\n\\n /**\\n * @dev Execute an operation's call.\\n */\\n function _execute(\\n address target,\\n uint256 value,\\n bytes calldata data\\n ) internal virtual {\\n (bool success, ) = target.call{value: value}(data);\\n require(success, \\\"TimelockController: underlying transaction reverted\\\");\\n }\\n\\n /**\\n * @dev Checks before execution of an operation's calls.\\n */\\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \\\"TimelockController: missing dependency\\\");\\n }\\n\\n /**\\n * @dev Checks after execution of an operation's calls.\\n */\\n function _afterCall(bytes32 id) private {\\n require(isOperationReady(id), \\\"TimelockController: operation is not ready\\\");\\n _timestamps[id] = _DONE_TIMESTAMP;\\n }\\n\\n /**\\n * @dev Changes the minimum timelock duration for future operations.\\n *\\n * Emits a {MinDelayChange} event.\\n *\\n * Requirements:\\n *\\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\\n */\\n function updateDelay(uint256 newDelay) external virtual {\\n require(msg.sender == address(this), \\\"TimelockController: caller must be timelock\\\");\\n emit MinDelayChange(_minDelay, newDelay);\\n _minDelay = newDelay;\\n }\\n\\n /**\\n * @dev See {IERC721Receiver-onERC721Received}.\\n */\\n function onERC721Received(\\n address,\\n address,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC721Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155Received}.\\n */\\n function onERC1155Received(\\n address,\\n address,\\n uint256,\\n uint256,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155Received.selector;\\n }\\n\\n /**\\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\\n */\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] memory,\\n uint256[] memory,\\n bytes memory\\n ) public virtual override returns (bytes4) {\\n return this.onERC1155BatchReceived.selector;\\n }\\n}\\n\",\"keccak256\":\"0x6d9ec0025a3e257dee17550c0c6ce94ff200d1a646d2ebe951309ad179f0df18\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(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\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.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 Strings {\\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\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/TimeLock.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/governance/TimelockController.sol\\\";\\n\\ncontract TimeLock is TimelockController {\\n // minDelay: How long you have to wait before executing\\n // proposers is the list of addresses that can purpose\\n // executers: Who can execute when proposal passes\\n constructor(\\n uint256 minDelay,\\n address[] memory proposers,\\n address[] memory executers\\n ) TimelockController(minDelay, proposers, executers) {}\\n}\\n\",\"keccak256\":\"0x6e48ab9ddd3998d94cdd53158d3d0d16984ac638fb4f685fae7fd734254e3c11\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523480156200001157600080fd5b5060405162003bd838038062003bd8833981810160405281019062000037919062000779565b8282826200006c7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5806200035560201b60201c565b620000be7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc17f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001107fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e637f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7837f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca56200035560201b60201c565b620001a37f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca562000197620003b860201b60201c565b620003c060201b60201c565b620001d57f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca530620003c060201b60201c565b60005b82518110156200029457620002317fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc18483815181106200021d576200021c62000813565b5b6020026020010151620003c060201b60201c565b620002807ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7838483815181106200026c576200026b62000813565b5b6020026020010151620003c060201b60201c565b806200028c9062000871565b9050620001d8565b5060005b81518110156200030557620002f17fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63838381518110620002dd57620002dc62000813565b5b6020026020010151620003c060201b60201c565b80620002fd9062000871565b905062000298565b50826002819055507f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5600084604051620003419291906200091c565b60405180910390a150505050505062000949565b60006200036883620003d660201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b620003d28282620003f560201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b620004078282620004e660201b60201c565b620004e257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000487620003b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b620005798162000564565b81146200058557600080fd5b50565b60008151905062000599816200056e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005ef82620005a4565b810181811067ffffffffffffffff82111715620006115762000610620005b5565b5b80604052505050565b60006200062662000550565b9050620006348282620005e4565b919050565b600067ffffffffffffffff821115620006575762000656620005b5565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200069a826200066d565b9050919050565b620006ac816200068d565b8114620006b857600080fd5b50565b600081519050620006cc81620006a1565b92915050565b6000620006e9620006e38462000639565b6200061a565b905080838252602082019050602084028301858111156200070f576200070e62000668565b5b835b818110156200073c5780620007278882620006bb565b84526020840193505060208101905062000711565b5050509392505050565b600082601f8301126200075e576200075d6200059f565b5b815162000770848260208601620006d2565b91505092915050565b6000806000606084860312156200079557620007946200055a565b5b6000620007a58682870162000588565b935050602084015167ffffffffffffffff811115620007c957620007c86200055f565b5b620007d78682870162000746565b925050604084015167ffffffffffffffff811115620007fb57620007fa6200055f565b5b620008098682870162000746565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200087e8262000564565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620008b357620008b262000842565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000620008f3620008ed620008e784620008be565b620008c8565b62000564565b9050919050565b6200090581620008d2565b82525050565b620009168162000564565b82525050565b6000604082019050620009336000830185620008fa565b6200094260208301846200090b565b9392505050565b61327f80620009596000396000f3fe6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", "deployedBytecode": "0x6080604052600436106101bb5760003560e01c80638065657f116100ec578063bc197c811161008a578063d547741f11610064578063d547741f1461068c578063e38335e5146106b5578063f23a6e61146106d1578063f27a0c921461070e576101c2565b8063bc197c81146105e9578063c4d252f514610626578063d45c44351461064f576101c2565b806391d14854116100c657806391d1485414610519578063a217fddf14610556578063b08e51c014610581578063b1c5f427146105ac576101c2565b80638065657f146104885780638f2a0bb0146104c55780638f61f4f5146104ee576101c2565b8063248a9ca31161015957806331d507501161013357806331d50750146103bc57806336568abe146103f9578063584b153e1461042257806364d623531461045f576101c2565b8063248a9ca3146103195780632ab0f529146103565780632f2ff15d14610393576101c2565b80630d3cf6fc116101955780630d3cf6fc14610258578063134008d31461028357806313bc9f201461029f578063150b7a02146102dc576101c2565b806301d5062a146101c757806301ffc9a7146101f057806307bd02651461022d576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611a8b565b610739565b005b3480156101fc57600080fd5b5061021760048036038101906102129190611b92565b6107ce565b6040516102249190611bda565b60405180910390f35b34801561023957600080fd5b50610242610848565b60405161024f9190611c04565b60405180910390f35b34801561026457600080fd5b5061026d61086c565b60405161027a9190611c04565b60405180910390f35b61029d60048036038101906102989190611c1f565b610890565b005b3480156102ab57600080fd5b506102c660048036038101906102c19190611cb9565b61094d565b6040516102d39190611bda565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190611e27565b610973565b6040516103109190611eb9565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190611cb9565b610987565b60405161034d9190611c04565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190611cb9565b6109a6565b60405161038a9190611bda565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b59190611ed4565b6109bb565b005b3480156103c857600080fd5b506103e360048036038101906103de9190611cb9565b6109dc565b6040516103f09190611bda565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190611ed4565b6109f0565b005b34801561042e57600080fd5b5061044960048036038101906104449190611cb9565b610a73565b6040516104569190611bda565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190611f14565b610a88565b005b34801561049457600080fd5b506104af60048036038101906104aa9190611c1f565b610b3b565b6040516104bc9190611c04565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612043565b610b7a565b005b3480156104fa57600080fd5b50610503610d25565b6040516105109190611c04565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190611ed4565b610d49565b60405161054d9190611bda565b60405180910390f35b34801561056257600080fd5b5061056b610db3565b6040516105789190611c04565b60405180910390f35b34801561058d57600080fd5b50610596610dba565b6040516105a39190611c04565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190612132565b610dde565b6040516105e09190611c04565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b91906122d1565b610e23565b60405161061d9190611eb9565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190611cb9565b610e38565b005b34801561065b57600080fd5b5061067660048036038101906106719190611cb9565b610ef2565b60405161068391906123af565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190611ed4565b610f0f565b005b6106cf60048036038101906106ca9190612132565b610f30565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906123ca565b61111a565b6040516107059190611eb9565b60405180910390f35b34801561071a57600080fd5b5061072361112f565b60405161073091906123af565b60405180910390f35b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161076381611139565b6000610773898989898989610b3b565b905061077f818461114d565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a6040516107bb969594939291906124ae565b60405180910390a3505050505050505050565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610841575061084082611207565b5b9050919050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636108bc816000610d49565b6108d2576108d1816108cc611281565b611289565b5b60006108e2888888888888610b3b565b90506108ee8185611326565b6108fa888888886113c7565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a604051610932949392919061250a565b60405180910390a36109438161147e565b5050505050505050565b60008061095983610ef2565b905060018111801561096b5750428111155b915050919050565b600063150b7a0260e01b9050949350505050565b6000806000838152602001908152602001600020600101549050919050565b600060016109b383610ef2565b149050919050565b6109c482610987565b6109cd81611139565b6109d783836114e1565b505050565b6000806109e883610ef2565b119050919050565b6109f8611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906125cd565b60405180910390fd5b610a6f82826115c1565b5050565b60006001610a8083610ef2565b119050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed9061265f565b60405180910390fd5b7f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d560025482604051610b2992919061267f565b60405180910390a18060028190555050565b6000868686868686604051602001610b58969594939291906126a8565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610ba481611139565b878790508a8a905014610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390612776565b60405180910390fd5b858590508a8a905014610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90612776565b60405180910390fd5b6000610c468b8b8b8b8b8b8b8b610dde565b9050610c52818461114d565b60005b8b8b9050811015610d175780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c9657610c95612796565b5b9050602002016020810190610cab91906127c5565b8d8d86818110610cbe57610cbd612796565b5b905060200201358c8c87818110610cd857610cd7612796565b5b9050602002810190610cea9190612801565b8c8b604051610cfe969594939291906124ae565b60405180910390a380610d1090612893565b9050610c55565b505050505050505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b60008888888888888888604051602001610dff989796959493929190612b7d565b60405160208183030381529060405280519060200120905098975050505050505050565b600063bc197c8160e01b905095945050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610e6281611139565b610e6b82610a73565b610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612c5d565b60405180910390fd5b6001600083815260200190815260200160002060009055817fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7060405160405180910390a25050565b600060016000838152602001908152602001600020549050919050565b610f1882610987565b610f2181611139565b610f2b83836115c1565b505050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610f5c816000610d49565b610f7257610f7181610f6c611281565b611289565b5b868690508989905014610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190612776565b60405180910390fd5b848490508989905014611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990612776565b60405180910390fd5b60006110148a8a8a8a8a8a8a8a610dde565b90506110208185611326565b60005b8a8a90508110156111045760008b8b8381811061104357611042612796565b5b905060200201602081019061105891906127c5565b905060008a8a8481811061106f5761106e612796565b5b9050602002013590503660008a8a8681811061108e5761108d612796565b5b90506020028101906110a09190612801565b915091506110b0848484846113c7565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110e7949392919061250a565b60405180910390a350505050806110fd90612893565b9050611023565b5061110e8161147e565b50505050505050505050565b600063f23a6e6160e01b905095945050505050565b6000600254905090565b61114a81611145611281565b611289565b50565b611156826109dc565b15611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90612cef565b60405180910390fd5b61119e61112f565b8110156111e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d790612d81565b60405180910390fd5b80426111ec9190612da1565b60016000848152602001908152602001600020819055505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061127a5750611279826116a2565b5b9050919050565b600033905090565b6112938282610d49565b611322576112b88173ffffffffffffffffffffffffffffffffffffffff16601461170c565b6112c68360001c602061170c565b6040516020016112d7929190612ede565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113199190612f51565b60405180910390fd5b5050565b61132f8261094d565b61136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590612fe5565b60405180910390fd5b6000801b8114806113845750611383816109a6565b5b6113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613077565b60405180910390fd5b5050565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516113f19291906130c7565b60006040518083038185875af1925050503d806000811461142e576040519150601f19603f3d011682016040523d82523d6000602084013e611433565b606091505b5050905080611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90613152565b60405180910390fd5b5050505050565b6114878161094d565b6114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90612fe5565b60405180910390fd5b60018060008381526020019081526020016000208190555050565b6114eb8282610d49565b6115bd57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611562611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6115cb8282610d49565b1561169e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611643611281565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600283600261171f9190613172565b6117299190612da1565b67ffffffffffffffff81111561174257611741611cfc565b5b6040519080825280601f01601f1916602001820160405280156117745781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117ac576117ab612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106118105761180f612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026118509190613172565b61185a9190612da1565b90505b60018111156118fa577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061189c5761189b612796565b5b1a60f81b8282815181106118b3576118b2612796565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806118f3906131b4565b905061185d565b506000841461193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590613229565b60405180910390fd5b8091505092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119878261195c565b9050919050565b6119978161197c565b81146119a257600080fd5b50565b6000813590506119b48161198e565b92915050565b6000819050919050565b6119cd816119ba565b81146119d857600080fd5b50565b6000813590506119ea816119c4565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a1557611a146119f0565b5b8235905067ffffffffffffffff811115611a3257611a316119f5565b5b602083019150836001820283011115611a4e57611a4d6119fa565b5b9250929050565b6000819050919050565b611a6881611a55565b8114611a7357600080fd5b50565b600081359050611a8581611a5f565b92915050565b600080600080600080600060c0888a031215611aaa57611aa9611952565b5b6000611ab88a828b016119a5565b9750506020611ac98a828b016119db565b965050604088013567ffffffffffffffff811115611aea57611ae9611957565b5b611af68a828b016119ff565b95509550506060611b098a828b01611a76565b9350506080611b1a8a828b01611a76565b92505060a0611b2b8a828b016119db565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b6f81611b3a565b8114611b7a57600080fd5b50565b600081359050611b8c81611b66565b92915050565b600060208284031215611ba857611ba7611952565b5b6000611bb684828501611b7d565b91505092915050565b60008115159050919050565b611bd481611bbf565b82525050565b6000602082019050611bef6000830184611bcb565b92915050565b611bfe81611a55565b82525050565b6000602082019050611c196000830184611bf5565b92915050565b60008060008060008060a08789031215611c3c57611c3b611952565b5b6000611c4a89828a016119a5565b9650506020611c5b89828a016119db565b955050604087013567ffffffffffffffff811115611c7c57611c7b611957565b5b611c8889828a016119ff565b94509450506060611c9b89828a01611a76565b9250506080611cac89828a01611a76565b9150509295509295509295565b600060208284031215611ccf57611cce611952565b5b6000611cdd84828501611a76565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d3482611ceb565b810181811067ffffffffffffffff82111715611d5357611d52611cfc565b5b80604052505050565b6000611d66611948565b9050611d728282611d2b565b919050565b600067ffffffffffffffff821115611d9257611d91611cfc565b5b611d9b82611ceb565b9050602081019050919050565b82818337600083830152505050565b6000611dca611dc584611d77565b611d5c565b905082815260208101848484011115611de657611de5611ce6565b5b611df1848285611da8565b509392505050565b600082601f830112611e0e57611e0d6119f0565b5b8135611e1e848260208601611db7565b91505092915050565b60008060008060808587031215611e4157611e40611952565b5b6000611e4f878288016119a5565b9450506020611e60878288016119a5565b9350506040611e71878288016119db565b925050606085013567ffffffffffffffff811115611e9257611e91611957565b5b611e9e87828801611df9565b91505092959194509250565b611eb381611b3a565b82525050565b6000602082019050611ece6000830184611eaa565b92915050565b60008060408385031215611eeb57611eea611952565b5b6000611ef985828601611a76565b9250506020611f0a858286016119a5565b9150509250929050565b600060208284031215611f2a57611f29611952565b5b6000611f38848285016119db565b91505092915050565b60008083601f840112611f5757611f566119f0565b5b8235905067ffffffffffffffff811115611f7457611f736119f5565b5b602083019150836020820283011115611f9057611f8f6119fa565b5b9250929050565b60008083601f840112611fad57611fac6119f0565b5b8235905067ffffffffffffffff811115611fca57611fc96119f5565b5b602083019150836020820283011115611fe657611fe56119fa565b5b9250929050565b60008083601f840112612003576120026119f0565b5b8235905067ffffffffffffffff8111156120205761201f6119f5565b5b60208301915083602082028301111561203c5761203b6119fa565b5b9250929050565b600080600080600080600080600060c08a8c03121561206557612064611952565b5b60008a013567ffffffffffffffff81111561208357612082611957565b5b61208f8c828d01611f41565b995099505060208a013567ffffffffffffffff8111156120b2576120b1611957565b5b6120be8c828d01611f97565b975097505060408a013567ffffffffffffffff8111156120e1576120e0611957565b5b6120ed8c828d01611fed565b955095505060606121008c828d01611a76565b93505060806121118c828d01611a76565b92505060a06121228c828d016119db565b9150509295985092959850929598565b60008060008060008060008060a0898b03121561215257612151611952565b5b600089013567ffffffffffffffff8111156121705761216f611957565b5b61217c8b828c01611f41565b9850985050602089013567ffffffffffffffff81111561219f5761219e611957565b5b6121ab8b828c01611f97565b9650965050604089013567ffffffffffffffff8111156121ce576121cd611957565b5b6121da8b828c01611fed565b945094505060606121ed8b828c01611a76565b92505060806121fe8b828c01611a76565b9150509295985092959890939650565b600067ffffffffffffffff82111561222957612228611cfc565b5b602082029050602081019050919050565b600061224d6122488461220e565b611d5c565b905080838252602082019050602084028301858111156122705761226f6119fa565b5b835b81811015612299578061228588826119db565b845260208401935050602081019050612272565b5050509392505050565b600082601f8301126122b8576122b76119f0565b5b81356122c884826020860161223a565b91505092915050565b600080600080600060a086880312156122ed576122ec611952565b5b60006122fb888289016119a5565b955050602061230c888289016119a5565b945050604086013567ffffffffffffffff81111561232d5761232c611957565b5b612339888289016122a3565b935050606086013567ffffffffffffffff81111561235a57612359611957565b5b612366888289016122a3565b925050608086013567ffffffffffffffff81111561238757612386611957565b5b61239388828901611df9565b9150509295509295909350565b6123a9816119ba565b82525050565b60006020820190506123c460008301846123a0565b92915050565b600080600080600060a086880312156123e6576123e5611952565b5b60006123f4888289016119a5565b9550506020612405888289016119a5565b9450506040612416888289016119db565b9350506060612427888289016119db565b925050608086013567ffffffffffffffff81111561244857612447611957565b5b61245488828901611df9565b9150509295509295909350565b61246a8161197c565b82525050565b600082825260208201905092915050565b600061248d8385612470565b935061249a838584611da8565b6124a383611ceb565b840190509392505050565b600060a0820190506124c36000830189612461565b6124d060208301886123a0565b81810360408301526124e3818688612481565b90506124f26060830185611bf5565b6124ff60808301846123a0565b979650505050505050565b600060608201905061251f6000830187612461565b61252c60208301866123a0565b818103604083015261253f818486612481565b905095945050505050565b600082825260208201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006125b7602f8361254a565b91506125c28261255b565b604082019050919050565b600060208201905081810360008301526125e6816125aa565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060008201527f62652074696d656c6f636b000000000000000000000000000000000000000000602082015250565b6000612649602b8361254a565b9150612654826125ed565b604082019050919050565b600060208201905081810360008301526126788161263c565b9050919050565b600060408201905061269460008301856123a0565b6126a160208301846123a0565b9392505050565b600060a0820190506126bd6000830189612461565b6126ca60208301886123a0565b81810360408301526126dd818688612481565b90506126ec6060830185611bf5565b6126f96080830184611bf5565b979650505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160008201527f7463680000000000000000000000000000000000000000000000000000000000602082015250565b600061276060238361254a565b915061276b82612704565b604082019050919050565b6000602082019050818103600083015261278f81612753565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156127db576127da611952565b5b60006127e9848285016119a5565b91505092915050565b600080fd5b600080fd5b600080fd5b6000808335600160200384360303811261281e5761281d6127f2565b5b80840192508235915067ffffffffffffffff8211156128405761283f6127f7565b5b60208301925060018202360383131561285c5761285b6127fc565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289e826119ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d0576128cf612864565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b6128ff8161197c565b82525050565b600061291183836128f6565b60208301905092915050565b600061292c60208401846119a5565b905092915050565b6000602082019050919050565b600061294d83856128db565b9350612958826128ec565b8060005b858110156129915761296e828461291d565b6129788882612905565b975061298383612934565b92505060018101905061295c565b5085925050509392505050565b600082825260208201905092915050565b600080fd5b82818337505050565b60006129c9838561299e565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156129fc576129fb6129af565b5b602083029250612a0d8385846129b4565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b600082825260208201905092915050565b6000612a518385612a34565b9350612a5e838584611da8565b612a6783611ceb565b840190509392505050565b6000612a7f848484612a45565b90509392505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612ab457612ab3612a92565b5b83810192508235915060208301925067ffffffffffffffff821115612adc57612adb612a88565b5b600182023603831315612af257612af1612a8d565b5b509250929050565b6000602082019050919050565b6000612b138385612a19565b935083602084028501612b2584612a2a565b8060005b87811015612b6b578484038952612b408284612a97565b612b4b868284612a72565b9550612b5684612afa565b935060208b019a505050600181019050612b29565b50829750879450505050509392505050565b600060a0820190508181036000830152612b98818a8c612941565b90508181036020830152612bad81888a6129bd565b90508181036040830152612bc2818688612b07565b9050612bd16060830185611bf5565b612bde6080830184611bf5565b9998505050505050505050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160008201527f6e6e6f742062652063616e63656c6c6564000000000000000000000000000000602082015250565b6000612c4760318361254a565b9150612c5282612beb565b604082019050919050565b60006020820190508181036000830152612c7681612c3a565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60008201527f7265616479207363686564756c65640000000000000000000000000000000000602082015250565b6000612cd9602f8361254a565b9150612ce482612c7d565b604082019050919050565b60006020820190508181036000830152612d0881612ccc565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460008201527f2064656c61790000000000000000000000000000000000000000000000000000602082015250565b6000612d6b60268361254a565b9150612d7682612d0f565b604082019050919050565b60006020820190508181036000830152612d9a81612d5e565b9050919050565b6000612dac826119ba565b9150612db7836119ba565b9250828201905080821115612dcf57612dce612864565b5b92915050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612e16601783612dd5565b9150612e2182612de0565b601782019050919050565b600081519050919050565b60005b83811015612e55578082015181840152602081019050612e3a565b60008484015250505050565b6000612e6c82612e2c565b612e768185612dd5565b9350612e86818560208601612e37565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612ec8601183612dd5565b9150612ed382612e92565b601182019050919050565b6000612ee982612e09565b9150612ef58285612e61565b9150612f0082612ebb565b9150612f0c8284612e61565b91508190509392505050565b6000612f2382612e2c565b612f2d818561254a565b9350612f3d818560208601612e37565b612f4681611ceb565b840191505092915050565b60006020820190508181036000830152612f6b8184612f18565b905092915050565b7f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360008201527f206e6f7420726561647900000000000000000000000000000000000000000000602082015250565b6000612fcf602a8361254a565b9150612fda82612f73565b604082019050919050565b60006020820190508181036000830152612ffe81612fc2565b9050919050565b7f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560008201527f6e64656e63790000000000000000000000000000000000000000000000000000602082015250565b600061306160268361254a565b915061306c82613005565b604082019050919050565b6000602082019050818103600083015261309081613054565b9050919050565b600081905092915050565b60006130ae8385613097565b93506130bb838584611da8565b82840190509392505050565b60006130d48284866130a2565b91508190509392505050565b7f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460008201527f72616e73616374696f6e20726576657274656400000000000000000000000000602082015250565b600061313c60338361254a565b9150613147826130e0565b604082019050919050565b6000602082019050818103600083015261316b8161312f565b9050919050565b600061317d826119ba565b9150613188836119ba565b9250828202613196816119ba565b915082820484148315176131ad576131ac612864565b5b5092915050565b60006131bf826119ba565b9150600082036131d2576131d1612864565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061321360208361254a565b915061321e826131dd565b602082019050919050565b6000602082019050818103600083015261324281613206565b905091905056fea2646970667358221220756ea27c01a0f250c8a3886815dec639f44eb54e11f1e0f2237a588989a1b79364736f6c63430008110033", diff --git a/deployments/localhost/solcInputs/e037150c05e743a0afcdb8bf195f828d.json b/deployments/localhost/solcInputs/9bb96e2ab1a2d14e7d6f1254972fa73c.json similarity index 73% rename from deployments/localhost/solcInputs/e037150c05e743a0afcdb8bf195f828d.json rename to deployments/localhost/solcInputs/9bb96e2ab1a2d14e7d6f1254972fa73c.json index 234badc..62d8d87 100644 --- a/deployments/localhost/solcInputs/e037150c05e743a0afcdb8bf195f828d.json +++ b/deployments/localhost/solcInputs/9bb96e2ab1a2d14e7d6f1254972fa73c.json @@ -2,7 +2,10 @@ "language": "Solidity", "sources": { "contracts/FundProject.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\n\nerror FundProject__NotApporovedByDao();\nerror FundProject__UpkeepNeeded();\nerror FundProject__TransferFailed(uint256 _projectId);\nerror FundProject__NotEnoughPayment();\nerror FundProject__withdrawFund();\nerror FundProject__WithdrawTransferFailed();\nerror FundProject__EnteranceFeeNeeded();\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n mapping(address => bool) public _isEnteranceFeePaid;\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n event enteranceFeePaid(address indexed _projectOwner);\n event projectGoesToFunding(uint256 indexed _projectId);\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call it\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\n revert FundProject__EnteranceFeeNeeded();\n } else {\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n emit projectGoesToFunding(projectId);\n projectId++;\n }\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call it\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (\n bool upkeepNeeded,\n bytes memory /* performData */\n )\n {\n upkeepNeeded = (_isFunding[projectId] &&\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\n projectToTime[projectId][time[projectId]]);\n }\n\n function performUpkeep(\n bytes calldata /* performData */\n ) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n _isFunding[projectId] = false;\n _isApporovedByDao[projectId] = false;\n\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\n 100;\n (bool success, ) = (projectOwnerAddress[projectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[projectId]);\n }\n\n emit projectSuccessfullyFunded(projectId);\n } else {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(projectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value < enteranceFee) {\n revert FundProject__NotEnoughPayment();\n } else {\n _isEnteranceFeePaid[msg.sender] = true;\n emit enteranceFeePaid(msg.sender);\n }\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n\n function isEnteranceFeePaid(address account) public view returns (bool) {\n return _isEnteranceFeePaid[account];\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\nimport \"hardhat/console.sol\";\n\nerror FundProject__NotApporovedByDao();\nerror FundProject__UpkeepNeeded();\nerror FundProject__TransferFailed(uint256 _projectId);\nerror FundProject__NotEnoughPayment();\nerror FundProject__withdrawFund();\nerror FundProject__WithdrawTransferFailed();\nerror FundProject__EnteranceFeeNeeded();\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders; // projectId => funderAddress => funderBalance\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n mapping(address => bool) public _isEnteranceFeePaid;\n mapping(address => uint256[]) public investedProjects; // investor address => investedProjects\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n event enteranceFeePaid(address indexed _projectOwner);\n event projectGoesToFunding(uint256 indexed _projectId);\n event withdrawFundSuccessfully(\n address indexed __investor,\n uint256 indexed __projectId\n );\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n investedProjects[msg.sender] = [_projecID]; // need testing\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call it\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\n revert FundProject__EnteranceFeeNeeded();\n } else {\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n emit projectGoesToFunding(projectId);\n projectId++;\n }\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call it\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (bool upkeepNeeded, bytes memory performData)\n {\n for (uint i = 1; i <= projectId; i++) {\n bool isFunded = _isFunding[i];\n bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) >\n time[i];\n upkeepNeeded = (isFunded && timePassed);\n if (upkeepNeeded) {\n performData = abi.encodePacked(i);\n break;\n }\n }\n }\n\n function performUpkeep(bytes calldata performData) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n\n uint256 ProjectId = uint256(bytes32(performData));\n _isFunding[ProjectId] = false;\n _isApporovedByDao[ProjectId] = false;\n\n if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) {\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) /\n 100;\n projectFunds[ProjectId] = 0;\n (bool success, ) = (projectOwnerAddress[ProjectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[ProjectId]);\n }\n\n emit projectSuccessfullyFunded(ProjectId);\n } else {\n _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(ProjectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value < enteranceFee) {\n revert FundProject__NotEnoughPayment();\n } else {\n _isEnteranceFeePaid[msg.sender] = true;\n emit enteranceFeePaid(msg.sender);\n }\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n funders[_projectID][msg.sender] = 0;\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n emit withdrawFundSuccessfully(msg.sender, projectId);\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n\n function isEnteranceFeePaid(address account) public view returns (bool) {\n return _isEnteranceFeePaid[account];\n }\n\n function getFunderBalance(uint256 _projectID)\n public\n view\n returns (uint256)\n {\n return funders[_projectID][msg.sender];\n }\n\n function getInvestedProjects(address investor)\n public\n view\n returns (uint256[] memory)\n {\n return investedProjects[investor]; // need testing\n }\n\n function getDaoPercentage() public view returns (uint256) {\n return daoPercentage;\n }\n\n function getTimeleft(uint256 _projectID)\n public\n view\n returns (uint256 a, uint256 b)\n {\n a = block.timestamp - projectToTime[_projectID][time[_projectID]];\n b = time[_projectID];\n }\n}\n" + }, + "hardhat/console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.22 <0.9.0;\n\nlibrary console {\n\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n\tfunction _sendLogPayload(bytes memory payload) private view {\n\t\tuint256 payloadLength = payload.length;\n\t\taddress consoleAddress = CONSOLE_ADDRESS;\n\t\tassembly {\n\t\t\tlet payloadStart := add(payload, 32)\n\t\t\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n\t\t}\n\t}\n\n\tfunction log() internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log()\"));\n\t}\n\n\tfunction logInt(int256 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(int256)\", p0));\n\t}\n\n\tfunction logUint(uint256 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n\t}\n\n\tfunction logString(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction logBool(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction logAddress(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction logBytes(bytes memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n\t}\n\n\tfunction logBytes1(bytes1 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n\t}\n\n\tfunction logBytes2(bytes2 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n\t}\n\n\tfunction logBytes3(bytes3 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n\t}\n\n\tfunction logBytes4(bytes4 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n\t}\n\n\tfunction logBytes5(bytes5 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n\t}\n\n\tfunction logBytes6(bytes6 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n\t}\n\n\tfunction logBytes7(bytes7 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n\t}\n\n\tfunction logBytes8(bytes8 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n\t}\n\n\tfunction logBytes9(bytes9 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n\t}\n\n\tfunction logBytes10(bytes10 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n\t}\n\n\tfunction logBytes11(bytes11 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n\t}\n\n\tfunction logBytes12(bytes12 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n\t}\n\n\tfunction logBytes13(bytes13 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n\t}\n\n\tfunction logBytes14(bytes14 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n\t}\n\n\tfunction logBytes15(bytes15 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n\t}\n\n\tfunction logBytes16(bytes16 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n\t}\n\n\tfunction logBytes17(bytes17 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n\t}\n\n\tfunction logBytes18(bytes18 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n\t}\n\n\tfunction logBytes19(bytes19 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n\t}\n\n\tfunction logBytes20(bytes20 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n\t}\n\n\tfunction logBytes21(bytes21 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n\t}\n\n\tfunction logBytes22(bytes22 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n\t}\n\n\tfunction logBytes23(bytes23 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n\t}\n\n\tfunction logBytes24(bytes24 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n\t}\n\n\tfunction logBytes25(bytes25 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n\t}\n\n\tfunction logBytes26(bytes26 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n\t}\n\n\tfunction logBytes27(bytes27 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n\t}\n\n\tfunction logBytes28(bytes28 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n\t}\n\n\tfunction logBytes29(bytes29 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n\t}\n\n\tfunction logBytes30(bytes30 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n\t}\n\n\tfunction logBytes31(bytes31 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n\t}\n\n\tfunction logBytes32(bytes32 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n\t}\n\n\tfunction log(uint256 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n\t}\n\n\tfunction log(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction log(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction log(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256)\", p0, p1));\n\t}\n\n\tfunction log(uint256 p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string)\", p0, p1));\n\t}\n\n\tfunction log(uint256 p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool)\", p0, p1));\n\t}\n\n\tfunction log(uint256 p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, uint256 p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, uint256 p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n\t}\n\n\tfunction log(address p0, uint256 p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256)\", p0, p1));\n\t}\n\n\tfunction log(address p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n\t}\n\n\tfunction log(address p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n\t}\n\n\tfunction log(address p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint256)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n}\n" }, "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" @@ -28,63 +31,54 @@ "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" }, - "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" - }, "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" }, "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" }, + "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" + }, + "@openzeppelin/contracts/governance/IGovernor.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" + }, "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" }, "@openzeppelin/contracts/utils/Timers.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" - }, "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" }, + "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" + }, "@openzeppelin/contracts/utils/introspection/ERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" }, "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" }, - "@openzeppelin/contracts/utils/math/SafeCast.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" - }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" - }, "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" }, + "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, "@openzeppelin/contracts/utils/introspection/IERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" }, "@openzeppelin/contracts/utils/Strings.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 Strings {\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" }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" - }, - "@openzeppelin/contracts/utils/Checkpoints.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" - }, "@openzeppelin/contracts/governance/TimelockController.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" }, @@ -97,18 +91,27 @@ "@openzeppelin/contracts/access/IAccessControl.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" }, + "@openzeppelin/contracts/utils/Checkpoints.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" + }, + "@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" + }, "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-ERC20Permit.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../governance/utils/IVotes.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is IVotes, ERC20Permit {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_checkpoints[account], blockNumber);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.\n * It is but NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `blockNumber` must have been already mined\n */\n function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {\n require(blockNumber < block.number, \"ERC20Votes: block not yet mined\");\n return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {\n // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.\n //\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out\n // the same.\n uint256 high = ckpts.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (ckpts[mid].fromBlock > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n return high == 0 ? 0 : ckpts[high - 1].votes;\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {DelegateChanged} and {DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(\n address src,\n address dst,\n uint256 amount\n ) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {\n ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n}\n" }, "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./draft-IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/draft-EIP712.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" }, - "@openzeppelin/contracts/token/ERC20/ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" - }, "@openzeppelin/contracts/utils/Counters.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n}\n" + }, "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" }, @@ -118,11 +121,11 @@ "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" }, - "contracts/GovernanceToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract GovernanceToken is ERC20Votes, Ownable {\n uint256 public s_initialSupply = 1000000e18;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" - }, "contracts/TimeLock.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/TimelockController.sol\";\n\ncontract TimeLock is TimelockController {\n // minDelay: How long you have to wait before executing\n // proposers is the list of addresses that can purpose\n // executers: Who can execute when proposal passes\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executers\n ) TimelockController(minDelay, proposers, executers) {}\n}\n" + }, + "contracts/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract GovernanceToken is ERC20Votes, Ownable {\n uint256 public s_initialSupply = 1000000e18;\n\n event TokenTransfer(\n address indexed _from,\n address indexed _to,\n uint256 _amount\n );\n\n constructor()\n ERC20(\"GovernanceToken\", \"GT\")\n ERC20Permit(\"GovernanceToken\")\n {\n _mint(msg.sender, s_initialSupply);\n }\n\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n emit TokenTransfer(from, to, amount);\n }\n\n function _mint(address to, uint256 amount)\n internal\n override(ERC20Votes)\n onlyOwner\n {\n super._mint(to, amount);\n }\n\n function mintToken(address to, uint256 amount) external {\n _mint(to, amount);\n }\n\n function burnToken(address account, uint256 amount) external {\n _burn(account, amount);\n }\n\n function _burn(address account, uint256 amount)\n internal\n override(ERC20Votes)\n {\n super._burn(account, amount);\n }\n}\n" } }, "settings": { diff --git a/deployments/localhost/solcInputs/edf7a7fc578491be0baac88ac737a638.json b/deployments/localhost/solcInputs/edf7a7fc578491be0baac88ac737a638.json deleted file mode 100644 index 26079d1..0000000 --- a/deployments/localhost/solcInputs/edf7a7fc578491be0baac88ac737a638.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/FundProject.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@chainlink/contracts/src/v0.8/AutomationCompatible.sol\";\n\nerror FundProject__NotApporovedByDao();\nerror FundProject__UpkeepNeeded();\nerror FundProject__TransferFailed(uint256 _projectId);\nerror FundProject__NotEnoughPayment();\nerror FundProject__withdrawFund();\nerror FundProject__WithdrawTransferFailed();\nerror FundProject__EnteranceFeeNeeded();\n\ncontract FundProject is Ownable, AutomationCompatibleInterface {\n enum ProjectFundingStatus {\n ONPROGRESS,\n SUCCESS,\n FAILED,\n CANCELED\n }\n\n uint256 public projectId = 1;\n\n uint public lastTimeStamp;\n uint256 public daoPercentage;\n uint256 public enteranceFee;\n\n mapping(uint256 => bool) public _isFunding;\n mapping(uint256 => mapping(uint256 => uint256)) public projectToTime; // projectId => projectFundingTime => timestamp of add\n mapping(uint256 => uint256) public time;\n\n mapping(string => uint256) public hashToProjectId;\n mapping(uint256 => string) public idToHash;\n mapping(uint256 => mapping(address => uint256)) public funders;\n mapping(uint256 => uint256) public projectFunds;\n mapping(uint256 => uint256) public projectFundingGoalAmount;\n mapping(uint256 => bool) public _isApporovedByDao;\n mapping(uint256 => address) public projectOwnerAddress;\n mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus;\n mapping(address => bool) public _isEnteranceFeePaid;\n\n event projectSuccessfullyFunded(uint256 indexed _projectId);\n event projectFundingFailed(uint256 indexed _projectId);\n event enteranceFeePaid(address indexed _projectOwner);\n event projectGoesToFunding(uint256 indexed _projectId);\n\n modifier isApporovedByDao(uint256 _projecID) {\n if (!_isApporovedByDao[_projecID])\n revert FundProject__NotApporovedByDao();\n _;\n }\n\n constructor(uint256 _enteranceFee, uint256 _daoPercentage) {\n lastTimeStamp = block.timestamp;\n daoPercentage = _daoPercentage;\n enteranceFee = _enteranceFee;\n }\n\n function fund(uint256 _projecID)\n public\n payable\n isApporovedByDao(_projecID)\n {\n funders[_projecID][msg.sender] += msg.value;\n projectFunds[_projecID] += msg.value;\n }\n\n function apporoveFundingByDao(\n string memory _ipfsHash,\n uint256 _fundingGoalAmount,\n uint256 _time,\n address _projectOwnerAddress\n ) external onlyOwner {\n // only dao can call it\n if (!_isEnteranceFeePaid[_projectOwnerAddress]) {\n revert FundProject__EnteranceFeeNeeded();\n } else {\n projectToTime[projectId][_time] = block.timestamp;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.ONPROGRESS;\n time[projectId] = _time;\n projectFundingGoalAmount[projectId] = _fundingGoalAmount;\n hashToProjectId[_ipfsHash] = projectId;\n idToHash[projectId] = _ipfsHash;\n projectOwnerAddress[projectId] = _projectOwnerAddress;\n _isApporovedByDao[projectId] = true;\n _isFunding[projectId] = true;\n emit projectGoesToFunding(projectId);\n projectId++;\n }\n }\n\n function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner {\n // only dao can call it\n _isApporovedByDao[_projecID] = false;\n _isFunding[projectId] = false;\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED;\n }\n\n function checkUpkeep(\n bytes memory /* checkData */\n )\n public\n view\n override\n returns (\n bool upkeepNeeded,\n bytes memory /* performData */\n )\n {\n upkeepNeeded = (_isFunding[projectId] &&\n (block.timestamp - projectToTime[projectId][time[projectId]]) >\n projectToTime[projectId][time[projectId]]);\n }\n\n function performUpkeep(\n bytes calldata /* performData */\n ) external override {\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\n if (!upkeepNeeded) {\n revert FundProject__UpkeepNeeded();\n }\n _isFunding[projectId] = false;\n _isApporovedByDao[projectId] = false;\n\n if (projectFunds[projectId] > projectFundingGoalAmount[projectId]) {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.SUCCESS;\n uint256 fundsToSent = (projectFunds[projectId] * daoPercentage) /\n 100;\n (bool success, ) = (projectOwnerAddress[projectId]).call{\n value: fundsToSent\n }(\"\");\n if (!success) {\n revert FundProject__TransferFailed(projectFunds[projectId]);\n }\n\n emit projectSuccessfullyFunded(projectId);\n } else {\n _ProjectFundingStatus[projectId] = ProjectFundingStatus.FAILED;\n emit projectFundingFailed(projectId);\n }\n }\n\n function paySubmitFee() public payable {\n if (msg.value < enteranceFee) {\n revert FundProject__NotEnoughPayment();\n } else {\n _isEnteranceFeePaid[msg.sender] = true;\n emit enteranceFeePaid(msg.sender);\n }\n }\n\n function withdrawFund(uint256 _projectID) public {\n if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) {\n uint256 fundToSent = funders[_projectID][msg.sender];\n (bool success, ) = (payable(msg.sender)).call{value: fundToSent}(\n \"\"\n );\n if (!success) {\n revert FundProject__WithdrawTransferFailed();\n }\n } else {\n revert FundProject__withdrawFund();\n }\n }\n\n function _isApporoveFundingByDao(uint256 _projecID)\n external\n view\n returns (bool)\n {\n return _isApporovedByDao[_projecID];\n }\n\n function _getHashOfProjectData(uint256 _projecID)\n public\n view\n returns (string memory)\n {\n return idToHash[_projecID];\n }\n\n function _getProjectId(string memory _ipfsHash)\n public\n view\n returns (uint256)\n {\n return hashToProjectId[_ipfsHash];\n }\n\n function _getBalanceOfProject(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFunds[_projecID];\n }\n\n function _getFundingGoalAmount(uint256 _projecID)\n public\n view\n returns (uint256)\n {\n return projectFundingGoalAmount[_projecID];\n }\n\n function is_funding(uint256 _projectID) public view returns (bool) {\n return _isFunding[_projectID];\n }\n\n function _getProjectStatus(uint256 _projectID)\n public\n view\n returns (ProjectFundingStatus)\n {\n return _ProjectFundingStatus[_projectID];\n }\n\n function getEnteranceFee() public view returns (uint256) {\n return enteranceFee;\n }\n\n function isEnteranceFeePaid(address account) public view returns (bool) {\n return _isEnteranceFeePaid[account];\n }\n}\n" - }, - "@openzeppelin/contracts/access/Ownable.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/Context.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 Ownable is Context {\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 constructor() {\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" - }, - "@chainlink/contracts/src/v0.8/AutomationCompatible.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./AutomationBase.sol\";\nimport \"./interfaces/AutomationCompatibleInterface.sol\";\n\nabstract contract AutomationCompatible is AutomationBase, AutomationCompatibleInterface {}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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 Context {\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" - }, - "@chainlink/contracts/src/v0.8/AutomationBase.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ncontract AutomationBase {\n error OnlySimulatedBackend();\n\n /**\n * @notice method that allows it to be simulated via eth_call by checking that\n * the sender is the zero address.\n */\n function preventExecution() internal view {\n if (tx.origin != address(0)) {\n revert OnlySimulatedBackend();\n }\n }\n\n /**\n * @notice modifier that allows it to be simulated via eth_call by checking\n * that the sender is the zero address.\n */\n modifier cannotExecute() {\n preventExecution();\n _;\n }\n}\n" - }, - "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AutomationCompatibleInterface {\n /**\n * @notice method that is simulated by the keepers to see if any work actually\n * needs to be performed. This method does does not actually need to be\n * executable, and since it is only ever simulated it can consume lots of gas.\n * @dev To ensure that it is never called, you may want to add the\n * cannotExecute modifier from KeeperBase to your implementation of this\n * method.\n * @param checkData specified in the upkeep registration so it is always the\n * same for a registered upkeep. This can easily be broken down into specific\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\n * same contract and easily differentiated by the contract.\n * @return upkeepNeeded boolean to indicate whether the keeper should call\n * performUpkeep or not.\n * @return performData bytes that the keeper should call performUpkeep with, if\n * upkeep is needed. If you would like to encode data to decode later, try\n * `abi.encode`.\n */\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\n\n /**\n * @notice method that is actually executed by the keepers, via the registry.\n * The data returned by the checkUpkeep simulation will be passed into\n * this method to actually be executed.\n * @dev The input to this method should not be trusted, and the caller of the\n * method should not even be restricted to any single registry. Anyone should\n * be able call it, and the input should be validated, there is no guarantee\n * that the data passed in is the performData returned from checkUpkeep. This\n * could happen due to malicious keepers, racing keepers, or simply a state\n * change while the performUpkeep transaction is waiting for confirmation.\n * Always validate the data passed in.\n * @param performData is the data which was passed back from the checkData\n * simulation. If it is encoded, it can easily be decoded into other types by\n * calling `abi.decode`. This data should not be trusted, and should be\n * validated against the contract's current state.\n */\n function performUpkeep(bytes calldata performData) external;\n}\n" - }, - "contracts/GovernerContract.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/governance/Governor.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorSettings.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotes.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol\";\nimport \"@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol\";\nimport \"./FundProject.sol\";\n\ncontract GovernerContract is\n Governor,\n GovernorSettings,\n GovernorCountingSimple,\n GovernorVotes,\n GovernorVotesQuorumFraction,\n GovernorTimelockControl,\n FundProject\n{\n error GovernerContract__NeedEnteranceFee();\n\n constructor(\n IVotes _token,\n TimelockController _timelock,\n uint256 _votingDelay,\n uint256 _votingPeriod,\n uint256 _quorumPercentage,\n uint256 _enteranceFee,\n uint256 _daoPercentage\n )\n Governor(\"GovernerContract\")\n GovernorSettings(\n _votingDelay, /* 1 block */\n _votingPeriod, /* 45818 blocks = ~1 week */\n 0\n )\n GovernorVotes(_token)\n GovernorVotesQuorumFraction(_quorumPercentage)\n GovernorTimelockControl(_timelock)\n FundProject(_enteranceFee, _daoPercentage)\n {}\n\n // The following functions are overrides required by Solidity.\n\n function votingDelay()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingDelay();\n }\n\n function votingPeriod()\n public\n view\n override(IGovernor, GovernorSettings)\n returns (uint256)\n {\n return super.votingPeriod();\n }\n\n function quorum(uint256 blockNumber)\n public\n view\n override(IGovernor, GovernorVotesQuorumFraction)\n returns (uint256)\n {\n return super.quorum(blockNumber);\n }\n\n function state(uint256 proposalId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (ProposalState)\n {\n return super.state(proposalId);\n }\n\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public override(Governor, IGovernor) returns (uint256) {\n if (!_isEnteranceFeePaid[msg.sender]) {\n revert GovernerContract__NeedEnteranceFee();\n }\n return super.propose(targets, values, calldatas, description);\n }\n\n function proposalThreshold()\n public\n view\n override(Governor, GovernorSettings)\n returns (uint256)\n {\n return super.proposalThreshold();\n }\n\n function _execute(\n uint256 proposalId,\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) {\n super._execute(proposalId, targets, values, calldatas, descriptionHash);\n }\n\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal override(Governor, GovernorTimelockControl) returns (uint256) {\n return super._cancel(targets, values, calldatas, descriptionHash);\n }\n\n function _executor()\n internal\n view\n override(Governor, GovernorTimelockControl)\n returns (address)\n {\n return super._executor();\n }\n\n function supportsInterface(bytes4 interfaceId)\n public\n view\n override(Governor, GovernorTimelockControl)\n returns (bool)\n {\n return super.supportsInterface(interfaceId);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/Governor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/Governor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/cryptography/ECDSA.sol\";\nimport \"../utils/cryptography/draft-EIP712.sol\";\nimport \"../utils/introspection/ERC165.sol\";\nimport \"../utils/math/SafeCast.sol\";\nimport \"../utils/structs/DoubleEndedQueue.sol\";\nimport \"../utils/Address.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Timers.sol\";\nimport \"./IGovernor.sol\";\n\n/**\n * @dev Core of the governance system, designed to be extended though various modules.\n *\n * This contract is abstract and requires several function to be implemented in various modules:\n *\n * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote}\n * - A voting module must implement {_getVotes}\n * - Additionanly, the {votingPeriod} must also be implemented\n *\n * _Available since v4.3._\n */\nabstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver {\n using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;\n using SafeCast for uint256;\n using Timers for Timers.BlockNumber;\n\n bytes32 public constant BALLOT_TYPEHASH = keccak256(\"Ballot(uint256 proposalId,uint8 support)\");\n bytes32 public constant EXTENDED_BALLOT_TYPEHASH =\n keccak256(\"ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)\");\n\n struct ProposalCore {\n Timers.BlockNumber voteStart;\n Timers.BlockNumber voteEnd;\n bool executed;\n bool canceled;\n }\n\n string private _name;\n\n mapping(uint256 => ProposalCore) private _proposals;\n\n // This queue keeps track of the governor operating on itself. Calls to functions protected by the\n // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},\n // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the\n // execution of {onlyGovernance} protected calls can only be achieved through successful proposals.\n DoubleEndedQueue.Bytes32Deque private _governanceCall;\n\n /**\n * @dev Restricts a function so it can only be executed through governance proposals. For example, governance\n * parameter setters in {GovernorSettings} are protected using this modifier.\n *\n * The governance executing address may be different from the Governor's own address, for example it could be a\n * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these\n * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,\n * for example, additional timelock proposers are not able to change governance parameters without going through the\n * governance protocol (since v4.6).\n */\n modifier onlyGovernance() {\n require(_msgSender() == _executor(), \"Governor: onlyGovernance\");\n if (_executor() != address(this)) {\n bytes32 msgDataHash = keccak256(_msgData());\n // loop until popping the expected operation - throw if deque is empty (operation not authorized)\n while (_governanceCall.popFront() != msgDataHash) {}\n }\n _;\n }\n\n /**\n * @dev Sets the value for {name} and {version}\n */\n constructor(string memory name_) EIP712(name_, version()) {\n _name = name_;\n }\n\n /**\n * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)\n */\n receive() external payable virtual {\n require(_executor() == address(this));\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n // In addition to the current interfaceId, also support previous version of the interfaceId that did not\n // include the castVoteWithReasonAndParams() function as standard\n return\n interfaceId ==\n (type(IGovernor).interfaceId ^\n this.castVoteWithReasonAndParams.selector ^\n this.castVoteWithReasonAndParamsBySig.selector ^\n this.getVotesWithParams.selector) ||\n interfaceId == type(IGovernor).interfaceId ||\n interfaceId == type(IERC1155Receiver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IGovernor-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IGovernor-version}.\n */\n function version() public view virtual override returns (string memory) {\n return \"1\";\n }\n\n /**\n * @dev See {IGovernor-hashProposal}.\n *\n * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array\n * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id\n * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in\n * advance, before the proposal is submitted.\n *\n * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the\n * same proposal (with same operation and same description) will have the same id if submitted on multiple governors\n * across multiple networks. This also means that in order to execute the same operation twice (on the same\n * governor) the proposer will have to change the description in order to avoid proposal id conflicts.\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual override returns (uint256) {\n return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));\n }\n\n /**\n * @dev See {IGovernor-state}.\n */\n function state(uint256 proposalId) public view virtual override returns (ProposalState) {\n ProposalCore storage proposal = _proposals[proposalId];\n\n if (proposal.executed) {\n return ProposalState.Executed;\n }\n\n if (proposal.canceled) {\n return ProposalState.Canceled;\n }\n\n uint256 snapshot = proposalSnapshot(proposalId);\n\n if (snapshot == 0) {\n revert(\"Governor: unknown proposal id\");\n }\n\n if (snapshot >= block.number) {\n return ProposalState.Pending;\n }\n\n uint256 deadline = proposalDeadline(proposalId);\n\n if (deadline >= block.number) {\n return ProposalState.Active;\n }\n\n if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {\n return ProposalState.Succeeded;\n } else {\n return ProposalState.Defeated;\n }\n }\n\n /**\n * @dev See {IGovernor-proposalSnapshot}.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteStart.getDeadline();\n }\n\n /**\n * @dev See {IGovernor-proposalDeadline}.\n */\n function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {\n return _proposals[proposalId].voteEnd.getDeadline();\n }\n\n /**\n * @dev Part of the Governor Bravo's interface: _\"The number of votes required in order for a voter to become a proposer\"_.\n */\n function proposalThreshold() public view virtual returns (uint256) {\n return 0;\n }\n\n /**\n * @dev Amount of votes already cast passes the threshold limit.\n */\n function _quorumReached(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Is the proposal successful or not.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);\n\n /**\n * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) internal view virtual returns (uint256);\n\n /**\n * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.\n *\n * Note: Support is generic and can represent various things depending on the voting system used.\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory params\n ) internal virtual;\n\n /**\n * @dev Default additional encoded parameters used by castVote methods that don't include them\n *\n * Note: Should be overridden by specific implementations to use an appropriate value, the\n * meaning of the additional params, in the context of that implementation\n */\n function _defaultParams() internal view virtual returns (bytes memory) {\n return \"\";\n }\n\n /**\n * @dev See {IGovernor-propose}.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual override returns (uint256) {\n require(\n getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),\n \"Governor: proposer votes below proposal threshold\"\n );\n\n uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));\n\n require(targets.length == values.length, \"Governor: invalid proposal length\");\n require(targets.length == calldatas.length, \"Governor: invalid proposal length\");\n require(targets.length > 0, \"Governor: empty proposal\");\n\n ProposalCore storage proposal = _proposals[proposalId];\n require(proposal.voteStart.isUnset(), \"Governor: proposal already exists\");\n\n uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();\n uint64 deadline = snapshot + votingPeriod().toUint64();\n\n proposal.voteStart.setDeadline(snapshot);\n proposal.voteEnd.setDeadline(deadline);\n\n emit ProposalCreated(\n proposalId,\n _msgSender(),\n targets,\n values,\n new string[](targets.length),\n calldatas,\n snapshot,\n deadline,\n description\n );\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-execute}.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n ProposalState status = state(proposalId);\n require(\n status == ProposalState.Succeeded || status == ProposalState.Queued,\n \"Governor: proposal not successful\"\n );\n _proposals[proposalId].executed = true;\n\n emit ProposalExecuted(proposalId);\n\n _beforeExecute(proposalId, targets, values, calldatas, descriptionHash);\n _execute(proposalId, targets, values, calldatas, descriptionHash);\n _afterExecute(proposalId, targets, values, calldatas, descriptionHash);\n\n return proposalId;\n }\n\n /**\n * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n string memory errorMessage = \"Governor: call reverted without message\";\n for (uint256 i = 0; i < targets.length; ++i) {\n (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);\n Address.verifyCallResult(success, returndata, errorMessage);\n }\n }\n\n /**\n * @dev Hook before execution is triggered.\n */\n function _beforeExecute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory, /* values */\n bytes[] memory calldatas,\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n for (uint256 i = 0; i < targets.length; ++i) {\n if (targets[i] == address(this)) {\n _governanceCall.pushBack(keccak256(calldatas[i]));\n }\n }\n }\n }\n\n /**\n * @dev Hook after execution is triggered.\n */\n function _afterExecute(\n uint256, /* proposalId */\n address[] memory, /* targets */\n uint256[] memory, /* values */\n bytes[] memory, /* calldatas */\n bytes32 /*descriptionHash*/\n ) internal virtual {\n if (_executor() != address(this)) {\n if (!_governanceCall.empty()) {\n _governanceCall.clear();\n }\n }\n }\n\n /**\n * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as\n * canceled to allow distinguishing it from executed proposals.\n *\n * Emits a {IGovernor-ProposalCanceled} event.\n */\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n ProposalState status = state(proposalId);\n\n require(\n status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,\n \"Governor: proposal not active\"\n );\n _proposals[proposalId].canceled = true;\n\n emit ProposalCanceled(proposalId);\n\n return proposalId;\n }\n\n /**\n * @dev See {IGovernor-getVotes}.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, _defaultParams());\n }\n\n /**\n * @dev See {IGovernor-getVotesWithParams}.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual override returns (uint256) {\n return _getVotes(account, blockNumber, params);\n }\n\n /**\n * @dev See {IGovernor-castVote}.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReason}.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason);\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParams}.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual override returns (uint256) {\n address voter = _msgSender();\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev See {IGovernor-castVoteBySig}.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))),\n v,\n r,\n s\n );\n return _castVote(proposalId, voter, support, \"\");\n }\n\n /**\n * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override returns (uint256) {\n address voter = ECDSA.recover(\n _hashTypedDataV4(\n keccak256(\n abi.encode(\n EXTENDED_BALLOT_TYPEHASH,\n proposalId,\n support,\n keccak256(bytes(reason)),\n keccak256(params)\n )\n )\n ),\n v,\n r,\n s\n );\n\n return _castVote(proposalId, voter, support, reason, params);\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason\n ) internal virtual returns (uint256) {\n return _castVote(proposalId, account, support, reason, _defaultParams());\n }\n\n /**\n * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve\n * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.\n *\n * Emits a {IGovernor-VoteCast} event.\n */\n function _castVote(\n uint256 proposalId,\n address account,\n uint8 support,\n string memory reason,\n bytes memory params\n ) internal virtual returns (uint256) {\n ProposalCore storage proposal = _proposals[proposalId];\n require(state(proposalId) == ProposalState.Active, \"Governor: vote not currently active\");\n\n uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);\n _countVote(proposalId, account, support, weight, params);\n\n if (params.length == 0) {\n emit VoteCast(account, proposalId, support, weight, reason);\n } else {\n emit VoteCastWithParams(account, proposalId, support, weight, reason, params);\n }\n\n return weight;\n }\n\n /**\n * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor\n * is some contract other than the governor itself, like when using a timelock, this function can be invoked\n * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.\n * Note that if the executor is simply the governor itself, use of `relay` is redundant.\n */\n function relay(\n address target,\n uint256 value,\n bytes calldata data\n ) external virtual onlyGovernance {\n Address.functionCallWithValue(target, data, value);\n }\n\n /**\n * @dev Address through which the governor executes action. Will be overloaded by module that execute actions\n * through another contract such as a timelock.\n */\n function _executor() internal view virtual returns (address) {\n return address(this);\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/extensions/GovernorVotesQuorumFraction.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./GovernorVotes.sol\";\nimport \"../../utils/Checkpoints.sol\";\nimport \"../../utils/math/SafeCast.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a\n * fraction of the total supply.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotesQuorumFraction is GovernorVotes {\n using Checkpoints for Checkpoints.History;\n\n uint256 private _quorumNumerator; // DEPRECATED\n Checkpoints.History private _quorumNumeratorHistory;\n\n event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);\n\n /**\n * @dev Initialize quorum as a fraction of the token's total supply.\n *\n * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is\n * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be\n * customized by overriding {quorumDenominator}.\n */\n constructor(uint256 quorumNumeratorValue) {\n _updateQuorumNumerator(quorumNumeratorValue);\n }\n\n /**\n * @dev Returns the current quorum numerator. See {quorumDenominator}.\n */\n function quorumNumerator() public view virtual returns (uint256) {\n return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest();\n }\n\n /**\n * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}.\n */\n function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) {\n // If history is empty, fallback to old storage\n uint256 length = _quorumNumeratorHistory._checkpoints.length;\n if (length == 0) {\n return _quorumNumerator;\n }\n\n // Optimistic search, check the latest checkpoint\n Checkpoints.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1];\n if (latest._blockNumber <= blockNumber) {\n return latest._value;\n }\n\n // Otherwize, do the binary search\n return _quorumNumeratorHistory.getAtBlock(blockNumber);\n }\n\n /**\n * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.\n */\n function quorumDenominator() public view virtual returns (uint256) {\n return 100;\n }\n\n /**\n * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.\n */\n function quorum(uint256 blockNumber) public view virtual override returns (uint256) {\n return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator();\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - Must be called through a governance proposal.\n * - New numerator must be smaller or equal to the denominator.\n */\n function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {\n _updateQuorumNumerator(newQuorumNumerator);\n }\n\n /**\n * @dev Changes the quorum numerator.\n *\n * Emits a {QuorumNumeratorUpdated} event.\n *\n * Requirements:\n *\n * - New numerator must be smaller or equal to the denominator.\n */\n function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {\n require(\n newQuorumNumerator <= quorumDenominator(),\n \"GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator\"\n );\n\n uint256 oldQuorumNumerator = quorumNumerator();\n\n // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints.\n if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) {\n _quorumNumeratorHistory._checkpoints.push(\n Checkpoints.Checkpoint({_blockNumber: 0, _value: SafeCast.toUint224(oldQuorumNumerator)})\n );\n }\n\n // Set new quorum for future proposals\n _quorumNumeratorHistory.push(newQuorumNumerator);\n\n emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for simple, 3 options, vote counting.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorCountingSimple is Governor {\n /**\n * @dev Supported vote types. Matches Governor Bravo ordering.\n */\n enum VoteType {\n Against,\n For,\n Abstain\n }\n\n struct ProposalVote {\n uint256 againstVotes;\n uint256 forVotes;\n uint256 abstainVotes;\n mapping(address => bool) hasVoted;\n }\n\n mapping(uint256 => ProposalVote) private _proposalVotes;\n\n /**\n * @dev See {IGovernor-COUNTING_MODE}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual override returns (string memory) {\n return \"support=bravo&quorum=for,abstain\";\n }\n\n /**\n * @dev See {IGovernor-hasVoted}.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {\n return _proposalVotes[proposalId].hasVoted[account];\n }\n\n /**\n * @dev Accessor to the internal vote counts.\n */\n function proposalVotes(uint256 proposalId)\n public\n view\n virtual\n returns (\n uint256 againstVotes,\n uint256 forVotes,\n uint256 abstainVotes\n )\n {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes);\n }\n\n /**\n * @dev See {Governor-_quorumReached}.\n */\n function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes;\n }\n\n /**\n * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.\n */\n function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n return proposalvote.forVotes > proposalvote.againstVotes;\n }\n\n /**\n * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).\n */\n function _countVote(\n uint256 proposalId,\n address account,\n uint8 support,\n uint256 weight,\n bytes memory // params\n ) internal virtual override {\n ProposalVote storage proposalvote = _proposalVotes[proposalId];\n\n require(!proposalvote.hasVoted[account], \"GovernorVotingSimple: vote already cast\");\n proposalvote.hasVoted[account] = true;\n\n if (support == uint8(VoteType.Against)) {\n proposalvote.againstVotes += weight;\n } else if (support == uint8(VoteType.For)) {\n proposalvote.forVotes += weight;\n } else if (support == uint8(VoteType.Abstain)) {\n proposalvote.abstainVotes += weight;\n } else {\n revert(\"GovernorVotingSimple: invalid value for enum VoteType\");\n }\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\n\n/**\n * @dev Extension of {Governor} for settings updatable through governance.\n *\n * _Available since v4.4._\n */\nabstract contract GovernorSettings is Governor {\n uint256 private _votingDelay;\n uint256 private _votingPeriod;\n uint256 private _proposalThreshold;\n\n event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);\n event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);\n event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);\n\n /**\n * @dev Initialize the governance parameters.\n */\n constructor(\n uint256 initialVotingDelay,\n uint256 initialVotingPeriod,\n uint256 initialProposalThreshold\n ) {\n _setVotingDelay(initialVotingDelay);\n _setVotingPeriod(initialVotingPeriod);\n _setProposalThreshold(initialProposalThreshold);\n }\n\n /**\n * @dev See {IGovernor-votingDelay}.\n */\n function votingDelay() public view virtual override returns (uint256) {\n return _votingDelay;\n }\n\n /**\n * @dev See {IGovernor-votingPeriod}.\n */\n function votingPeriod() public view virtual override returns (uint256) {\n return _votingPeriod;\n }\n\n /**\n * @dev See {Governor-proposalThreshold}.\n */\n function proposalThreshold() public view virtual override returns (uint256) {\n return _proposalThreshold;\n }\n\n /**\n * @dev Update the voting delay. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingDelaySet} event.\n */\n function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {\n _setVotingDelay(newVotingDelay);\n }\n\n /**\n * @dev Update the voting period. This operation can only be performed through a governance proposal.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {\n _setVotingPeriod(newVotingPeriod);\n }\n\n /**\n * @dev Update the proposal threshold. This operation can only be performed through a governance proposal.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {\n _setProposalThreshold(newProposalThreshold);\n }\n\n /**\n * @dev Internal setter for the voting delay.\n *\n * Emits a {VotingDelaySet} event.\n */\n function _setVotingDelay(uint256 newVotingDelay) internal virtual {\n emit VotingDelaySet(_votingDelay, newVotingDelay);\n _votingDelay = newVotingDelay;\n }\n\n /**\n * @dev Internal setter for the voting period.\n *\n * Emits a {VotingPeriodSet} event.\n */\n function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {\n // voting period must be at least one block long\n require(newVotingPeriod > 0, \"GovernorSettings: voting period too low\");\n emit VotingPeriodSet(_votingPeriod, newVotingPeriod);\n _votingPeriod = newVotingPeriod;\n }\n\n /**\n * @dev Internal setter for the proposal threshold.\n *\n * Emits a {ProposalThresholdSet} event.\n */\n function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {\n emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);\n _proposalThreshold = newProposalThreshold;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IGovernorTimelock.sol\";\nimport \"../Governor.sol\";\nimport \"../TimelockController.sol\";\n\n/**\n * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a\n * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The\n * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.\n *\n * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,\n * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be\n * inaccessible.\n *\n * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it\n * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are\n * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively\n * executing a Denial of Service attack. This risk will be mitigated in a future release.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorTimelockControl is IGovernorTimelock, Governor {\n TimelockController private _timelock;\n mapping(uint256 => bytes32) private _timelockIds;\n\n /**\n * @dev Emitted when the timelock controller used for proposal execution is modified.\n */\n event TimelockChange(address oldTimelock, address newTimelock);\n\n /**\n * @dev Set the timelock.\n */\n constructor(TimelockController timelockAddress) {\n _updateTimelock(timelockAddress);\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) {\n return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.\n */\n function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) {\n ProposalState status = super.state(proposalId);\n\n if (status != ProposalState.Succeeded) {\n return status;\n }\n\n // core tracks execution, so we just have to check if successful proposal have been queued.\n bytes32 queueid = _timelockIds[proposalId];\n if (queueid == bytes32(0)) {\n return status;\n } else if (_timelock.isOperationDone(queueid)) {\n return ProposalState.Executed;\n } else if (_timelock.isOperationPending(queueid)) {\n return ProposalState.Queued;\n } else {\n return ProposalState.Canceled;\n }\n }\n\n /**\n * @dev Public accessor to check the address of the timelock\n */\n function timelock() public view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public accessor to check the eta of a queued proposal\n */\n function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {\n uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);\n return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value\n }\n\n /**\n * @dev Function to queue a proposal to the timelock.\n */\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual override returns (uint256) {\n uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);\n\n require(state(proposalId) == ProposalState.Succeeded, \"Governor: proposal not successful\");\n\n uint256 delay = _timelock.getMinDelay();\n _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);\n _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);\n\n emit ProposalQueued(proposalId, block.timestamp + delay);\n\n return proposalId;\n }\n\n /**\n * @dev Overridden execute function that run the already queued proposal through the timelock.\n */\n function _execute(\n uint256, /* proposalId */\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override {\n _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);\n }\n\n /**\n * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already\n * been queued.\n */\n // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and\n // well behaved (according to TimelockController) and this will not happen.\n // slither-disable-next-line reentrancy-no-eth\n function _cancel(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) internal virtual override returns (uint256) {\n uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);\n\n if (_timelockIds[proposalId] != 0) {\n _timelock.cancel(_timelockIds[proposalId]);\n delete _timelockIds[proposalId];\n }\n\n return proposalId;\n }\n\n /**\n * @dev Address through which the governor executes action. In this case, the timelock.\n */\n function _executor() internal view virtual override returns (address) {\n return address(_timelock);\n }\n\n /**\n * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates\n * must be proposed, scheduled, and executed through governance proposals.\n *\n * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.\n */\n function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance {\n _updateTimelock(newTimelock);\n }\n\n function _updateTimelock(TimelockController newTimelock) private {\n emit TimelockChange(address(_timelock), address(newTimelock));\n _timelock = newTimelock;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Governor.sol\";\nimport \"../utils/IVotes.sol\";\n\n/**\n * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token.\n *\n * _Available since v4.3._\n */\nabstract contract GovernorVotes is Governor {\n IVotes public immutable token;\n\n constructor(IVotes tokenAddress) {\n token = tokenAddress;\n }\n\n /**\n * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).\n */\n function _getVotes(\n address account,\n uint256 blockNumber,\n bytes memory /*params*/\n ) internal view virtual override returns (uint256) {\n return token.getPastVotes(account, blockNumber);\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Address.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 Address {\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(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" - }, - "@openzeppelin/contracts/utils/Timers.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Tooling for timepoints, timers and delays\n */\nlibrary Timers {\n struct Timestamp {\n uint64 _deadline;\n }\n\n function getDeadline(Timestamp memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(Timestamp storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(Timestamp storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(Timestamp memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(Timestamp memory timer) internal view returns (bool) {\n return timer._deadline > block.timestamp;\n }\n\n function isExpired(Timestamp memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.timestamp;\n }\n\n struct BlockNumber {\n uint64 _deadline;\n }\n\n function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {\n return timer._deadline;\n }\n\n function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {\n timer._deadline = timestamp;\n }\n\n function reset(BlockNumber storage timer) internal {\n timer._deadline = 0;\n }\n\n function isUnset(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline == 0;\n }\n\n function isStarted(BlockNumber memory timer) internal pure returns (bool) {\n return timer._deadline > 0;\n }\n\n function isPending(BlockNumber memory timer) internal view returns (bool) {\n return timer._deadline > block.number;\n }\n\n function isExpired(BlockNumber memory timer) internal view returns (bool) {\n return isStarted(timer) && timer._deadline <= block.number;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/IGovernor.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.2) (governance/IGovernor.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Interface of the {Governor} core.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernor is IERC165 {\n enum ProposalState {\n Pending,\n Active,\n Canceled,\n Defeated,\n Succeeded,\n Queued,\n Expired,\n Executed\n }\n\n /**\n * @dev Emitted when a proposal is created.\n */\n event ProposalCreated(\n uint256 proposalId,\n address proposer,\n address[] targets,\n uint256[] values,\n string[] signatures,\n bytes[] calldatas,\n uint256 startBlock,\n uint256 endBlock,\n string description\n );\n\n /**\n * @dev Emitted when a proposal is canceled.\n */\n event ProposalCanceled(uint256 proposalId);\n\n /**\n * @dev Emitted when a proposal is executed.\n */\n event ProposalExecuted(uint256 proposalId);\n\n /**\n * @dev Emitted when a vote is cast without params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n */\n event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);\n\n /**\n * @dev Emitted when a vote is cast with params.\n *\n * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.\n * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.\n */\n event VoteCastWithParams(\n address indexed voter,\n uint256 proposalId,\n uint8 support,\n uint256 weight,\n string reason,\n bytes params\n );\n\n /**\n * @notice module:core\n * @dev Name of the governor instance (used in building the ERC712 domain separator).\n */\n function name() public view virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: \"1\"\n */\n function version() public view virtual returns (string memory);\n\n /**\n * @notice module:voting\n * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to\n * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of\n * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.\n *\n * There are 2 standard keys: `support` and `quorum`.\n *\n * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.\n * - `quorum=bravo` means that only For votes are counted towards quorum.\n * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.\n *\n * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique\n * name that describes the behavior. For example:\n *\n * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.\n * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.\n *\n * NOTE: The string can be decoded by the standard\n * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]\n * JavaScript class.\n */\n // solhint-disable-next-line func-name-mixedcase\n function COUNTING_MODE() public pure virtual returns (string memory);\n\n /**\n * @notice module:core\n * @dev Hashing function used to (re)build the proposal id from the proposal details..\n */\n function hashProposal(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public pure virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Current state of a proposal, following Compound's convention\n */\n function state(uint256 proposalId) public view virtual returns (ProposalState);\n\n /**\n * @notice module:core\n * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's\n * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the\n * beginning of the following block.\n */\n function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:core\n * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote\n * during this block.\n */\n function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to\n * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.\n */\n function votingDelay() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Delay, in number of blocks, between the vote start and vote ends.\n *\n * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting\n * duration compared to the voting delay.\n */\n function votingPeriod() public view virtual returns (uint256);\n\n /**\n * @notice module:user-config\n * @dev Minimum number of cast voted required for a proposal to be successful.\n *\n * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the\n * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).\n */\n function quorum(uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber`.\n *\n * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or\n * multiple), {ERC20Votes} tokens.\n */\n function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);\n\n /**\n * @notice module:reputation\n * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.\n */\n function getVotesWithParams(\n address account,\n uint256 blockNumber,\n bytes memory params\n ) public view virtual returns (uint256);\n\n /**\n * @notice module:voting\n * @dev Returns weither `account` has cast a vote on `proposalId`.\n */\n function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);\n\n /**\n * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends\n * {IGovernor-votingPeriod} blocks after the voting starts.\n *\n * Emits a {ProposalCreated} event.\n */\n function propose(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n string memory description\n ) public virtual returns (uint256 proposalId);\n\n /**\n * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the\n * deadline to be reached.\n *\n * Emits a {ProposalExecuted} event.\n *\n * Note: some module can modify the requirements for execution, for example by adding an additional timelock.\n */\n function execute(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public payable virtual returns (uint256 proposalId);\n\n /**\n * @dev Cast a vote\n *\n * Emits a {VoteCast} event.\n */\n function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason\n *\n * Emits a {VoteCast} event.\n */\n function castVoteWithReason(\n uint256 proposalId,\n uint8 support,\n string calldata reason\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParams(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote using the user's cryptographic signature.\n *\n * Emits a {VoteCast} event.\n */\n function castVoteBySig(\n uint256 proposalId,\n uint8 support,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n\n /**\n * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.\n *\n * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.\n */\n function castVoteWithReasonAndParamsBySig(\n uint256 proposalId,\n uint8 support,\n string calldata reason,\n bytes memory params,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual returns (uint256 balance);\n}\n" - }, - "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ECDSA.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712 {\n /* solhint-disable var-name-mixedcase */\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\n uint256 private immutable _CACHED_CHAIN_ID;\n address private immutable _CACHED_THIS;\n\n bytes32 private immutable _HASHED_NAME;\n bytes32 private immutable _HASHED_VERSION;\n bytes32 private immutable _TYPE_HASH;\n\n /* solhint-enable var-name-mixedcase */\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n bytes32 hashedName = keccak256(bytes(name));\n bytes32 hashedVersion = keccak256(bytes(version));\n bytes32 typeHash = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n _HASHED_NAME = hashedName;\n _HASHED_VERSION = hashedVersion;\n _CACHED_CHAIN_ID = block.chainid;\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\n _CACHED_THIS = address(this);\n _TYPE_HASH = typeHash;\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\n return _CACHED_DOMAIN_SEPARATOR;\n } else {\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\n }\n }\n\n function _buildDomainSeparator(\n bytes32 typeHash,\n bytes32 nameHash,\n bytes32 versionHash\n ) private view returns (bytes32) {\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.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 ECDSA {\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 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 {\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 ÷ 2 + 1, and for v in (302): v ∈ {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\", Strings.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" - }, - "@openzeppelin/contracts/utils/math/SafeCast.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248) {\n require(value >= type(int248).min && value <= type(int248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return int248(value);\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240) {\n require(value >= type(int240).min && value <= type(int240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return int240(value);\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232) {\n require(value >= type(int232).min && value <= type(int232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return int232(value);\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224) {\n require(value >= type(int224).min && value <= type(int224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return int224(value);\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216) {\n require(value >= type(int216).min && value <= type(int216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return int216(value);\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208) {\n require(value >= type(int208).min && value <= type(int208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return int208(value);\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200) {\n require(value >= type(int200).min && value <= type(int200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return int200(value);\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192) {\n require(value >= type(int192).min && value <= type(int192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return int192(value);\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184) {\n require(value >= type(int184).min && value <= type(int184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return int184(value);\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176) {\n require(value >= type(int176).min && value <= type(int176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return int176(value);\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168) {\n require(value >= type(int168).min && value <= type(int168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return int168(value);\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160) {\n require(value >= type(int160).min && value <= type(int160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return int160(value);\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152) {\n require(value >= type(int152).min && value <= type(int152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return int152(value);\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144) {\n require(value >= type(int144).min && value <= type(int144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return int144(value);\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136) {\n require(value >= type(int136).min && value <= type(int136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return int136(value);\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128) {\n require(value >= type(int128).min && value <= type(int128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return int128(value);\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120) {\n require(value >= type(int120).min && value <= type(int120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return int120(value);\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112) {\n require(value >= type(int112).min && value <= type(int112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return int112(value);\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104) {\n require(value >= type(int104).min && value <= type(int104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return int104(value);\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96) {\n require(value >= type(int96).min && value <= type(int96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return int96(value);\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88) {\n require(value >= type(int88).min && value <= type(int88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return int88(value);\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80) {\n require(value >= type(int80).min && value <= type(int80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return int80(value);\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72) {\n require(value >= type(int72).min && value <= type(int72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return int72(value);\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64) {\n require(value >= type(int64).min && value <= type(int64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return int64(value);\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56) {\n require(value >= type(int56).min && value <= type(int56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return int56(value);\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48) {\n require(value >= type(int48).min && value <= type(int48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return int48(value);\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40) {\n require(value >= type(int40).min && value <= type(int40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return int40(value);\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32) {\n require(value >= type(int32).min && value <= type(int32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return int32(value);\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24) {\n require(value >= type(int24).min && value <= type(int24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return int24(value);\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16) {\n require(value >= type(int16).min && value <= type(int16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return int16(value);\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8) {\n require(value >= type(int8).min && value <= type(int8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return int8(value);\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)\npragma solidity ^0.8.4;\n\nimport \"../math/SafeCast.sol\";\n\n/**\n * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of\n * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and\n * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that\n * the existing queue contents are left in storage.\n *\n * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be\n * used in storage, and not in memory.\n * ```\n * DoubleEndedQueue.Bytes32Deque queue;\n * ```\n *\n * _Available since v4.6._\n */\nlibrary DoubleEndedQueue {\n /**\n * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.\n */\n error Empty();\n\n /**\n * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.\n */\n error OutOfBounds();\n\n /**\n * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end\n * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely\n * assume that these 128-bit indices will not overflow, and use unchecked arithmetic.\n *\n * Struct members have an underscore prefix indicating that they are \"private\" and should not be read or written to\n * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and\n * lead to unexpected behavior.\n *\n * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at\n * data[end - 1].\n */\n struct Bytes32Deque {\n int128 _begin;\n int128 _end;\n mapping(int128 => bytes32) _data;\n }\n\n /**\n * @dev Inserts an item at the end of the queue.\n */\n function pushBack(Bytes32Deque storage deque, bytes32 value) internal {\n int128 backIndex = deque._end;\n deque._data[backIndex] = value;\n unchecked {\n deque._end = backIndex + 1;\n }\n }\n\n /**\n * @dev Removes the item at the end of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n value = deque._data[backIndex];\n delete deque._data[backIndex];\n deque._end = backIndex;\n }\n\n /**\n * @dev Inserts an item at the beginning of the queue.\n */\n function pushFront(Bytes32Deque storage deque, bytes32 value) internal {\n int128 frontIndex;\n unchecked {\n frontIndex = deque._begin - 1;\n }\n deque._data[frontIndex] = value;\n deque._begin = frontIndex;\n }\n\n /**\n * @dev Removes the item at the beginning of the queue and returns it.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n value = deque._data[frontIndex];\n delete deque._data[frontIndex];\n unchecked {\n deque._begin = frontIndex + 1;\n }\n }\n\n /**\n * @dev Returns the item at the beginning of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 frontIndex = deque._begin;\n return deque._data[frontIndex];\n }\n\n /**\n * @dev Returns the item at the end of the queue.\n *\n * Reverts with `Empty` if the queue is empty.\n */\n function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {\n if (empty(deque)) revert Empty();\n int128 backIndex;\n unchecked {\n backIndex = deque._end - 1;\n }\n return deque._data[backIndex];\n }\n\n /**\n * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at\n * `length(deque) - 1`.\n *\n * Reverts with `OutOfBounds` if the index is out of bounds.\n */\n function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {\n // int256(deque._begin) is a safe upcast\n int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index));\n if (idx >= deque._end) revert OutOfBounds();\n return deque._data[idx];\n }\n\n /**\n * @dev Resets the queue back to being empty.\n *\n * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses\n * out on potential gas refunds.\n */\n function clear(Bytes32Deque storage deque) internal {\n deque._begin = 0;\n deque._end = 0;\n }\n\n /**\n * @dev Returns the number of items in the queue.\n */\n function length(Bytes32Deque storage deque) internal view returns (uint256) {\n // The interface preserves the invariant that begin <= end so we assume this will not overflow.\n // We also assume there are at most int256.max items in the queue.\n unchecked {\n return uint256(int256(deque._end) - int256(deque._begin));\n }\n }\n\n /**\n * @dev Returns true if the queue is empty.\n */\n function empty(Bytes32Deque storage deque) internal view returns (bool) {\n return deque._end <= deque._begin;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/utils/Strings.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 Strings {\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" - }, - "@openzeppelin/contracts/utils/Checkpoints.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol)\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SafeCast.sol\";\n\n/**\n * @dev This library defines the `History` struct, for checkpointing values as they change at different points in\n * time, and later looking up past values by block number. See {Votes} as an example.\n *\n * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new\n * checkpoint for the current transaction block using the {push} function.\n *\n * _Available since v4.5._\n */\nlibrary Checkpoints {\n struct Checkpoint {\n uint32 _blockNumber;\n uint224 _value;\n }\n\n struct History {\n Checkpoint[] _checkpoints;\n }\n\n /**\n * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints.\n */\n function latest(History storage self) internal view returns (uint256) {\n uint256 pos = self._checkpoints.length;\n return pos == 0 ? 0 : self._checkpoints[pos - 1]._value;\n }\n\n /**\n * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one\n * before it is returned, or zero otherwise.\n */\n function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {\n require(blockNumber < block.number, \"Checkpoints: block not yet mined\");\n\n uint256 high = self._checkpoints.length;\n uint256 low = 0;\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (self._checkpoints[mid]._blockNumber > blockNumber) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return high == 0 ? 0 : self._checkpoints[high - 1]._value;\n }\n\n /**\n * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.\n *\n * Returns previous value and new value.\n */\n function push(History storage self, uint256 value) internal returns (uint256, uint256) {\n uint256 pos = self._checkpoints.length;\n uint256 old = latest(self);\n if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) {\n self._checkpoints[pos - 1]._value = SafeCast.toUint224(value);\n } else {\n self._checkpoints.push(\n Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)})\n );\n }\n return (old, value);\n }\n\n /**\n * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will\n * be set to `op(latest, delta)`.\n *\n * Returns previous value and new value.\n */\n function push(\n History storage self,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) internal returns (uint256, uint256) {\n return push(self, op(latest(self), delta));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a >= b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`.\n // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.\n // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.\n // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a\n // good first aproximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1;\n uint256 x = a;\n if (x >> 128 > 0) {\n x >>= 128;\n result <<= 64;\n }\n if (x >> 64 > 0) {\n x >>= 64;\n result <<= 32;\n }\n if (x >> 32 > 0) {\n x >>= 32;\n result <<= 16;\n }\n if (x >> 16 > 0) {\n x >>= 16;\n result <<= 8;\n }\n if (x >> 8 > 0) {\n x >>= 8;\n result <<= 4;\n }\n if (x >> 4 > 0) {\n x >>= 4;\n result <<= 2;\n }\n if (x >> 2 > 0) {\n result <<= 1;\n }\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n uint256 result = sqrt(a);\n if (rounding == Rounding.Up && result * result < a) {\n result += 1;\n }\n return result;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/utils/IVotes.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).\n */\n function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n}\n" - }, - "@openzeppelin/contracts/governance/TimelockController.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../access/AccessControl.sol\";\nimport \"../token/ERC721/IERC721Receiver.sol\";\nimport \"../token/ERC1155/IERC1155Receiver.sol\";\nimport \"../utils/Address.sol\";\n\n/**\n * @dev Contract module which acts as a timelocked controller. When set as the\n * owner of an `Ownable` smart contract, it enforces a timelock on all\n * `onlyOwner` maintenance operations. This gives time for users of the\n * controlled contract to exit before a potentially dangerous maintenance\n * operation is applied.\n *\n * By default, this contract is self administered, meaning administration tasks\n * have to go through the timelock process. The proposer (resp executor) role\n * is in charge of proposing (resp executing) operations. A common use case is\n * to position this {TimelockController} as the owner of a smart contract, with\n * a multisig or a DAO as the sole proposer.\n *\n * _Available since v3.3._\n */\ncontract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver {\n bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256(\"TIMELOCK_ADMIN_ROLE\");\n bytes32 public constant PROPOSER_ROLE = keccak256(\"PROPOSER_ROLE\");\n bytes32 public constant EXECUTOR_ROLE = keccak256(\"EXECUTOR_ROLE\");\n bytes32 public constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\n uint256 internal constant _DONE_TIMESTAMP = uint256(1);\n\n mapping(bytes32 => uint256) private _timestamps;\n uint256 private _minDelay;\n\n /**\n * @dev Emitted when a call is scheduled as part of operation `id`.\n */\n event CallScheduled(\n bytes32 indexed id,\n uint256 indexed index,\n address target,\n uint256 value,\n bytes data,\n bytes32 predecessor,\n uint256 delay\n );\n\n /**\n * @dev Emitted when a call is performed as part of operation `id`.\n */\n event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);\n\n /**\n * @dev Emitted when operation `id` is cancelled.\n */\n event Cancelled(bytes32 indexed id);\n\n /**\n * @dev Emitted when the minimum delay for future operations is modified.\n */\n event MinDelayChange(uint256 oldDuration, uint256 newDuration);\n\n /**\n * @dev Initializes the contract with a given `minDelay`, and a list of\n * initial proposers and executors. The proposers receive both the\n * proposer and the canceller role (for backward compatibility). The\n * executors receive the executor role.\n *\n * NOTE: At construction, both the deployer and the timelock itself are\n * administrators. This helps further configuration of the timelock by the\n * deployer. After configuration is done, it is recommended that the\n * deployer renounces its admin position and relies on timelocked\n * operations to perform future maintenance.\n */\n constructor(\n uint256 minDelay,\n address[] memory proposers,\n address[] memory executors\n ) {\n _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);\n _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);\n\n // deployer + self administration\n _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender());\n _setupRole(TIMELOCK_ADMIN_ROLE, address(this));\n\n // register proposers and cancellers\n for (uint256 i = 0; i < proposers.length; ++i) {\n _setupRole(PROPOSER_ROLE, proposers[i]);\n _setupRole(CANCELLER_ROLE, proposers[i]);\n }\n\n // register executors\n for (uint256 i = 0; i < executors.length; ++i) {\n _setupRole(EXECUTOR_ROLE, executors[i]);\n }\n\n _minDelay = minDelay;\n emit MinDelayChange(0, minDelay);\n }\n\n /**\n * @dev Modifier to make a function callable only by a certain role. In\n * addition to checking the sender's role, `address(0)` 's role is also\n * considered. Granting a role to `address(0)` is equivalent to enabling\n * this role for everyone.\n */\n modifier onlyRoleOrOpenRole(bytes32 role) {\n if (!hasRole(role, address(0))) {\n _checkRole(role, _msgSender());\n }\n _;\n }\n\n /**\n * @dev Contract might receive/hold ETH as part of the maintenance process.\n */\n receive() external payable {}\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns whether an id correspond to a registered operation. This\n * includes both Pending, Ready and Done operations.\n */\n function isOperation(bytes32 id) public view virtual returns (bool registered) {\n return getTimestamp(id) > 0;\n }\n\n /**\n * @dev Returns whether an operation is pending or not.\n */\n function isOperationPending(bytes32 id) public view virtual returns (bool pending) {\n return getTimestamp(id) > _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns whether an operation is ready or not.\n */\n function isOperationReady(bytes32 id) public view virtual returns (bool ready) {\n uint256 timestamp = getTimestamp(id);\n return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;\n }\n\n /**\n * @dev Returns whether an operation is done or not.\n */\n function isOperationDone(bytes32 id) public view virtual returns (bool done) {\n return getTimestamp(id) == _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Returns the timestamp at with an operation becomes ready (0 for\n * unset operations, 1 for done operations).\n */\n function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {\n return _timestamps[id];\n }\n\n /**\n * @dev Returns the minimum delay for an operation to become valid.\n *\n * This value can be changed by executing an operation that calls `updateDelay`.\n */\n function getMinDelay() public view virtual returns (uint256 duration) {\n return _minDelay;\n }\n\n /**\n * @dev Returns the identifier of an operation containing a single\n * transaction.\n */\n function hashOperation(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(target, value, data, predecessor, salt));\n }\n\n /**\n * @dev Returns the identifier of an operation containing a batch of\n * transactions.\n */\n function hashOperationBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public pure virtual returns (bytes32 hash) {\n return keccak256(abi.encode(targets, values, payloads, predecessor, salt));\n }\n\n /**\n * @dev Schedule an operation containing a single transaction.\n *\n * Emits a {CallScheduled} event.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function schedule(\n address target,\n uint256 value,\n bytes calldata data,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n bytes32 id = hashOperation(target, value, data, predecessor, salt);\n _schedule(id, delay);\n emit CallScheduled(id, 0, target, value, data, predecessor, delay);\n }\n\n /**\n * @dev Schedule an operation containing a batch of transactions.\n *\n * Emits one {CallScheduled} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'proposer' role.\n */\n function scheduleBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt,\n uint256 delay\n ) public virtual onlyRole(PROPOSER_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n _schedule(id, delay);\n for (uint256 i = 0; i < targets.length; ++i) {\n emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);\n }\n }\n\n /**\n * @dev Schedule an operation that is to becomes valid after a given delay.\n */\n function _schedule(bytes32 id, uint256 delay) private {\n require(!isOperation(id), \"TimelockController: operation already scheduled\");\n require(delay >= getMinDelay(), \"TimelockController: insufficient delay\");\n _timestamps[id] = block.timestamp + delay;\n }\n\n /**\n * @dev Cancel an operation.\n *\n * Requirements:\n *\n * - the caller must have the 'canceller' role.\n */\n function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {\n require(isOperationPending(id), \"TimelockController: operation cannot be cancelled\");\n delete _timestamps[id];\n\n emit Cancelled(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a single transaction.\n *\n * Emits a {CallExecuted} event.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,\n // thus any modifications to the operation during reentrancy should be caught.\n // slither-disable-next-line reentrancy-eth\n function execute(\n address target,\n uint256 value,\n bytes calldata payload,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n bytes32 id = hashOperation(target, value, payload, predecessor, salt);\n\n _beforeCall(id, predecessor);\n _execute(target, value, payload);\n emit CallExecuted(id, 0, target, value, payload);\n _afterCall(id);\n }\n\n /**\n * @dev Execute an (ready) operation containing a batch of transactions.\n *\n * Emits one {CallExecuted} event per transaction in the batch.\n *\n * Requirements:\n *\n * - the caller must have the 'executor' role.\n */\n function executeBatch(\n address[] calldata targets,\n uint256[] calldata values,\n bytes[] calldata payloads,\n bytes32 predecessor,\n bytes32 salt\n ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {\n require(targets.length == values.length, \"TimelockController: length mismatch\");\n require(targets.length == payloads.length, \"TimelockController: length mismatch\");\n\n bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);\n\n _beforeCall(id, predecessor);\n for (uint256 i = 0; i < targets.length; ++i) {\n address target = targets[i];\n uint256 value = values[i];\n bytes calldata payload = payloads[i];\n _execute(target, value, payload);\n emit CallExecuted(id, i, target, value, payload);\n }\n _afterCall(id);\n }\n\n /**\n * @dev Execute an operation's call.\n */\n function _execute(\n address target,\n uint256 value,\n bytes calldata data\n ) internal virtual {\n (bool success, ) = target.call{value: value}(data);\n require(success, \"TimelockController: underlying transaction reverted\");\n }\n\n /**\n * @dev Checks before execution of an operation's calls.\n */\n function _beforeCall(bytes32 id, bytes32 predecessor) private view {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n require(predecessor == bytes32(0) || isOperationDone(predecessor), \"TimelockController: missing dependency\");\n }\n\n /**\n * @dev Checks after execution of an operation's calls.\n */\n function _afterCall(bytes32 id) private {\n require(isOperationReady(id), \"TimelockController: operation is not ready\");\n _timestamps[id] = _DONE_TIMESTAMP;\n }\n\n /**\n * @dev Changes the minimum timelock duration for future operations.\n *\n * Emits a {MinDelayChange} event.\n *\n * Requirements:\n *\n * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing\n * an operation where the timelock is the target and the data is the ABI-encoded call to this function.\n */\n function updateDelay(uint256 newDelay) external virtual {\n require(msg.sender == address(this), \"TimelockController: caller must be timelock\");\n emit MinDelayChange(_minDelay, newDelay);\n _minDelay = newDelay;\n }\n\n /**\n * @dev See {IERC721Receiver-onERC721Received}.\n */\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC721Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155Received}.\n */\n function onERC1155Received(\n address,\n address,\n uint256,\n uint256,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155Received.selector;\n }\n\n /**\n * @dev See {IERC1155Receiver-onERC1155BatchReceived}.\n */\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] memory,\n uint256[] memory,\n bytes memory\n ) public virtual override returns (bytes4) {\n return this.onERC1155BatchReceived.selector;\n }\n}\n" - }, - "@openzeppelin/contracts/governance/extensions/IGovernorTimelock.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IGovernor.sol\";\n\n/**\n * @dev Extension of the {IGovernor} for timelock supporting modules.\n *\n * _Available since v4.3._\n */\nabstract contract IGovernorTimelock is IGovernor {\n event ProposalQueued(uint256 proposalId, uint256 eta);\n\n function timelock() public view virtual returns (address);\n\n function proposalEta(uint256 proposalId) public view virtual returns (uint256);\n\n function queue(\n address[] memory targets,\n uint256[] memory values,\n bytes[] memory calldatas,\n bytes32 descriptionHash\n ) public virtual returns (uint256 proposalId);\n}\n" - }, - "@openzeppelin/contracts/access/AccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(uint160(account), 20),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" - }, - "@openzeppelin/contracts/access/IAccessControl.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/proposals.json b/proposals.json index a21139c..2e2a44c 100644 --- a/proposals.json +++ b/proposals.json @@ -1 +1 @@ -{"31337":["99966883216571458440169013809788587697246968345487969070787258353943787317927"]} \ No newline at end of file +{"31337":["99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927"]} \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..663bd03 --- /dev/null +++ b/readme.md @@ -0,0 +1,5 @@ +yarn hardhat run scripts/submit_and_propose.js --network localhost +yarn hardhat run scripts/vote.js --network localhost +yarn hardhat run scripts/queue-and-execute-afterSubmit.js --network localhost +yarn hardhat run scripts/fund.js --network localhost +yarn hardhat run scripts/del.js --network localhost diff --git a/scripts/del.js b/scripts/del.js new file mode 100644 index 0000000..59c9bcf --- /dev/null +++ b/scripts/del.js @@ -0,0 +1,35 @@ +const { ethers, network } = require("hardhat"); +const { + developmentChains, + VOTING_PERIOD, + s_fundingTime, +} = require("../helper-config"); +const { moveBlocks } = require("../utils/move-blocks"); +const { moveTime } = require("../utils/move-time"); + +async function vote() { + const provider = hre.ethers.provider; + const governor = await ethers.getContract("GovernerContract"); + const projectId = await governor._getProjectId( + "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu" + ); + const invest = ethers.utils.parseUnits("1", "ether"); + const investor = "0x90F79bf6EB2c4f870365E785982E1f101E93b906"; // node account3 + const account2node = "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"; + + console.log((await governor.getFunderBalance(investor)).toString()); + + await ethers.getContract("GovernerContract", investor); + + const invTx = await governor.fund(projectId, { value: invest }); + await invTx.wait(1); + console.log((await governor.getFunderBalance(investor)).toString()); + console.log((await governor._getBalanceOfProject(projectId)).toString()); +} + +vote() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/fund.js b/scripts/fund.js new file mode 100644 index 0000000..c2a5875 --- /dev/null +++ b/scripts/fund.js @@ -0,0 +1,42 @@ +const { ethers, network } = require("hardhat"); +const { + developmentChains, + VOTING_PERIOD, + s_fundingTime, +} = require("../helper-config"); +const { moveBlocks } = require("../utils/move-blocks"); +const { moveTime } = require("../utils/move-time"); + +async function fund() { + const provider = hre.ethers.provider; + const governor = await ethers.getContract("GovernerContract"); + const projectId = await governor._getProjectId( + "QmPwX1rNoYRmQAPDm8Dp7YSeFdxPKaczWaBu8NPgVpKufu" + ); + const invest = ethers.utils.parseUnits("1", "ether"); + const investor = "0x90F79bf6EB2c4f870365E785982E1f101E93b906"; // node account3 + const account2node = "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"; + + console.log((await provider.getBalance(investor)).toString()); + + await ethers.getContract("GovernerContract", investor); + const invTx = await governor.fund(projectId, { value: invest }); + await invTx.wait(1); + console.log((await provider.getBalance(investor)).toString()); + + /* if (developmentChains.includes(network.name)) { + await moveTime(s_fundingTime + 1); + await moveBlocks(1); + } + + const tx = await governor.performUpkeep( + ethers.utils.hexZeroPad(ethers.utils.hexlify(projectId), 32) + ); */ +} + +fund() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/test/unit/fundContract.test.js b/test/unit/fundContract.test.js index b9426e1..b8f99b1 100644 --- a/test/unit/fundContract.test.js +++ b/test/unit/fundContract.test.js @@ -90,6 +90,7 @@ const fs = require("fs"); const payFee = await governor.paySubmitFee({ value: enteranceFee }); await payFee.wait(1); + assert(await governor.isEnteranceFeePaid(projectOwner)); const proposalTx = await governor.propose( [governor.address], [0], From b2981e4e44c240ae64ffa1e17846d45b80facd09 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Thu, 10 Nov 2022 21:50:04 +0300 Subject: [PATCH 22/28] Add chainlink automation Fix big bug. Add tests V4 --- contracts/FundProject.sol | 15 +++++----- coverage.json | 2 +- coverage/contracts/FundProject.sol.html | 20 ++++++------- coverage/contracts/GovernanceToken.sol.html | 2 +- coverage/contracts/GovernerContract.sol.html | 2 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 28 +++++++++---------- coverage/coverage-final.json | 2 +- coverage/index.html | 28 +++++++++---------- .../contracts/FundProject.sol.html | 20 ++++++------- .../contracts/GovernanceToken.sol.html | 2 +- .../contracts/GovernerContract.sol.html | 2 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 28 +++++++++---------- coverage/lcov-report/index.html | 28 +++++++++---------- coverage/lcov.info | 8 +++--- deployments/localhost/GovernanceToken.json | 8 +++--- deployments/localhost/GovernerContract.json | 14 +++++----- deployments/localhost/TimeLock.json | 16 +++++------ proposals.json | 2 +- scripts/del.js | 17 +++++++++++ 21 files changed, 133 insertions(+), 115 deletions(-) diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index 5f9442b..d108d3a 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -113,13 +113,14 @@ contract FundProject is Ownable, AutomationCompatibleInterface { returns (bool upkeepNeeded, bytes memory performData) { for (uint i = 1; i <= projectId; i++) { - bool isFunded = _isFunding[i]; - bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) > - time[i]; - upkeepNeeded = (isFunded && timePassed); - if (upkeepNeeded) { - performData = abi.encodePacked(i); - break; + if (_isFunding[i]) { + bool timePassed = (block.timestamp - + (projectToTime[i][time[i]])) > time[i]; + upkeepNeeded = (timePassed); + if (upkeepNeeded) { + performData = abi.encodePacked(i); + break; + } } } } diff --git a/coverage.json b/coverage.json index 48e5afd..2c49b16 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/FundProject.sol":{"l":{"55":3,"56":0,"57":3,"61":3,"62":3,"63":3,"71":3,"72":3,"73":3,"83":7,"84":0,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"102":0,"103":0,"104":0,"115":12,"116":14,"117":14,"119":14,"120":14,"121":4,"122":4,"128":4,"129":4,"130":1,"133":3,"134":3,"135":3,"137":3,"138":1,"139":1,"141":1,"142":1,"145":1,"146":0,"149":1,"151":2,"152":2,"157":8,"158":0,"160":8,"161":8,"166":2,"167":1,"168":1,"169":1,"172":1,"173":0,"175":1,"177":1,"186":4,"194":1,"202":7,"210":1,"218":0,"222":3,"230":3,"234":9,"238":0,"246":2,"254":0,"258":1,"266":0,"267":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"51":4,"52":1,"53":7,"54":1,"55":0,"56":3,"57":3,"58":9,"59":0,"60":2,"61":0,"62":1,"63":0,"64":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[1,1],"9":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":58,"column":4}}},"2":{"name":"constructor","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":64,"column":4}}},"3":{"name":"fund","line":69,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":4}}},"4":{"name":"apporoveFundingByDao","line":81,"loc":{"start":{"line":76,"column":4},"end":{"line":98,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":105,"column":4}}},"6":{"name":"checkUpkeep","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":125,"column":4}}},"7":{"name":"performUpkeep","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":154,"column":4}}},"8":{"name":"paySubmitFee","line":156,"loc":{"start":{"line":156,"column":4},"end":{"line":163,"column":4}}},"9":{"name":"withdrawFund","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":179,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":181,"loc":{"start":{"line":181,"column":4},"end":{"line":187,"column":4}}},"11":{"name":"_getHashOfProjectData","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":195,"column":4}}},"12":{"name":"_getProjectId","line":197,"loc":{"start":{"line":197,"column":4},"end":{"line":203,"column":4}}},"13":{"name":"_getBalanceOfProject","line":205,"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"15":{"name":"is_funding","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"16":{"name":"_getProjectStatus","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":231,"column":4}}},"17":{"name":"getEnteranceFee","line":233,"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":4}}},"19":{"name":"getFunderBalance","line":241,"loc":{"start":{"line":241,"column":4},"end":{"line":247,"column":4}}},"20":{"name":"getInvestedProjects","line":249,"loc":{"start":{"line":249,"column":4},"end":{"line":255,"column":4}}},"21":{"name":"getDaoPercentage","line":257,"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":4}}},"22":{"name":"getTimeleft","line":261,"loc":{"start":{"line":261,"column":4},"end":{"line":268,"column":4}}}},"statementMap":{"1":{"start":{"line":55,"column":8},"end":{"line":55,"column":2182}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":38}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":37}},"4":{"start":{"line":63,"column":8},"end":{"line":63,"column":35}},"5":{"start":{"line":71,"column":8},"end":{"line":71,"column":50}},"6":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"7":{"start":{"line":73,"column":8},"end":{"line":73,"column":49}},"8":{"start":{"line":83,"column":8},"end":{"line":83,"column":2951}},"9":{"start":{"line":86,"column":12},"end":{"line":86,"column":60}},"10":{"start":{"line":87,"column":12},"end":{"line":87,"column":77}},"11":{"start":{"line":88,"column":12},"end":{"line":88,"column":34}},"12":{"start":{"line":89,"column":12},"end":{"line":89,"column":67}},"13":{"start":{"line":90,"column":12},"end":{"line":90,"column":49}},"14":{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},"15":{"start":{"line":92,"column":12},"end":{"line":92,"column":64}},"16":{"start":{"line":93,"column":12},"end":{"line":93,"column":46}},"17":{"start":{"line":94,"column":12},"end":{"line":94,"column":39}},"18":{"start":{"line":95,"column":12},"end":{"line":95,"column":48}},"19":{"start":{"line":102,"column":8},"end":{"line":102,"column":43}},"20":{"start":{"line":103,"column":8},"end":{"line":103,"column":36}},"21":{"start":{"line":104,"column":8},"end":{"line":104,"column":71}},"22":{"start":{"line":115,"column":8},"end":{"line":115,"column":4138}},"23":{"start":{"line":116,"column":12},"end":{"line":116,"column":41}},"24":{"start":{"line":117,"column":12},"end":{"line":117,"column":4248}},"25":{"start":{"line":119,"column":12},"end":{"line":119,"column":50}},"26":{"start":{"line":120,"column":12},"end":{"line":120,"column":4395}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":48}},"28":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"29":{"start":{"line":129,"column":8},"end":{"line":129,"column":4648}},"30":{"start":{"line":133,"column":8},"end":{"line":133,"column":57}},"31":{"start":{"line":134,"column":8},"end":{"line":134,"column":36}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":43}},"33":{"start":{"line":137,"column":8},"end":{"line":137,"column":4881}},"34":{"start":{"line":138,"column":12},"end":{"line":138,"column":74}},"35":{"start":{"line":139,"column":12},"end":{"line":139,"column":5050}},"36":{"start":{"line":141,"column":12},"end":{"line":141,"column":38}},"37":{"start":{"line":142,"column":12},"end":{"line":142,"column":5188}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":5307}},"39":{"start":{"line":149,"column":12},"end":{"line":149,"column":53}},"40":{"start":{"line":151,"column":12},"end":{"line":151,"column":73}},"41":{"start":{"line":152,"column":12},"end":{"line":152,"column":48}},"42":{"start":{"line":157,"column":8},"end":{"line":157,"column":5679}},"43":{"start":{"line":160,"column":12},"end":{"line":160,"column":49}},"44":{"start":{"line":161,"column":12},"end":{"line":161,"column":45}},"45":{"start":{"line":166,"column":8},"end":{"line":166,"column":5959}},"46":{"start":{"line":167,"column":12},"end":{"line":167,"column":64}},"47":{"start":{"line":168,"column":12},"end":{"line":168,"column":46}},"48":{"start":{"line":169,"column":12},"end":{"line":169,"column":6163}},"49":{"start":{"line":172,"column":12},"end":{"line":172,"column":6274}},"50":{"start":{"line":175,"column":12},"end":{"line":175,"column":64}},"51":{"start":{"line":186,"column":8},"end":{"line":186,"column":43}},"52":{"start":{"line":194,"column":8},"end":{"line":194,"column":34}},"53":{"start":{"line":202,"column":8},"end":{"line":202,"column":41}},"54":{"start":{"line":210,"column":8},"end":{"line":210,"column":38}},"55":{"start":{"line":218,"column":8},"end":{"line":218,"column":50}},"56":{"start":{"line":222,"column":8},"end":{"line":222,"column":37}},"57":{"start":{"line":230,"column":8},"end":{"line":230,"column":48}},"58":{"start":{"line":234,"column":8},"end":{"line":234,"column":27}},"59":{"start":{"line":238,"column":8},"end":{"line":238,"column":43}},"60":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"61":{"start":{"line":254,"column":8},"end":{"line":254,"column":41}},"62":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"63":{"start":{"line":266,"column":8},"end":{"line":266,"column":72}},"64":{"start":{"line":267,"column":8},"end":{"line":267,"column":27}}},"branchMap":{"1":{"line":55,"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":8}},{"start":{"line":55,"column":8},"end":{"line":55,"column":8}}]},"2":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"3":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":12},"end":{"line":120,"column":12}},{"start":{"line":120,"column":12},"end":{"line":120,"column":12}}]},"4":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"5":{"line":137,"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":137,"column":8}},{"start":{"line":137,"column":8},"end":{"line":137,"column":8}}]},"6":{"line":145,"type":"if","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":12}},{"start":{"line":145,"column":12},"end":{"line":145,"column":12}}]},"7":{"line":157,"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":8}},{"start":{"line":157,"column":8},"end":{"line":157,"column":8}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":172,"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":172,"column":12}},{"start":{"line":172,"column":12},"end":{"line":172,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/FundProject.sol":{"l":{"55":3,"56":0,"57":3,"61":3,"62":3,"63":3,"71":3,"72":3,"73":3,"83":7,"84":0,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"102":0,"103":0,"104":0,"115":12,"116":14,"117":14,"119":14,"120":14,"121":4,"122":4,"128":4,"129":4,"130":1,"133":3,"134":3,"135":3,"137":3,"138":1,"139":1,"141":1,"142":1,"145":1,"146":0,"149":1,"151":2,"152":2,"157":8,"158":0,"160":8,"161":8,"166":2,"167":1,"168":1,"169":1,"172":1,"173":0,"175":1,"177":1,"186":4,"194":1,"202":7,"210":1,"218":0,"222":3,"230":3,"234":9,"238":6,"246":2,"254":0,"258":1,"266":0,"267":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"51":4,"52":1,"53":7,"54":1,"55":0,"56":3,"57":3,"58":9,"59":6,"60":2,"61":0,"62":1,"63":0,"64":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[1,1],"9":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":6,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":58,"column":4}}},"2":{"name":"constructor","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":64,"column":4}}},"3":{"name":"fund","line":69,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":4}}},"4":{"name":"apporoveFundingByDao","line":81,"loc":{"start":{"line":76,"column":4},"end":{"line":98,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":105,"column":4}}},"6":{"name":"checkUpkeep","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":125,"column":4}}},"7":{"name":"performUpkeep","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":154,"column":4}}},"8":{"name":"paySubmitFee","line":156,"loc":{"start":{"line":156,"column":4},"end":{"line":163,"column":4}}},"9":{"name":"withdrawFund","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":179,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":181,"loc":{"start":{"line":181,"column":4},"end":{"line":187,"column":4}}},"11":{"name":"_getHashOfProjectData","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":195,"column":4}}},"12":{"name":"_getProjectId","line":197,"loc":{"start":{"line":197,"column":4},"end":{"line":203,"column":4}}},"13":{"name":"_getBalanceOfProject","line":205,"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"15":{"name":"is_funding","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"16":{"name":"_getProjectStatus","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":231,"column":4}}},"17":{"name":"getEnteranceFee","line":233,"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":4}}},"19":{"name":"getFunderBalance","line":241,"loc":{"start":{"line":241,"column":4},"end":{"line":247,"column":4}}},"20":{"name":"getInvestedProjects","line":249,"loc":{"start":{"line":249,"column":4},"end":{"line":255,"column":4}}},"21":{"name":"getDaoPercentage","line":257,"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":4}}},"22":{"name":"getTimeleft","line":261,"loc":{"start":{"line":261,"column":4},"end":{"line":268,"column":4}}}},"statementMap":{"1":{"start":{"line":55,"column":8},"end":{"line":55,"column":2182}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":38}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":37}},"4":{"start":{"line":63,"column":8},"end":{"line":63,"column":35}},"5":{"start":{"line":71,"column":8},"end":{"line":71,"column":50}},"6":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"7":{"start":{"line":73,"column":8},"end":{"line":73,"column":49}},"8":{"start":{"line":83,"column":8},"end":{"line":83,"column":2951}},"9":{"start":{"line":86,"column":12},"end":{"line":86,"column":60}},"10":{"start":{"line":87,"column":12},"end":{"line":87,"column":77}},"11":{"start":{"line":88,"column":12},"end":{"line":88,"column":34}},"12":{"start":{"line":89,"column":12},"end":{"line":89,"column":67}},"13":{"start":{"line":90,"column":12},"end":{"line":90,"column":49}},"14":{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},"15":{"start":{"line":92,"column":12},"end":{"line":92,"column":64}},"16":{"start":{"line":93,"column":12},"end":{"line":93,"column":46}},"17":{"start":{"line":94,"column":12},"end":{"line":94,"column":39}},"18":{"start":{"line":95,"column":12},"end":{"line":95,"column":48}},"19":{"start":{"line":102,"column":8},"end":{"line":102,"column":43}},"20":{"start":{"line":103,"column":8},"end":{"line":103,"column":36}},"21":{"start":{"line":104,"column":8},"end":{"line":104,"column":71}},"22":{"start":{"line":115,"column":8},"end":{"line":115,"column":4138}},"23":{"start":{"line":116,"column":12},"end":{"line":116,"column":41}},"24":{"start":{"line":117,"column":12},"end":{"line":117,"column":4248}},"25":{"start":{"line":119,"column":12},"end":{"line":119,"column":50}},"26":{"start":{"line":120,"column":12},"end":{"line":120,"column":4395}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":48}},"28":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"29":{"start":{"line":129,"column":8},"end":{"line":129,"column":4648}},"30":{"start":{"line":133,"column":8},"end":{"line":133,"column":57}},"31":{"start":{"line":134,"column":8},"end":{"line":134,"column":36}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":43}},"33":{"start":{"line":137,"column":8},"end":{"line":137,"column":4881}},"34":{"start":{"line":138,"column":12},"end":{"line":138,"column":74}},"35":{"start":{"line":139,"column":12},"end":{"line":139,"column":5050}},"36":{"start":{"line":141,"column":12},"end":{"line":141,"column":38}},"37":{"start":{"line":142,"column":12},"end":{"line":142,"column":5188}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":5307}},"39":{"start":{"line":149,"column":12},"end":{"line":149,"column":53}},"40":{"start":{"line":151,"column":12},"end":{"line":151,"column":73}},"41":{"start":{"line":152,"column":12},"end":{"line":152,"column":48}},"42":{"start":{"line":157,"column":8},"end":{"line":157,"column":5679}},"43":{"start":{"line":160,"column":12},"end":{"line":160,"column":49}},"44":{"start":{"line":161,"column":12},"end":{"line":161,"column":45}},"45":{"start":{"line":166,"column":8},"end":{"line":166,"column":5959}},"46":{"start":{"line":167,"column":12},"end":{"line":167,"column":64}},"47":{"start":{"line":168,"column":12},"end":{"line":168,"column":46}},"48":{"start":{"line":169,"column":12},"end":{"line":169,"column":6163}},"49":{"start":{"line":172,"column":12},"end":{"line":172,"column":6274}},"50":{"start":{"line":175,"column":12},"end":{"line":175,"column":64}},"51":{"start":{"line":186,"column":8},"end":{"line":186,"column":43}},"52":{"start":{"line":194,"column":8},"end":{"line":194,"column":34}},"53":{"start":{"line":202,"column":8},"end":{"line":202,"column":41}},"54":{"start":{"line":210,"column":8},"end":{"line":210,"column":38}},"55":{"start":{"line":218,"column":8},"end":{"line":218,"column":50}},"56":{"start":{"line":222,"column":8},"end":{"line":222,"column":37}},"57":{"start":{"line":230,"column":8},"end":{"line":230,"column":48}},"58":{"start":{"line":234,"column":8},"end":{"line":234,"column":27}},"59":{"start":{"line":238,"column":8},"end":{"line":238,"column":43}},"60":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"61":{"start":{"line":254,"column":8},"end":{"line":254,"column":41}},"62":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"63":{"start":{"line":266,"column":8},"end":{"line":266,"column":72}},"64":{"start":{"line":267,"column":8},"end":{"line":267,"column":27}}},"branchMap":{"1":{"line":55,"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":8}},{"start":{"line":55,"column":8},"end":{"line":55,"column":8}}]},"2":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"3":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":12},"end":{"line":120,"column":12}},{"start":{"line":120,"column":12},"end":{"line":120,"column":12}}]},"4":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"5":{"line":137,"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":137,"column":8}},{"start":{"line":137,"column":8},"end":{"line":137,"column":8}}]},"6":{"line":145,"type":"if","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":12}},{"start":{"line":145,"column":12},"end":{"line":145,"column":12}}]},"7":{"line":157,"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":8}},{"start":{"line":157,"column":8},"end":{"line":157,"column":8}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":172,"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":172,"column":12}},{"start":{"line":172,"column":12},"end":{"line":172,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html index 733b612..380db2b 100644 --- a/coverage/contracts/FundProject.sol.html +++ b/coverage/contracts/FundProject.sol.html @@ -20,9 +20,9 @@

- 87.5% + 89.06% Statements - 56/64 + 57/64
72.22% @@ -30,14 +30,14 @@

13/18

- 77.27% + 81.82% Functions - 17/22 + 18/22
- 82.43% + 83.78% Lines - 61/74 + 62/74
@@ -549,7 +549,7 @@

      -  +       @@ -817,8 +817,8 @@

return enteranceFee; }   - function isEnteranceFeePaid(address account) public view returns (bool) { - return _isEnteranceFeePaid[account]; + function isEnteranceFeePaid(address account) public view returns (bool) { + return _isEnteranceFeePaid[account]; }   function getFunderBalance(uint256 _projectID) @@ -856,7 +856,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index 8de73ef..6cddc89 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -211,7 +211,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 691c021..846ca76 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -466,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index efeab19..9ceea95 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index daa2296..d445e1f 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,9 +20,9 @@

- 86.59% + 87.8% Statements - 71/82 + 72/82
75% @@ -30,14 +30,14 @@

15/20

- 80% + 82.5% Functions - 32/40 + 33/40
- 82.8% + 83.87% Lines - 77/93 + 78/93
@@ -60,15 +60,15 @@

- - - + + + - - - - + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index cd08d61..e95a875 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,5 +1,5 @@ { -"contracts/FundProject.sol":{"l":{"55":3,"56":0,"57":3,"61":3,"62":3,"63":3,"71":3,"72":3,"73":3,"83":7,"84":0,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"102":0,"103":0,"104":0,"115":12,"116":14,"117":14,"119":14,"120":14,"121":4,"122":4,"128":4,"129":4,"130":1,"133":3,"134":3,"135":3,"137":3,"138":1,"139":1,"141":1,"142":1,"145":1,"146":0,"149":1,"151":2,"152":2,"157":8,"158":0,"160":8,"161":8,"166":2,"167":1,"168":1,"169":1,"172":1,"173":0,"175":1,"177":1,"186":4,"194":1,"202":7,"210":1,"218":0,"222":3,"230":3,"234":9,"238":0,"246":2,"254":0,"258":1,"266":0,"267":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"51":4,"52":1,"53":7,"54":1,"55":0,"56":3,"57":3,"58":9,"59":0,"60":2,"61":0,"62":1,"63":0,"64":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[1,1],"9":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":58,"column":4}}},"2":{"name":"constructor","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":64,"column":4}}},"3":{"name":"fund","line":69,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":4}}},"4":{"name":"apporoveFundingByDao","line":81,"loc":{"start":{"line":76,"column":4},"end":{"line":98,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":105,"column":4}}},"6":{"name":"checkUpkeep","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":125,"column":4}}},"7":{"name":"performUpkeep","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":154,"column":4}}},"8":{"name":"paySubmitFee","line":156,"loc":{"start":{"line":156,"column":4},"end":{"line":163,"column":4}}},"9":{"name":"withdrawFund","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":179,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":181,"loc":{"start":{"line":181,"column":4},"end":{"line":187,"column":4}}},"11":{"name":"_getHashOfProjectData","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":195,"column":4}}},"12":{"name":"_getProjectId","line":197,"loc":{"start":{"line":197,"column":4},"end":{"line":203,"column":4}}},"13":{"name":"_getBalanceOfProject","line":205,"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"15":{"name":"is_funding","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"16":{"name":"_getProjectStatus","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":231,"column":4}}},"17":{"name":"getEnteranceFee","line":233,"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":4}}},"19":{"name":"getFunderBalance","line":241,"loc":{"start":{"line":241,"column":4},"end":{"line":247,"column":4}}},"20":{"name":"getInvestedProjects","line":249,"loc":{"start":{"line":249,"column":4},"end":{"line":255,"column":4}}},"21":{"name":"getDaoPercentage","line":257,"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":4}}},"22":{"name":"getTimeleft","line":261,"loc":{"start":{"line":261,"column":4},"end":{"line":268,"column":4}}}},"statementMap":{"1":{"start":{"line":55,"column":8},"end":{"line":55,"column":2182}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":38}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":37}},"4":{"start":{"line":63,"column":8},"end":{"line":63,"column":35}},"5":{"start":{"line":71,"column":8},"end":{"line":71,"column":50}},"6":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"7":{"start":{"line":73,"column":8},"end":{"line":73,"column":49}},"8":{"start":{"line":83,"column":8},"end":{"line":83,"column":2951}},"9":{"start":{"line":86,"column":12},"end":{"line":86,"column":60}},"10":{"start":{"line":87,"column":12},"end":{"line":87,"column":77}},"11":{"start":{"line":88,"column":12},"end":{"line":88,"column":34}},"12":{"start":{"line":89,"column":12},"end":{"line":89,"column":67}},"13":{"start":{"line":90,"column":12},"end":{"line":90,"column":49}},"14":{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},"15":{"start":{"line":92,"column":12},"end":{"line":92,"column":64}},"16":{"start":{"line":93,"column":12},"end":{"line":93,"column":46}},"17":{"start":{"line":94,"column":12},"end":{"line":94,"column":39}},"18":{"start":{"line":95,"column":12},"end":{"line":95,"column":48}},"19":{"start":{"line":102,"column":8},"end":{"line":102,"column":43}},"20":{"start":{"line":103,"column":8},"end":{"line":103,"column":36}},"21":{"start":{"line":104,"column":8},"end":{"line":104,"column":71}},"22":{"start":{"line":115,"column":8},"end":{"line":115,"column":4138}},"23":{"start":{"line":116,"column":12},"end":{"line":116,"column":41}},"24":{"start":{"line":117,"column":12},"end":{"line":117,"column":4248}},"25":{"start":{"line":119,"column":12},"end":{"line":119,"column":50}},"26":{"start":{"line":120,"column":12},"end":{"line":120,"column":4395}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":48}},"28":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"29":{"start":{"line":129,"column":8},"end":{"line":129,"column":4648}},"30":{"start":{"line":133,"column":8},"end":{"line":133,"column":57}},"31":{"start":{"line":134,"column":8},"end":{"line":134,"column":36}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":43}},"33":{"start":{"line":137,"column":8},"end":{"line":137,"column":4881}},"34":{"start":{"line":138,"column":12},"end":{"line":138,"column":74}},"35":{"start":{"line":139,"column":12},"end":{"line":139,"column":5050}},"36":{"start":{"line":141,"column":12},"end":{"line":141,"column":38}},"37":{"start":{"line":142,"column":12},"end":{"line":142,"column":5188}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":5307}},"39":{"start":{"line":149,"column":12},"end":{"line":149,"column":53}},"40":{"start":{"line":151,"column":12},"end":{"line":151,"column":73}},"41":{"start":{"line":152,"column":12},"end":{"line":152,"column":48}},"42":{"start":{"line":157,"column":8},"end":{"line":157,"column":5679}},"43":{"start":{"line":160,"column":12},"end":{"line":160,"column":49}},"44":{"start":{"line":161,"column":12},"end":{"line":161,"column":45}},"45":{"start":{"line":166,"column":8},"end":{"line":166,"column":5959}},"46":{"start":{"line":167,"column":12},"end":{"line":167,"column":64}},"47":{"start":{"line":168,"column":12},"end":{"line":168,"column":46}},"48":{"start":{"line":169,"column":12},"end":{"line":169,"column":6163}},"49":{"start":{"line":172,"column":12},"end":{"line":172,"column":6274}},"50":{"start":{"line":175,"column":12},"end":{"line":175,"column":64}},"51":{"start":{"line":186,"column":8},"end":{"line":186,"column":43}},"52":{"start":{"line":194,"column":8},"end":{"line":194,"column":34}},"53":{"start":{"line":202,"column":8},"end":{"line":202,"column":41}},"54":{"start":{"line":210,"column":8},"end":{"line":210,"column":38}},"55":{"start":{"line":218,"column":8},"end":{"line":218,"column":50}},"56":{"start":{"line":222,"column":8},"end":{"line":222,"column":37}},"57":{"start":{"line":230,"column":8},"end":{"line":230,"column":48}},"58":{"start":{"line":234,"column":8},"end":{"line":234,"column":27}},"59":{"start":{"line":238,"column":8},"end":{"line":238,"column":43}},"60":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"61":{"start":{"line":254,"column":8},"end":{"line":254,"column":41}},"62":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"63":{"start":{"line":266,"column":8},"end":{"line":266,"column":72}},"64":{"start":{"line":267,"column":8},"end":{"line":267,"column":27}}},"branchMap":{"1":{"line":55,"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":8}},{"start":{"line":55,"column":8},"end":{"line":55,"column":8}}]},"2":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"3":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":12},"end":{"line":120,"column":12}},{"start":{"line":120,"column":12},"end":{"line":120,"column":12}}]},"4":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"5":{"line":137,"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":137,"column":8}},{"start":{"line":137,"column":8},"end":{"line":137,"column":8}}]},"6":{"line":145,"type":"if","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":12}},{"start":{"line":145,"column":12},"end":{"line":145,"column":12}}]},"7":{"line":157,"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":8}},{"start":{"line":157,"column":8},"end":{"line":157,"column":8}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":172,"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":172,"column":12}},{"start":{"line":172,"column":12},"end":{"line":172,"column":12}}]}}}, +"contracts/FundProject.sol":{"l":{"55":3,"56":0,"57":3,"61":3,"62":3,"63":3,"71":3,"72":3,"73":3,"83":7,"84":0,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"102":0,"103":0,"104":0,"115":12,"116":14,"117":14,"119":14,"120":14,"121":4,"122":4,"128":4,"129":4,"130":1,"133":3,"134":3,"135":3,"137":3,"138":1,"139":1,"141":1,"142":1,"145":1,"146":0,"149":1,"151":2,"152":2,"157":8,"158":0,"160":8,"161":8,"166":2,"167":1,"168":1,"169":1,"172":1,"173":0,"175":1,"177":1,"186":4,"194":1,"202":7,"210":1,"218":0,"222":3,"230":3,"234":9,"238":6,"246":2,"254":0,"258":1,"266":0,"267":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"51":4,"52":1,"53":7,"54":1,"55":0,"56":3,"57":3,"58":9,"59":6,"60":2,"61":0,"62":1,"63":0,"64":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[1,1],"9":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":6,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":58,"column":4}}},"2":{"name":"constructor","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":64,"column":4}}},"3":{"name":"fund","line":69,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":4}}},"4":{"name":"apporoveFundingByDao","line":81,"loc":{"start":{"line":76,"column":4},"end":{"line":98,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":105,"column":4}}},"6":{"name":"checkUpkeep","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":125,"column":4}}},"7":{"name":"performUpkeep","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":154,"column":4}}},"8":{"name":"paySubmitFee","line":156,"loc":{"start":{"line":156,"column":4},"end":{"line":163,"column":4}}},"9":{"name":"withdrawFund","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":179,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":181,"loc":{"start":{"line":181,"column":4},"end":{"line":187,"column":4}}},"11":{"name":"_getHashOfProjectData","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":195,"column":4}}},"12":{"name":"_getProjectId","line":197,"loc":{"start":{"line":197,"column":4},"end":{"line":203,"column":4}}},"13":{"name":"_getBalanceOfProject","line":205,"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"15":{"name":"is_funding","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"16":{"name":"_getProjectStatus","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":231,"column":4}}},"17":{"name":"getEnteranceFee","line":233,"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":4}}},"19":{"name":"getFunderBalance","line":241,"loc":{"start":{"line":241,"column":4},"end":{"line":247,"column":4}}},"20":{"name":"getInvestedProjects","line":249,"loc":{"start":{"line":249,"column":4},"end":{"line":255,"column":4}}},"21":{"name":"getDaoPercentage","line":257,"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":4}}},"22":{"name":"getTimeleft","line":261,"loc":{"start":{"line":261,"column":4},"end":{"line":268,"column":4}}}},"statementMap":{"1":{"start":{"line":55,"column":8},"end":{"line":55,"column":2182}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":38}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":37}},"4":{"start":{"line":63,"column":8},"end":{"line":63,"column":35}},"5":{"start":{"line":71,"column":8},"end":{"line":71,"column":50}},"6":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"7":{"start":{"line":73,"column":8},"end":{"line":73,"column":49}},"8":{"start":{"line":83,"column":8},"end":{"line":83,"column":2951}},"9":{"start":{"line":86,"column":12},"end":{"line":86,"column":60}},"10":{"start":{"line":87,"column":12},"end":{"line":87,"column":77}},"11":{"start":{"line":88,"column":12},"end":{"line":88,"column":34}},"12":{"start":{"line":89,"column":12},"end":{"line":89,"column":67}},"13":{"start":{"line":90,"column":12},"end":{"line":90,"column":49}},"14":{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},"15":{"start":{"line":92,"column":12},"end":{"line":92,"column":64}},"16":{"start":{"line":93,"column":12},"end":{"line":93,"column":46}},"17":{"start":{"line":94,"column":12},"end":{"line":94,"column":39}},"18":{"start":{"line":95,"column":12},"end":{"line":95,"column":48}},"19":{"start":{"line":102,"column":8},"end":{"line":102,"column":43}},"20":{"start":{"line":103,"column":8},"end":{"line":103,"column":36}},"21":{"start":{"line":104,"column":8},"end":{"line":104,"column":71}},"22":{"start":{"line":115,"column":8},"end":{"line":115,"column":4138}},"23":{"start":{"line":116,"column":12},"end":{"line":116,"column":41}},"24":{"start":{"line":117,"column":12},"end":{"line":117,"column":4248}},"25":{"start":{"line":119,"column":12},"end":{"line":119,"column":50}},"26":{"start":{"line":120,"column":12},"end":{"line":120,"column":4395}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":48}},"28":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"29":{"start":{"line":129,"column":8},"end":{"line":129,"column":4648}},"30":{"start":{"line":133,"column":8},"end":{"line":133,"column":57}},"31":{"start":{"line":134,"column":8},"end":{"line":134,"column":36}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":43}},"33":{"start":{"line":137,"column":8},"end":{"line":137,"column":4881}},"34":{"start":{"line":138,"column":12},"end":{"line":138,"column":74}},"35":{"start":{"line":139,"column":12},"end":{"line":139,"column":5050}},"36":{"start":{"line":141,"column":12},"end":{"line":141,"column":38}},"37":{"start":{"line":142,"column":12},"end":{"line":142,"column":5188}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":5307}},"39":{"start":{"line":149,"column":12},"end":{"line":149,"column":53}},"40":{"start":{"line":151,"column":12},"end":{"line":151,"column":73}},"41":{"start":{"line":152,"column":12},"end":{"line":152,"column":48}},"42":{"start":{"line":157,"column":8},"end":{"line":157,"column":5679}},"43":{"start":{"line":160,"column":12},"end":{"line":160,"column":49}},"44":{"start":{"line":161,"column":12},"end":{"line":161,"column":45}},"45":{"start":{"line":166,"column":8},"end":{"line":166,"column":5959}},"46":{"start":{"line":167,"column":12},"end":{"line":167,"column":64}},"47":{"start":{"line":168,"column":12},"end":{"line":168,"column":46}},"48":{"start":{"line":169,"column":12},"end":{"line":169,"column":6163}},"49":{"start":{"line":172,"column":12},"end":{"line":172,"column":6274}},"50":{"start":{"line":175,"column":12},"end":{"line":175,"column":64}},"51":{"start":{"line":186,"column":8},"end":{"line":186,"column":43}},"52":{"start":{"line":194,"column":8},"end":{"line":194,"column":34}},"53":{"start":{"line":202,"column":8},"end":{"line":202,"column":41}},"54":{"start":{"line":210,"column":8},"end":{"line":210,"column":38}},"55":{"start":{"line":218,"column":8},"end":{"line":218,"column":50}},"56":{"start":{"line":222,"column":8},"end":{"line":222,"column":37}},"57":{"start":{"line":230,"column":8},"end":{"line":230,"column":48}},"58":{"start":{"line":234,"column":8},"end":{"line":234,"column":27}},"59":{"start":{"line":238,"column":8},"end":{"line":238,"column":43}},"60":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"61":{"start":{"line":254,"column":8},"end":{"line":254,"column":41}},"62":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"63":{"start":{"line":266,"column":8},"end":{"line":266,"column":72}},"64":{"start":{"line":267,"column":8},"end":{"line":267,"column":27}}},"branchMap":{"1":{"line":55,"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":8}},{"start":{"line":55,"column":8},"end":{"line":55,"column":8}}]},"2":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"3":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":12},"end":{"line":120,"column":12}},{"start":{"line":120,"column":12},"end":{"line":120,"column":12}}]},"4":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"5":{"line":137,"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":137,"column":8}},{"start":{"line":137,"column":8},"end":{"line":137,"column":8}}]},"6":{"line":145,"type":"if","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":12}},{"start":{"line":145,"column":12},"end":{"line":145,"column":12}}]},"7":{"line":157,"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":8}},{"start":{"line":157,"column":8},"end":{"line":157,"column":8}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":172,"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":172,"column":12}},{"start":{"line":172,"column":12},"end":{"line":172,"column":12}}]}}}, "contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}}, "contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}}, "contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} diff --git a/coverage/index.html b/coverage/index.html index bea94cf..12c7067 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -20,9 +20,9 @@

- 86.59% + 87.8% Statements - 71/82 + 72/82
75% @@ -30,14 +30,14 @@

15/20

- 80% + 82.5% Functions - 32/40 + 33/40
- 82.8% + 83.87% Lines - 77/93 + 78/93
@@ -60,15 +60,15 @@

- - - + + + - - - - + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov-report/contracts/FundProject.sol.html b/coverage/lcov-report/contracts/FundProject.sol.html index 733b612..380db2b 100644 --- a/coverage/lcov-report/contracts/FundProject.sol.html +++ b/coverage/lcov-report/contracts/FundProject.sol.html @@ -20,9 +20,9 @@

- 87.5% + 89.06% Statements - 56/64 + 57/64
72.22% @@ -30,14 +30,14 @@

13/18

- 77.27% + 81.82% Functions - 17/22 + 18/22
- 82.43% + 83.78% Lines - 61/74 + 62/74
@@ -549,7 +549,7 @@

      -  +       @@ -817,8 +817,8 @@

return enteranceFee; }   - function isEnteranceFeePaid(address account) public view returns (bool) { - return _isEnteranceFeePaid[account]; + function isEnteranceFeePaid(address account) public view returns (bool) { + return _isEnteranceFeePaid[account]; }   function getFunderBalance(uint256 _projectID) @@ -856,7 +856,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index 8de73ef..6cddc89 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -211,7 +211,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 691c021..846ca76 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -466,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index efeab19..9ceea95 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index daa2296..d445e1f 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,9 +20,9 @@

- 86.59% + 87.8% Statements - 71/82 + 72/82
75% @@ -30,14 +30,14 @@

15/20

- 80% + 82.5% Functions - 32/40 + 33/40
- 82.8% + 83.87% Lines - 77/93 + 78/93
@@ -60,15 +60,15 @@

- - - + + + - - - - + + + + @@ -116,7 +116,7 @@

diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index bea94cf..12c7067 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -20,9 +20,9 @@

- 86.59% + 87.8% Statements - 71/82 + 72/82
75% @@ -30,14 +30,14 @@

15/20

- 80% + 82.5% Functions - 32/40 + 33/40
- 82.8% + 83.87% Lines - 77/93 + 78/93
@@ -60,15 +60,15 @@

- - - + + + - - - - + + + + @@ -77,7 +77,7 @@

diff --git a/coverage/lcov.info b/coverage/lcov.info index 6ef7d5d..339ffdc 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -23,7 +23,7 @@ FN:249,getInvestedProjects FN:257,getDaoPercentage FN:261,getTimeleft FNF:22 -FNH:17 +FNH:18 FNDA:3,isApporovedByDao FNDA:3,constructor FNDA:3,fund @@ -41,7 +41,7 @@ FNDA:0,_getFundingGoalAmount FNDA:3,is_funding FNDA:3,_getProjectStatus FNDA:9,getEnteranceFee -FNDA:0,isEnteranceFeePaid +FNDA:6,isEnteranceFeePaid FNDA:2,getFunderBalance FNDA:0,getInvestedProjects FNDA:1,getDaoPercentage @@ -114,14 +114,14 @@ DA:218,0 DA:222,3 DA:230,3 DA:234,9 -DA:238,0 +DA:238,6 DA:246,2 DA:254,0 DA:258,1 DA:266,0 DA:267,0 LF:74 -LH:61 +LH:62 BRDA:55,1,0,0 BRDA:55,1,1,3 BRDA:83,2,0,0 diff --git a/deployments/localhost/GovernanceToken.json b/deployments/localhost/GovernanceToken.json index 9bffa1b..f51ab4f 100644 --- a/deployments/localhost/GovernanceToken.json +++ b/deployments/localhost/GovernanceToken.json @@ -723,7 +723,7 @@ "transactionIndex": 0, "gasUsed": "3780772", "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000008000000000001000000000000000000000000000000000000020000000000000100000800000000000000000000000410000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000200000000000001000000000002000000008000000000020000000000000000000000000200000000000000000000000800000000000000000", - "blockHash": "0xf5b6ffe229ef04af108b10d2ee32208aec2c4ff9fbe572ebf8744c16113c025f", + "blockHash": "0x2af51296db5025865c915e1643b65de8185d747daa680a993fba3c246b06d241", "transactionHash": "0x745d50d0f658a5611f2854d91471338015130866cba8356c1c6c5ac37f12c5d9", "logs": [ { @@ -738,7 +738,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0xf5b6ffe229ef04af108b10d2ee32208aec2c4ff9fbe572ebf8744c16113c025f" + "blockHash": "0x2af51296db5025865c915e1643b65de8185d747daa680a993fba3c246b06d241" }, { "transactionIndex": 0, @@ -752,7 +752,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 1, - "blockHash": "0xf5b6ffe229ef04af108b10d2ee32208aec2c4ff9fbe572ebf8744c16113c025f" + "blockHash": "0x2af51296db5025865c915e1643b65de8185d747daa680a993fba3c246b06d241" }, { "transactionIndex": 0, @@ -766,7 +766,7 @@ ], "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", "logIndex": 2, - "blockHash": "0xf5b6ffe229ef04af108b10d2ee32208aec2c4ff9fbe572ebf8744c16113c025f" + "blockHash": "0x2af51296db5025865c915e1643b65de8185d747daa680a993fba3c246b06d241" } ], "blockNumber": 2, diff --git a/deployments/localhost/GovernerContract.json b/deployments/localhost/GovernerContract.json index ef40a69..82bac57 100644 --- a/deployments/localhost/GovernerContract.json +++ b/deployments/localhost/GovernerContract.json @@ -2081,7 +2081,7 @@ "transactionIndex": 0, "gasUsed": "8307777", "logsBloom": "0x00000000000000000100000000001000000000000000000000800000000008000000000000000000000000000010080000000000000000000000000000000001000000000000000000000000000000000001000000000000000010000000000000000000020000080002000100000800000000000000000000000000000000401000002008000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000002000000000000000000000200000000000000000000000003000000000080000800020000000000000000000000000000000000000000000000000000000000000002000", - "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace", + "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6", "transactionHash": "0xf68e1e809d1243d90ad59a190682a582de34f34cced6bf36beb17591945f556d", "logs": [ { @@ -2094,7 +2094,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 0, - "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" + "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" }, { "transactionIndex": 0, @@ -2106,7 +2106,7 @@ ], "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8", "logIndex": 1, - "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" + "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" }, { "transactionIndex": 0, @@ -2118,7 +2118,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 2, - "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" + "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" }, { "transactionIndex": 0, @@ -2130,7 +2130,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 3, - "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" + "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" }, { "transactionIndex": 0, @@ -2142,7 +2142,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3", "logIndex": 4, - "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" + "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" }, { "transactionIndex": 0, @@ -2156,7 +2156,7 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0xd882a9144d59aecff5f1a935366b8f1b7e6568a8b96df893665918527c77cace" + "blockHash": "0x3f10a4b305c8425fc43dcef70fcaf76e92fa36939af879465d806668010d20f6" } ], "blockNumber": 4, diff --git a/deployments/localhost/TimeLock.json b/deployments/localhost/TimeLock.json index b11de39..1fbd716 100644 --- a/deployments/localhost/TimeLock.json +++ b/deployments/localhost/TimeLock.json @@ -875,7 +875,7 @@ "transactionIndex": 0, "gasUsed": "3021451", "logsBloom": "0x000000040000000008000000000000000a0000000000000000000000000000000000000000000000000000000001000000000000000000000200000010200000000000000000000000000010000000000000000000000000000000000001000000000040020000400000000100800800000004000000000000020000000000000000000000000000000000000000000000000000000000080000000200000000000000000020000000000000000000000000000000000000001000000000000000000040000000204000000000000000000200002008000100000100200020000000000000001000000000000000000000000000000000000000000000000000", - "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13", + "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a", "transactionHash": "0x2fdcb9bd387bb1db55e716d8e921c02ad2ee4560cc760c38f1438e106df63d44", "logs": [ { @@ -891,7 +891,7 @@ ], "data": "0x", "logIndex": 0, - "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" + "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" }, { "transactionIndex": 0, @@ -906,7 +906,7 @@ ], "data": "0x", "logIndex": 1, - "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" + "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" }, { "transactionIndex": 0, @@ -921,7 +921,7 @@ ], "data": "0x", "logIndex": 2, - "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" + "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" }, { "transactionIndex": 0, @@ -936,7 +936,7 @@ ], "data": "0x", "logIndex": 3, - "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" + "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" }, { "transactionIndex": 0, @@ -951,7 +951,7 @@ ], "data": "0x", "logIndex": 4, - "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" + "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" }, { "transactionIndex": 0, @@ -966,7 +966,7 @@ ], "data": "0x", "logIndex": 5, - "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" + "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" }, { "transactionIndex": 0, @@ -978,7 +978,7 @@ ], "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "logIndex": 6, - "blockHash": "0x91a55c0f59b80919ddea2d170f6e98a83b8c48a1c5ee3d14896a75b6b5c6af13" + "blockHash": "0x0ea14841d3aa7ec2c2f5c968e5f029b7c8e4e8088e689938b2d7c71c0fdbd25a" } ], "blockNumber": 1, diff --git a/proposals.json b/proposals.json index 2e2a44c..3e6c757 100644 --- a/proposals.json +++ b/proposals.json @@ -1 +1 @@ -{"31337":["99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927"]} \ No newline at end of file +{"31337":["99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927","99966883216571458440169013809788587697246968345487969070787258353943787317927"]} \ No newline at end of file diff --git a/scripts/del.js b/scripts/del.js index 59c9bcf..fbc5608 100644 --- a/scripts/del.js +++ b/scripts/del.js @@ -25,6 +25,23 @@ async function vote() { await invTx.wait(1); console.log((await governor.getFunderBalance(investor)).toString()); console.log((await governor._getBalanceOfProject(projectId)).toString()); + await moveTime(s_fundingTime + 1); + await moveBlocks(1); + + const tx = await governor.performUpkeep( + ethers.utils.hexZeroPad(ethers.utils.hexlify(projectId), 32) + ); + + console.log( + ` Project status: ${await governor._getProjectStatus(projectId)}` + ); + console.log( + `Balance of project: ${( + await governor._getBalanceOfProject(projectId) + ).toString()}` + ); + + console.log((await provider.getBalance(account2node)).toString()); } vote() From 35bdfabbc984acfaf45279c55b7c9aad31c88152 Mon Sep 17 00:00:00 2001 From: Furkan Sezal Date: Sun, 13 Nov 2022 21:54:16 +0300 Subject: [PATCH 23/28] Fix bugs update code v1. --- .gitignore | 5 +- contracts/FundProject.sol | 31 ++- coverage.json | 2 +- coverage/contracts/FundProject.sol.html | 100 +++++--- coverage/contracts/GovernanceToken.sol.html | 2 +- coverage/contracts/GovernerContract.sol.html | 6 +- coverage/contracts/TimeLock.sol.html | 2 +- coverage/contracts/index.html | 36 +-- coverage/coverage-final.json | 4 +- coverage/index.html | 36 +-- .../contracts/FundProject.sol.html | 100 +++++--- .../contracts/GovernanceToken.sol.html | 2 +- .../contracts/GovernerContract.sol.html | 6 +- .../lcov-report/contracts/TimeLock.sol.html | 2 +- coverage/lcov-report/contracts/index.html | 36 +-- coverage/lcov-report/index.html | 36 +-- coverage/lcov.info | 228 +++++++++--------- hardhat.config.js | 23 +- helper-config.js | 4 +- proposals.json | 2 +- readme.md | 5 - test/staging/dao.staging.test.js | 177 ++++++++++++++ test/unit/{dao.test.js => dao.unit.test.js} | 79 +++--- ...ract.test.js => fundContract.unit.test.js} | 82 +++++-- 24 files changed, 682 insertions(+), 324 deletions(-) delete mode 100644 readme.md create mode 100644 test/staging/dao.staging.test.js rename test/unit/{dao.test.js => dao.unit.test.js} (92%) rename test/unit/{fundContract.test.js => fundContract.unit.test.js} (78%) diff --git a/.gitignore b/.gitignore index 5f3851c..0cba3b1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,7 @@ node_modules propose.js queue-and-execute.js submit.js -05-deploy-fundProject.js \ No newline at end of file +05-deploy-fundProject.js +readOnlyMe.md +coverage +deployments \ No newline at end of file diff --git a/contracts/FundProject.sol b/contracts/FundProject.sol index d108d3a..e2b59d9 100644 --- a/contracts/FundProject.sol +++ b/contracts/FundProject.sol @@ -41,6 +41,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus; mapping(address => bool) public _isEnteranceFeePaid; mapping(address => uint256[]) public investedProjects; // investor address => investedProjects + mapping(uint256 => address) public projectOwnerAddressIndex; event projectSuccessfullyFunded(uint256 indexed _projectId); event projectFundingFailed(uint256 indexed _projectId); @@ -77,10 +78,14 @@ contract FundProject is Ownable, AutomationCompatibleInterface { string memory _ipfsHash, uint256 _fundingGoalAmount, uint256 _time, - address _projectOwnerAddress + uint256 _projectOwnerAddressIndex ) external onlyOwner { // only dao can call it - if (!_isEnteranceFeePaid[_projectOwnerAddress]) { + if ( + !_isEnteranceFeePaid[ + projectOwnerAddressIndex[_projectOwnerAddressIndex] + ] + ) { revert FundProject__EnteranceFeeNeeded(); } else { projectToTime[projectId][_time] = block.timestamp; @@ -89,7 +94,9 @@ contract FundProject is Ownable, AutomationCompatibleInterface { projectFundingGoalAmount[projectId] = _fundingGoalAmount; hashToProjectId[_ipfsHash] = projectId; idToHash[projectId] = _ipfsHash; - projectOwnerAddress[projectId] = _projectOwnerAddress; + projectOwnerAddress[projectId] = projectOwnerAddressIndex[ + _projectOwnerAddressIndex + ]; _isApporovedByDao[projectId] = true; _isFunding[projectId] = true; emit projectGoesToFunding(projectId); @@ -112,13 +119,14 @@ contract FundProject is Ownable, AutomationCompatibleInterface { override returns (bool upkeepNeeded, bytes memory performData) { - for (uint i = 1; i <= projectId; i++) { - if (_isFunding[i]) { + for (uint projectIndex = 1; projectIndex <= projectId; projectIndex++) { + if (_isFunding[projectIndex]) { bool timePassed = (block.timestamp - - (projectToTime[i][time[i]])) > time[i]; + (projectToTime[projectIndex][time[projectIndex]])) > + time[projectIndex]; upkeepNeeded = (timePassed); if (upkeepNeeded) { - performData = abi.encodePacked(i); + performData = abi.encodePacked(projectIndex); break; } } @@ -137,8 +145,8 @@ contract FundProject is Ownable, AutomationCompatibleInterface { if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) { _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS; - uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) / - 100; + uint256 fundsToSent = (projectFunds[ProjectId] * + (100 - daoPercentage)) / 100; projectFunds[ProjectId] = 0; (bool success, ) = (projectOwnerAddress[ProjectId]).call{ value: fundsToSent @@ -159,6 +167,7 @@ contract FundProject is Ownable, AutomationCompatibleInterface { revert FundProject__NotEnoughPayment(); } else { _isEnteranceFeePaid[msg.sender] = true; + projectOwnerAddressIndex[projectId] = msg.sender; emit enteranceFeePaid(msg.sender); } } @@ -267,4 +276,8 @@ contract FundProject is Ownable, AutomationCompatibleInterface { a = block.timestamp - projectToTime[_projectID][time[_projectID]]; b = time[_projectID]; } + + function getCurrentProjectId() public view returns (uint256) { + return projectId; + } } diff --git a/coverage.json b/coverage.json index 2c49b16..2743cfc 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"contracts/FundProject.sol":{"l":{"55":3,"56":0,"57":3,"61":3,"62":3,"63":3,"71":3,"72":3,"73":3,"83":7,"84":0,"86":7,"87":7,"88":7,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"102":0,"103":0,"104":0,"115":12,"116":14,"117":14,"119":14,"120":14,"121":4,"122":4,"128":4,"129":4,"130":1,"133":3,"134":3,"135":3,"137":3,"138":1,"139":1,"141":1,"142":1,"145":1,"146":0,"149":1,"151":2,"152":2,"157":8,"158":0,"160":8,"161":8,"166":2,"167":1,"168":1,"169":1,"172":1,"173":0,"175":1,"177":1,"186":4,"194":1,"202":7,"210":1,"218":0,"222":3,"230":3,"234":9,"238":6,"246":2,"254":0,"258":1,"266":0,"267":0},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":14,"25":14,"26":14,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"51":4,"52":1,"53":7,"54":1,"55":0,"56":3,"57":3,"58":9,"59":6,"60":2,"61":0,"62":1,"63":0,"64":0},"b":{"1":[0,3],"2":[0,7],"3":[4,10],"4":[1,3],"5":[1,2],"6":[0,1],"7":[0,8],"8":[1,1],"9":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":6,"19":2,"20":0,"21":1,"22":0},"fnMap":{"1":{"name":"isApporovedByDao","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":58,"column":4}}},"2":{"name":"constructor","line":60,"loc":{"start":{"line":60,"column":4},"end":{"line":64,"column":4}}},"3":{"name":"fund","line":69,"loc":{"start":{"line":66,"column":4},"end":{"line":74,"column":4}}},"4":{"name":"apporoveFundingByDao","line":81,"loc":{"start":{"line":76,"column":4},"end":{"line":98,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":100,"loc":{"start":{"line":100,"column":4},"end":{"line":105,"column":4}}},"6":{"name":"checkUpkeep","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":125,"column":4}}},"7":{"name":"performUpkeep","line":127,"loc":{"start":{"line":127,"column":4},"end":{"line":154,"column":4}}},"8":{"name":"paySubmitFee","line":156,"loc":{"start":{"line":156,"column":4},"end":{"line":163,"column":4}}},"9":{"name":"withdrawFund","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":179,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":181,"loc":{"start":{"line":181,"column":4},"end":{"line":187,"column":4}}},"11":{"name":"_getHashOfProjectData","line":189,"loc":{"start":{"line":189,"column":4},"end":{"line":195,"column":4}}},"12":{"name":"_getProjectId","line":197,"loc":{"start":{"line":197,"column":4},"end":{"line":203,"column":4}}},"13":{"name":"_getBalanceOfProject","line":205,"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":213,"loc":{"start":{"line":213,"column":4},"end":{"line":219,"column":4}}},"15":{"name":"is_funding","line":221,"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":4}}},"16":{"name":"_getProjectStatus","line":225,"loc":{"start":{"line":225,"column":4},"end":{"line":231,"column":4}}},"17":{"name":"getEnteranceFee","line":233,"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":237,"loc":{"start":{"line":237,"column":4},"end":{"line":239,"column":4}}},"19":{"name":"getFunderBalance","line":241,"loc":{"start":{"line":241,"column":4},"end":{"line":247,"column":4}}},"20":{"name":"getInvestedProjects","line":249,"loc":{"start":{"line":249,"column":4},"end":{"line":255,"column":4}}},"21":{"name":"getDaoPercentage","line":257,"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":4}}},"22":{"name":"getTimeleft","line":261,"loc":{"start":{"line":261,"column":4},"end":{"line":268,"column":4}}}},"statementMap":{"1":{"start":{"line":55,"column":8},"end":{"line":55,"column":2182}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":38}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":37}},"4":{"start":{"line":63,"column":8},"end":{"line":63,"column":35}},"5":{"start":{"line":71,"column":8},"end":{"line":71,"column":50}},"6":{"start":{"line":72,"column":8},"end":{"line":72,"column":43}},"7":{"start":{"line":73,"column":8},"end":{"line":73,"column":49}},"8":{"start":{"line":83,"column":8},"end":{"line":83,"column":2951}},"9":{"start":{"line":86,"column":12},"end":{"line":86,"column":60}},"10":{"start":{"line":87,"column":12},"end":{"line":87,"column":77}},"11":{"start":{"line":88,"column":12},"end":{"line":88,"column":34}},"12":{"start":{"line":89,"column":12},"end":{"line":89,"column":67}},"13":{"start":{"line":90,"column":12},"end":{"line":90,"column":49}},"14":{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},"15":{"start":{"line":92,"column":12},"end":{"line":92,"column":64}},"16":{"start":{"line":93,"column":12},"end":{"line":93,"column":46}},"17":{"start":{"line":94,"column":12},"end":{"line":94,"column":39}},"18":{"start":{"line":95,"column":12},"end":{"line":95,"column":48}},"19":{"start":{"line":102,"column":8},"end":{"line":102,"column":43}},"20":{"start":{"line":103,"column":8},"end":{"line":103,"column":36}},"21":{"start":{"line":104,"column":8},"end":{"line":104,"column":71}},"22":{"start":{"line":115,"column":8},"end":{"line":115,"column":4138}},"23":{"start":{"line":116,"column":12},"end":{"line":116,"column":41}},"24":{"start":{"line":117,"column":12},"end":{"line":117,"column":4248}},"25":{"start":{"line":119,"column":12},"end":{"line":119,"column":50}},"26":{"start":{"line":120,"column":12},"end":{"line":120,"column":4395}},"27":{"start":{"line":121,"column":16},"end":{"line":121,"column":48}},"28":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"29":{"start":{"line":129,"column":8},"end":{"line":129,"column":4648}},"30":{"start":{"line":133,"column":8},"end":{"line":133,"column":57}},"31":{"start":{"line":134,"column":8},"end":{"line":134,"column":36}},"32":{"start":{"line":135,"column":8},"end":{"line":135,"column":43}},"33":{"start":{"line":137,"column":8},"end":{"line":137,"column":4881}},"34":{"start":{"line":138,"column":12},"end":{"line":138,"column":74}},"35":{"start":{"line":139,"column":12},"end":{"line":139,"column":5050}},"36":{"start":{"line":141,"column":12},"end":{"line":141,"column":38}},"37":{"start":{"line":142,"column":12},"end":{"line":142,"column":5188}},"38":{"start":{"line":145,"column":12},"end":{"line":145,"column":5307}},"39":{"start":{"line":149,"column":12},"end":{"line":149,"column":53}},"40":{"start":{"line":151,"column":12},"end":{"line":151,"column":73}},"41":{"start":{"line":152,"column":12},"end":{"line":152,"column":48}},"42":{"start":{"line":157,"column":8},"end":{"line":157,"column":5679}},"43":{"start":{"line":160,"column":12},"end":{"line":160,"column":49}},"44":{"start":{"line":161,"column":12},"end":{"line":161,"column":45}},"45":{"start":{"line":166,"column":8},"end":{"line":166,"column":5959}},"46":{"start":{"line":167,"column":12},"end":{"line":167,"column":64}},"47":{"start":{"line":168,"column":12},"end":{"line":168,"column":46}},"48":{"start":{"line":169,"column":12},"end":{"line":169,"column":6163}},"49":{"start":{"line":172,"column":12},"end":{"line":172,"column":6274}},"50":{"start":{"line":175,"column":12},"end":{"line":175,"column":64}},"51":{"start":{"line":186,"column":8},"end":{"line":186,"column":43}},"52":{"start":{"line":194,"column":8},"end":{"line":194,"column":34}},"53":{"start":{"line":202,"column":8},"end":{"line":202,"column":41}},"54":{"start":{"line":210,"column":8},"end":{"line":210,"column":38}},"55":{"start":{"line":218,"column":8},"end":{"line":218,"column":50}},"56":{"start":{"line":222,"column":8},"end":{"line":222,"column":37}},"57":{"start":{"line":230,"column":8},"end":{"line":230,"column":48}},"58":{"start":{"line":234,"column":8},"end":{"line":234,"column":27}},"59":{"start":{"line":238,"column":8},"end":{"line":238,"column":43}},"60":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"61":{"start":{"line":254,"column":8},"end":{"line":254,"column":41}},"62":{"start":{"line":258,"column":8},"end":{"line":258,"column":28}},"63":{"start":{"line":266,"column":8},"end":{"line":266,"column":72}},"64":{"start":{"line":267,"column":8},"end":{"line":267,"column":27}}},"branchMap":{"1":{"line":55,"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":8}},{"start":{"line":55,"column":8},"end":{"line":55,"column":8}}]},"2":{"line":83,"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":8}},{"start":{"line":83,"column":8},"end":{"line":83,"column":8}}]},"3":{"line":120,"type":"if","locations":[{"start":{"line":120,"column":12},"end":{"line":120,"column":12}},{"start":{"line":120,"column":12},"end":{"line":120,"column":12}}]},"4":{"line":129,"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":129,"column":8}},{"start":{"line":129,"column":8},"end":{"line":129,"column":8}}]},"5":{"line":137,"type":"if","locations":[{"start":{"line":137,"column":8},"end":{"line":137,"column":8}},{"start":{"line":137,"column":8},"end":{"line":137,"column":8}}]},"6":{"line":145,"type":"if","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":12}},{"start":{"line":145,"column":12},"end":{"line":145,"column":12}}]},"7":{"line":157,"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":8}},{"start":{"line":157,"column":8},"end":{"line":157,"column":8}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":172,"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":172,"column":12}},{"start":{"line":172,"column":12},"end":{"line":172,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":16,"89":8,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":16,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[8,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":16,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file +{"contracts/FundProject.sol":{"l":{"56":3,"57":0,"58":3,"62":3,"63":3,"64":3,"72":3,"73":3,"74":3,"84":7,"89":0,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"97":7,"100":7,"101":7,"102":7,"103":7,"109":0,"110":0,"111":0,"122":12,"123":14,"124":6,"127":6,"128":6,"129":4,"130":4,"137":4,"138":4,"139":1,"142":3,"143":3,"144":3,"146":3,"147":1,"148":1,"150":1,"151":1,"154":1,"155":0,"158":1,"160":2,"161":2,"166":8,"167":0,"169":8,"170":8,"171":8,"176":2,"177":1,"178":1,"179":1,"182":1,"183":0,"185":1,"187":1,"196":4,"204":1,"212":7,"220":1,"228":0,"232":3,"240":3,"244":9,"248":0,"256":2,"264":0,"268":1,"276":0,"277":0,"281":9},"path":"/home/furkansezal/dao/contracts/FundProject.sol","s":{"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":7,"18":7,"19":0,"20":0,"21":0,"22":12,"23":14,"24":6,"25":6,"26":6,"27":4,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":2,"41":2,"42":8,"43":8,"44":8,"45":8,"46":2,"47":1,"48":1,"49":1,"50":1,"51":1,"52":4,"53":1,"54":7,"55":1,"56":0,"57":3,"58":3,"59":9,"60":0,"61":2,"62":0,"63":1,"64":0,"65":0,"66":9},"b":{"1":[0,3],"2":[0,7],"3":[6,8],"4":[4,2],"5":[1,3],"6":[1,2],"7":[0,1],"8":[0,8],"9":[1,1],"10":[0,1]},"f":{"1":3,"2":3,"3":3,"4":7,"5":0,"6":12,"7":4,"8":8,"9":2,"10":4,"11":1,"12":7,"13":1,"14":0,"15":3,"16":3,"17":9,"18":0,"19":2,"20":0,"21":1,"22":0,"23":9},"fnMap":{"1":{"name":"isApporovedByDao","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":4}}},"2":{"name":"constructor","line":61,"loc":{"start":{"line":61,"column":4},"end":{"line":65,"column":4}}},"3":{"name":"fund","line":70,"loc":{"start":{"line":67,"column":4},"end":{"line":75,"column":4}}},"4":{"name":"apporoveFundingByDao","line":82,"loc":{"start":{"line":77,"column":4},"end":{"line":105,"column":4}}},"5":{"name":"cancelApporovelFundingByDao","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":112,"column":4}}},"6":{"name":"checkUpkeep","line":114,"loc":{"start":{"line":114,"column":4},"end":{"line":134,"column":4}}},"7":{"name":"performUpkeep","line":136,"loc":{"start":{"line":136,"column":4},"end":{"line":163,"column":4}}},"8":{"name":"paySubmitFee","line":165,"loc":{"start":{"line":165,"column":4},"end":{"line":173,"column":4}}},"9":{"name":"withdrawFund","line":175,"loc":{"start":{"line":175,"column":4},"end":{"line":189,"column":4}}},"10":{"name":"_isApporoveFundingByDao","line":191,"loc":{"start":{"line":191,"column":4},"end":{"line":197,"column":4}}},"11":{"name":"_getHashOfProjectData","line":199,"loc":{"start":{"line":199,"column":4},"end":{"line":205,"column":4}}},"12":{"name":"_getProjectId","line":207,"loc":{"start":{"line":207,"column":4},"end":{"line":213,"column":4}}},"13":{"name":"_getBalanceOfProject","line":215,"loc":{"start":{"line":215,"column":4},"end":{"line":221,"column":4}}},"14":{"name":"_getFundingGoalAmount","line":223,"loc":{"start":{"line":223,"column":4},"end":{"line":229,"column":4}}},"15":{"name":"is_funding","line":231,"loc":{"start":{"line":231,"column":4},"end":{"line":233,"column":4}}},"16":{"name":"_getProjectStatus","line":235,"loc":{"start":{"line":235,"column":4},"end":{"line":241,"column":4}}},"17":{"name":"getEnteranceFee","line":243,"loc":{"start":{"line":243,"column":4},"end":{"line":245,"column":4}}},"18":{"name":"isEnteranceFeePaid","line":247,"loc":{"start":{"line":247,"column":4},"end":{"line":249,"column":4}}},"19":{"name":"getFunderBalance","line":251,"loc":{"start":{"line":251,"column":4},"end":{"line":257,"column":4}}},"20":{"name":"getInvestedProjects","line":259,"loc":{"start":{"line":259,"column":4},"end":{"line":265,"column":4}}},"21":{"name":"getDaoPercentage","line":267,"loc":{"start":{"line":267,"column":4},"end":{"line":269,"column":4}}},"22":{"name":"getTimeleft","line":271,"loc":{"start":{"line":271,"column":4},"end":{"line":278,"column":4}}},"23":{"name":"getCurrentProjectId","line":280,"loc":{"start":{"line":280,"column":4},"end":{"line":282,"column":4}}}},"statementMap":{"1":{"start":{"line":56,"column":8},"end":{"line":56,"column":2247}},"2":{"start":{"line":62,"column":8},"end":{"line":62,"column":38}},"3":{"start":{"line":63,"column":8},"end":{"line":63,"column":37}},"4":{"start":{"line":64,"column":8},"end":{"line":64,"column":35}},"5":{"start":{"line":72,"column":8},"end":{"line":72,"column":50}},"6":{"start":{"line":73,"column":8},"end":{"line":73,"column":43}},"7":{"start":{"line":74,"column":8},"end":{"line":74,"column":49}},"8":{"start":{"line":84,"column":8},"end":{"line":84,"column":3021}},"9":{"start":{"line":91,"column":12},"end":{"line":91,"column":60}},"10":{"start":{"line":92,"column":12},"end":{"line":92,"column":77}},"11":{"start":{"line":93,"column":12},"end":{"line":93,"column":34}},"12":{"start":{"line":94,"column":12},"end":{"line":94,"column":67}},"13":{"start":{"line":95,"column":12},"end":{"line":95,"column":49}},"14":{"start":{"line":96,"column":12},"end":{"line":96,"column":42}},"15":{"start":{"line":97,"column":12},"end":{"line":97,"column":3588}},"16":{"start":{"line":100,"column":12},"end":{"line":100,"column":46}},"17":{"start":{"line":101,"column":12},"end":{"line":101,"column":39}},"18":{"start":{"line":102,"column":12},"end":{"line":102,"column":48}},"19":{"start":{"line":109,"column":8},"end":{"line":109,"column":43}},"20":{"start":{"line":110,"column":8},"end":{"line":110,"column":36}},"21":{"start":{"line":111,"column":8},"end":{"line":111,"column":71}},"22":{"start":{"line":122,"column":8},"end":{"line":122,"column":4352}},"23":{"start":{"line":123,"column":12},"end":{"line":123,"column":4441}},"24":{"start":{"line":124,"column":16},"end":{"line":124,"column":4515}},"25":{"start":{"line":127,"column":16},"end":{"line":127,"column":42}},"26":{"start":{"line":128,"column":16},"end":{"line":128,"column":4704}},"27":{"start":{"line":129,"column":20},"end":{"line":129,"column":63}},"28":{"start":{"line":137,"column":8},"end":{"line":137,"column":47}},"29":{"start":{"line":138,"column":8},"end":{"line":138,"column":4990}},"30":{"start":{"line":142,"column":8},"end":{"line":142,"column":57}},"31":{"start":{"line":143,"column":8},"end":{"line":143,"column":36}},"32":{"start":{"line":144,"column":8},"end":{"line":144,"column":43}},"33":{"start":{"line":146,"column":8},"end":{"line":146,"column":5223}},"34":{"start":{"line":147,"column":12},"end":{"line":147,"column":74}},"35":{"start":{"line":148,"column":12},"end":{"line":148,"column":5417}},"36":{"start":{"line":150,"column":12},"end":{"line":150,"column":38}},"37":{"start":{"line":151,"column":12},"end":{"line":151,"column":5538}},"38":{"start":{"line":154,"column":12},"end":{"line":154,"column":5657}},"39":{"start":{"line":158,"column":12},"end":{"line":158,"column":53}},"40":{"start":{"line":160,"column":12},"end":{"line":160,"column":73}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":48}},"42":{"start":{"line":166,"column":8},"end":{"line":166,"column":6029}},"43":{"start":{"line":169,"column":12},"end":{"line":169,"column":49}},"44":{"start":{"line":170,"column":12},"end":{"line":170,"column":59}},"45":{"start":{"line":171,"column":12},"end":{"line":171,"column":45}},"46":{"start":{"line":176,"column":8},"end":{"line":176,"column":6371}},"47":{"start":{"line":177,"column":12},"end":{"line":177,"column":64}},"48":{"start":{"line":178,"column":12},"end":{"line":178,"column":46}},"49":{"start":{"line":179,"column":12},"end":{"line":179,"column":6575}},"50":{"start":{"line":182,"column":12},"end":{"line":182,"column":6686}},"51":{"start":{"line":185,"column":12},"end":{"line":185,"column":64}},"52":{"start":{"line":196,"column":8},"end":{"line":196,"column":43}},"53":{"start":{"line":204,"column":8},"end":{"line":204,"column":34}},"54":{"start":{"line":212,"column":8},"end":{"line":212,"column":41}},"55":{"start":{"line":220,"column":8},"end":{"line":220,"column":38}},"56":{"start":{"line":228,"column":8},"end":{"line":228,"column":50}},"57":{"start":{"line":232,"column":8},"end":{"line":232,"column":37}},"58":{"start":{"line":240,"column":8},"end":{"line":240,"column":48}},"59":{"start":{"line":244,"column":8},"end":{"line":244,"column":27}},"60":{"start":{"line":248,"column":8},"end":{"line":248,"column":43}},"61":{"start":{"line":256,"column":8},"end":{"line":256,"column":46}},"62":{"start":{"line":264,"column":8},"end":{"line":264,"column":41}},"63":{"start":{"line":268,"column":8},"end":{"line":268,"column":28}},"64":{"start":{"line":276,"column":8},"end":{"line":276,"column":72}},"65":{"start":{"line":277,"column":8},"end":{"line":277,"column":27}},"66":{"start":{"line":281,"column":8},"end":{"line":281,"column":24}}},"branchMap":{"1":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":8}},{"start":{"line":56,"column":8},"end":{"line":56,"column":8}}]},"2":{"line":84,"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":8}},{"start":{"line":84,"column":8},"end":{"line":84,"column":8}}]},"3":{"line":123,"type":"if","locations":[{"start":{"line":123,"column":12},"end":{"line":123,"column":12}},{"start":{"line":123,"column":12},"end":{"line":123,"column":12}}]},"4":{"line":128,"type":"if","locations":[{"start":{"line":128,"column":16},"end":{"line":128,"column":16}},{"start":{"line":128,"column":16},"end":{"line":128,"column":16}}]},"5":{"line":138,"type":"if","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":8}},{"start":{"line":138,"column":8},"end":{"line":138,"column":8}}]},"6":{"line":146,"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":146,"column":8}},{"start":{"line":146,"column":8},"end":{"line":146,"column":8}}]},"7":{"line":154,"type":"if","locations":[{"start":{"line":154,"column":12},"end":{"line":154,"column":12}},{"start":{"line":154,"column":12},"end":{"line":154,"column":12}}]},"8":{"line":166,"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":8}},{"start":{"line":166,"column":8},"end":{"line":166,"column":8}}]},"9":{"line":176,"type":"if","locations":[{"start":{"line":176,"column":8},"end":{"line":176,"column":8}},{"start":{"line":176,"column":8},"end":{"line":176,"column":8}}]},"10":{"line":182,"type":"if","locations":[{"start":{"line":182,"column":12},"end":{"line":182,"column":12}},{"start":{"line":182,"column":12},"end":{"line":182,"column":12}}]}}},"contracts/GovernanceToken.sol":{"l":{"20":3,"28":31,"29":31,"37":3,"41":0,"45":1,"52":1},"path":"/home/furkansezal/dao/contracts/GovernanceToken.sol","s":{"1":3,"2":31,"3":31,"4":3,"5":0,"6":1,"7":1},"b":{},"f":{"1":3,"2":31,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"constructor","line":18,"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":4}}},"2":{"name":"_afterTokenTransfer","line":23,"loc":{"start":{"line":23,"column":4},"end":{"line":30,"column":4}}},"3":{"name":"_mint","line":35,"loc":{"start":{"line":32,"column":4},"end":{"line":38,"column":4}}},"4":{"name":"mintToken","line":40,"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":4}}},"5":{"name":"burnToken","line":44,"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":4}}},"6":{"name":"_burn","line":48,"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":4}}}},"statementMap":{"1":{"start":{"line":20,"column":8},"end":{"line":20,"column":41}},"2":{"start":{"line":28,"column":8},"end":{"line":28,"column":50}},"3":{"start":{"line":29,"column":8},"end":{"line":29,"column":44}},"4":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"5":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"6":{"start":{"line":45,"column":8},"end":{"line":45,"column":29}},"7":{"start":{"line":52,"column":8},"end":{"line":52,"column":35}}},"branchMap":{}},"contracts/GovernerContract.sol":{"l":{"52":8,"61":8,"70":24,"79":50,"88":10,"89":2,"91":8,"100":8,"110":7,"119":0,"128":14,"137":0},"path":"/home/furkansezal/dao/contracts/GovernerContract.sol","s":{"1":8,"2":8,"3":24,"4":50,"5":10,"6":8,"7":8,"8":7,"9":0,"10":14,"11":0},"b":{"1":[2,8]},"f":{"1":3,"2":8,"3":8,"4":24,"5":50,"6":10,"7":8,"8":7,"9":0,"10":14,"11":0},"fnMap":{"1":{"name":"constructor","line":41,"loc":{"start":{"line":23,"column":4},"end":{"line":42,"column":5}}},"2":{"name":"votingDelay","line":46,"loc":{"start":{"line":46,"column":4},"end":{"line":53,"column":4}}},"3":{"name":"votingPeriod","line":55,"loc":{"start":{"line":55,"column":4},"end":{"line":62,"column":4}}},"4":{"name":"quorum","line":64,"loc":{"start":{"line":64,"column":4},"end":{"line":71,"column":4}}},"5":{"name":"state","line":73,"loc":{"start":{"line":73,"column":4},"end":{"line":80,"column":4}}},"6":{"name":"propose","line":82,"loc":{"start":{"line":82,"column":4},"end":{"line":92,"column":4}}},"7":{"name":"proposalThreshold","line":94,"loc":{"start":{"line":94,"column":4},"end":{"line":101,"column":4}}},"8":{"name":"_execute","line":103,"loc":{"start":{"line":103,"column":4},"end":{"line":111,"column":4}}},"9":{"name":"_cancel","line":113,"loc":{"start":{"line":113,"column":4},"end":{"line":120,"column":4}}},"10":{"name":"_executor","line":122,"loc":{"start":{"line":122,"column":4},"end":{"line":129,"column":4}}},"11":{"name":"supportsInterface","line":131,"loc":{"start":{"line":131,"column":4},"end":{"line":138,"column":4}}}},"statementMap":{"1":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"2":{"start":{"line":61,"column":8},"end":{"line":61,"column":35}},"3":{"start":{"line":70,"column":8},"end":{"line":70,"column":40}},"4":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"5":{"start":{"line":88,"column":8},"end":{"line":88,"column":2473}},"6":{"start":{"line":91,"column":8},"end":{"line":91,"column":69}},"7":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"8":{"start":{"line":110,"column":8},"end":{"line":110,"column":78}},"9":{"start":{"line":119,"column":8},"end":{"line":119,"column":73}},"10":{"start":{"line":128,"column":8},"end":{"line":128,"column":32}},"11":{"start":{"line":137,"column":8},"end":{"line":137,"column":51}}},"branchMap":{"1":{"line":88,"type":"if","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":8}},{"start":{"line":88,"column":8},"end":{"line":88,"column":8}}]}}},"contracts/TimeLock.sol":{"l":{},"path":"/home/furkansezal/dao/contracts/TimeLock.sol","s":{},"b":{},"f":{"1":3},"fnMap":{"1":{"name":"constructor","line":14,"loc":{"start":{"line":10,"column":4},"end":{"line":14,"column":58}}}},"statementMap":{},"branchMap":{}}} \ No newline at end of file diff --git a/coverage/contracts/FundProject.sol.html b/coverage/contracts/FundProject.sol.html index 380db2b..8611122 100644 --- a/coverage/contracts/FundProject.sol.html +++ b/coverage/contracts/FundProject.sol.html @@ -20,24 +20,24 @@

- 89.06% + 87.88% Statements - 57/64 + 58/66
- 72.22% + 75% Branches - 13/18 + 15/20
- 81.82% + 78.26% Functions - 18/22 + 18/23
- 83.78% + 82.89% Lines - 62/74 + 63/76
@@ -312,7 +312,22 @@

267 268 269 -270

contracts/
63.38%45/7133.33%6/1874.36%29/3960.49%49/81contracts/
82.5%66/8065%13/2080%32/4079.12%72/91
  +264 +265 +266 +267 +268 +269 +270  +  +  +  +        @@ -467,14 +477,16 @@

      + + + -  -      -  +     +     @@ -529,7 +541,7 @@

      - +       @@ -617,6 +629,10 @@

event projectFundingFailed(uint256 indexed _projectId); event enteranceFeePaid(address indexed _projectOwner); event projectGoesToFunding(uint256 indexed _projectId); + event withdrawFundSuccessfully( + address indexed __investor, + uint256 indexed __projectId + );   modifier isApporovedByDao(uint256 _projecID) { Iif (!_isApporovedByDao[_projecID]) @@ -730,14 +746,16 @@

}   function withdrawFund(uint256 _projectID) public { - Iif (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) { - uint256 fundToSent = funders[_projectID][msg.sender]; - (bool success, ) = (payable(msg.sender)).call{value: fundToSent}( + if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) { + uint256 fundToSent = funders[_projectID][msg.sender]; + funders[_projectID][msg.sender] = 0; + (bool success, ) = (payable(msg.sender)).call{value: fundToSent}( "" ); - if (!success) { + Iif (!success) { revert FundProject__WithdrawTransferFailed(); } + emit withdrawFundSuccessfully(msg.sender, projectId); } else { revert FundProject__withdrawFund(); } @@ -838,7 +856,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index 78cc782..8de73ef 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -211,7 +211,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 57f7299..691c021 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -466,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index c0b1896..efeab19 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index 728ba18..daa2296 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,14 +20,14 @@

- 82.5% + 86.59% Statements - 66/80 + 71/82
- 65% + 75% Branches - 13/20 + 15/20
80% @@ -35,9 +35,9 @@

32/40

- 79.12% + 82.8% Lines - 72/91 + 77/93
@@ -60,15 +60,15 @@

FundProject.sol
82.26%51/6261.11%11/18
87.5%56/6472.22%13/18 77.27% 17/2277.78%56/7282.43%61/74
contracts/
82.5%66/8065%13/20
86.59%71/8275%15/20 80% 32/4079.12%72/9182.8%77/93
  +264 +265 +266 +267 +268 +269 +270  +  +  +  +        @@ -467,14 +477,16 @@

      + + + -  -      -  +     +     @@ -529,7 +541,7 @@

      - +       @@ -617,6 +629,10 @@

event projectFundingFailed(uint256 indexed _projectId); event enteranceFeePaid(address indexed _projectOwner); event projectGoesToFunding(uint256 indexed _projectId); + event withdrawFundSuccessfully( + address indexed __investor, + uint256 indexed __projectId + );   modifier isApporovedByDao(uint256 _projecID) { Iif (!_isApporovedByDao[_projecID]) @@ -730,14 +746,16 @@

}   function withdrawFund(uint256 _projectID) public { - Iif (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) { - uint256 fundToSent = funders[_projectID][msg.sender]; - (bool success, ) = (payable(msg.sender)).call{value: fundToSent}( + if (_ProjectFundingStatus[_projectID] == ProjectFundingStatus.FAILED) { + uint256 fundToSent = funders[_projectID][msg.sender]; + funders[_projectID][msg.sender] = 0; + (bool success, ) = (payable(msg.sender)).call{value: fundToSent}( "" ); - if (!success) { + Iif (!success) { revert FundProject__WithdrawTransferFailed(); } + emit withdrawFundSuccessfully(msg.sender, projectId); } else { revert FundProject__withdrawFund(); } @@ -838,7 +856,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index 78cc782..8de73ef 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -211,7 +211,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 57f7299..691c021 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -466,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index c0b1896..efeab19 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index 728ba18..daa2296 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,14 +20,14 @@

- 82.5% + 86.59% Statements - 66/80 + 71/82
- 65% + 75% Branches - 13/20 + 15/20
80% @@ -35,9 +35,9 @@

32/40

- 79.12% + 82.8% Lines - 72/91 + 77/93
@@ -60,15 +60,15 @@

FundProject.sol
82.26%51/6261.11%11/18
87.5%56/6472.22%13/18 77.27% 17/2277.78%56/7282.43%61/74
contracts/
82.5%66/8065%13/20
86.59%71/8275%15/20 80% 32/4079.12%72/9182.8%77/93
FundProject.sol
87.5%56/64
89.06%57/64 72.22% 13/1877.27%17/2282.43%61/7481.82%18/2283.78%62/74
contracts/
86.59%71/82
87.8%72/82 75% 15/2080%32/4082.8%77/9382.5%33/4083.87%78/93
FundProject.sol
87.5%56/64
89.06%57/64 72.22% 13/1877.27%17/2282.43%61/7481.82%18/2283.78%62/74
contracts/
86.59%71/82
87.8%72/82 75% 15/2080%32/4082.8%77/9382.5%33/4083.87%78/93
  +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284  +        @@ -395,6 +410,10 @@

    +  +  +  +      @@ -404,6 +423,8 @@

+  +  @@ -428,10 +449,11 @@

  12× 14× -14× +   -14× -14× +  + +   @@ -439,6 +461,7 @@

      +  @@ -473,6 +496,7 @@

  +       @@ -549,7 +573,7 @@

      - +        @@ -581,6 +605,10 @@

      +  + +  +   

// SPDX-License-Identifier: MIT
 pragma solidity ^0.8.0;
  
@@ -624,6 +652,7 @@ 

mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus; mapping(address => bool) public _isEnteranceFeePaid; mapping(address => uint256[]) public investedProjects; // investor address => investedProjects + mapping(uint256 => address) public projectOwnerAddressIndex;   event projectSuccessfullyFunded(uint256 indexed _projectId); event projectFundingFailed(uint256 indexed _projectId); @@ -660,10 +689,14 @@

string memory _ipfsHash, uint256 _fundingGoalAmount, uint256 _time, - address _projectOwnerAddress + uint256 _projectOwnerAddressIndex ) external onlyOwner { // only dao can call it - Iif (!_isEnteranceFeePaid[_projectOwnerAddress]) { + Iif ( + !_isEnteranceFeePaid[ + projectOwnerAddressIndex[_projectOwnerAddressIndex] + ] + ) { revert FundProject__EnteranceFeeNeeded(); } else { projectToTime[projectId][_time] = block.timestamp; @@ -672,7 +705,9 @@

projectFundingGoalAmount[projectId] = _fundingGoalAmount; hashToProjectId[_ipfsHash] = projectId; idToHash[projectId] = _ipfsHash; - projectOwnerAddress[projectId] = _projectOwnerAddress; + projectOwnerAddress[projectId] = projectOwnerAddressIndex[ + _projectOwnerAddressIndex + ]; _isApporovedByDao[projectId] = true; _isFunding[projectId] = true; emit projectGoesToFunding(projectId); @@ -695,14 +730,16 @@

override returns (bool upkeepNeeded, bytes memory performData) { - for (uint i = 1; i <= projectId; i++) { - bool isFunded = _isFunding[i]; - bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) > - time[i]; - upkeepNeeded = (isFunded && timePassed); - if (upkeepNeeded) { - performData = abi.encodePacked(i); - break; + for (uint projectIndex = 1; projectIndex <= projectId; projectIndex++) { + if (_isFunding[projectIndex]) { + bool timePassed = (block.timestamp - + (projectToTime[projectIndex][time[projectIndex]])) > + time[projectIndex]; + upkeepNeeded = (timePassed); + if (upkeepNeeded) { + performData = abi.encodePacked(projectIndex); + break; + } } } } @@ -719,8 +756,8 @@

  if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) { _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS; - uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) / - 100; + uint256 fundsToSent = (projectFunds[ProjectId] * + (100 - daoPercentage)) / 100; projectFunds[ProjectId] = 0; (bool success, ) = (projectOwnerAddress[ProjectId]).call{ value: fundsToSent @@ -741,6 +778,7 @@

revert FundProject__NotEnoughPayment(); } else { _isEnteranceFeePaid[msg.sender] = true; + projectOwnerAddressIndex[projectId] = msg.sender; emit enteranceFeePaid(msg.sender); } } @@ -817,8 +855,8 @@

return enteranceFee; }   - function isEnteranceFeePaid(address account) public view returns (bool) { - return _isEnteranceFeePaid[account]; + function isEnteranceFeePaid(address account) public view returns (bool) { + return _isEnteranceFeePaid[account]; }   function getFunderBalance(uint256 _projectID) @@ -849,6 +887,10 @@

a = block.timestamp - projectToTime[_projectID][time[_projectID]]; b = time[_projectID]; } +  + function getCurrentProjectId() public view returns (uint256) { + return projectId; + } }  

@@ -856,7 +898,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index 6cddc89..a8a70b4 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -211,7 +211,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index 846ca76..ff9f86d 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -269,8 +269,8 @@

      -16× - +10× +     @@ -466,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index 9ceea95..c92b59f 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index d445e1f..f6b60a9 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,24 +20,24 @@

- 87.8% + 86.9% Statements - 72/82 + 73/84
- 75% + 77.27% Branches - 15/20 + 17/22
- 82.5% + 80.49% Functions - 33/40 + 33/41
- 83.87% + 83.16% Lines - 78/93 + 79/95
@@ -60,15 +60,15 @@

FundProject.sol
89.06%57/6472.22%13/1881.82%18/2283.78%62/74
87.88%58/6675%15/2078.26%18/2382.89%63/76
contracts/
87.8%72/8275%15/2082.5%33/4083.87%78/93
86.9%73/8477.27%17/2280.49%33/4183.16%79/95
  +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284  +        @@ -395,6 +410,10 @@

    +  +  +  +      @@ -404,6 +423,8 @@

+  +  @@ -428,10 +449,11 @@

  12× 14× -14× +   -14× -14× +  + +   @@ -439,6 +461,7 @@

      +  @@ -473,6 +496,7 @@

  +       @@ -549,7 +573,7 @@

      - +        @@ -581,6 +605,10 @@

      +  + +  +   

// SPDX-License-Identifier: MIT
 pragma solidity ^0.8.0;
  
@@ -624,6 +652,7 @@ 

mapping(uint256 => ProjectFundingStatus) public _ProjectFundingStatus; mapping(address => bool) public _isEnteranceFeePaid; mapping(address => uint256[]) public investedProjects; // investor address => investedProjects + mapping(uint256 => address) public projectOwnerAddressIndex;   event projectSuccessfullyFunded(uint256 indexed _projectId); event projectFundingFailed(uint256 indexed _projectId); @@ -660,10 +689,14 @@

string memory _ipfsHash, uint256 _fundingGoalAmount, uint256 _time, - address _projectOwnerAddress + uint256 _projectOwnerAddressIndex ) external onlyOwner { // only dao can call it - Iif (!_isEnteranceFeePaid[_projectOwnerAddress]) { + Iif ( + !_isEnteranceFeePaid[ + projectOwnerAddressIndex[_projectOwnerAddressIndex] + ] + ) { revert FundProject__EnteranceFeeNeeded(); } else { projectToTime[projectId][_time] = block.timestamp; @@ -672,7 +705,9 @@

projectFundingGoalAmount[projectId] = _fundingGoalAmount; hashToProjectId[_ipfsHash] = projectId; idToHash[projectId] = _ipfsHash; - projectOwnerAddress[projectId] = _projectOwnerAddress; + projectOwnerAddress[projectId] = projectOwnerAddressIndex[ + _projectOwnerAddressIndex + ]; _isApporovedByDao[projectId] = true; _isFunding[projectId] = true; emit projectGoesToFunding(projectId); @@ -695,14 +730,16 @@

override returns (bool upkeepNeeded, bytes memory performData) { - for (uint i = 1; i <= projectId; i++) { - bool isFunded = _isFunding[i]; - bool timePassed = (block.timestamp - (projectToTime[i][time[i]])) > - time[i]; - upkeepNeeded = (isFunded && timePassed); - if (upkeepNeeded) { - performData = abi.encodePacked(i); - break; + for (uint projectIndex = 1; projectIndex <= projectId; projectIndex++) { + if (_isFunding[projectIndex]) { + bool timePassed = (block.timestamp - + (projectToTime[projectIndex][time[projectIndex]])) > + time[projectIndex]; + upkeepNeeded = (timePassed); + if (upkeepNeeded) { + performData = abi.encodePacked(projectIndex); + break; + } } } } @@ -719,8 +756,8 @@

  if (projectFunds[ProjectId] > projectFundingGoalAmount[ProjectId]) { _ProjectFundingStatus[ProjectId] = ProjectFundingStatus.SUCCESS; - uint256 fundsToSent = (projectFunds[ProjectId] * daoPercentage) / - 100; + uint256 fundsToSent = (projectFunds[ProjectId] * + (100 - daoPercentage)) / 100; projectFunds[ProjectId] = 0; (bool success, ) = (projectOwnerAddress[ProjectId]).call{ value: fundsToSent @@ -741,6 +778,7 @@

revert FundProject__NotEnoughPayment(); } else { _isEnteranceFeePaid[msg.sender] = true; + projectOwnerAddressIndex[projectId] = msg.sender; emit enteranceFeePaid(msg.sender); } } @@ -817,8 +855,8 @@

return enteranceFee; }   - function isEnteranceFeePaid(address account) public view returns (bool) { - return _isEnteranceFeePaid[account]; + function isEnteranceFeePaid(address account) public view returns (bool) { + return _isEnteranceFeePaid[account]; }   function getFunderBalance(uint256 _projectID) @@ -849,6 +887,10 @@

a = block.timestamp - projectToTime[_projectID][time[_projectID]]; b = time[_projectID]; } +  + function getCurrentProjectId() public view returns (uint256) { + return projectId; + } }  

@@ -856,7 +898,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index 6cddc89..a8a70b4 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -211,7 +211,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index 846ca76..ff9f86d 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -269,8 +269,8 @@

      -16× - +10× +     @@ -466,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index 9ceea95..c92b59f 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index d445e1f..f6b60a9 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,24 +20,24 @@

- 87.8% + 86.9% Statements - 72/82 + 73/84
- 75% + 77.27% Branches - 15/20 + 17/22
- 82.5% + 80.49% Functions - 33/40 + 33/41
- 83.87% + 83.16% Lines - 78/93 + 79/95
@@ -60,15 +60,15 @@

FundProject.sol
89.06%57/6472.22%13/1881.82%18/2283.78%62/74
87.88%58/6675%15/2078.26%18/2382.89%63/76
contracts/
87.8%72/8275%15/2082.5%33/4083.87%78/93
86.9%73/8477.27%17/2280.49%33/4183.16%79/95
// SPDX-License-Identifier: MIT
@@ -715,11 +715,11 @@ 

} }   - function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { + function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { // only dao can call it - _isApporovedByDao[_projecID] = false; - _isFunding[projectId] = false; - _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; + _isApporovedByDao[_projecID] = false; + _isFunding[_projecID] = false; + _ProjectFundingStatus[_projecID] = ProjectFundingStatus.CANCELED; }   function checkUpkeep( @@ -898,7 +898,7 @@

diff --git a/coverage/contracts/GovernanceToken.sol.html b/coverage/contracts/GovernanceToken.sol.html index a8a70b4..6565d5a 100644 --- a/coverage/contracts/GovernanceToken.sol.html +++ b/coverage/contracts/GovernanceToken.sol.html @@ -20,9 +20,9 @@

- 85.71% + 100% Statements - 6/7 + 7/7
100% @@ -30,14 +30,14 @@

0/0

- 83.33% + 100% Functions - 5/6 + 6/6
- 85.71% + 100% Lines - 6/7 + 7/7
@@ -124,8 +124,8 @@

      -31× -31× +35× +35×       @@ -133,11 +133,11 @@

      - +       -  +       @@ -167,8 +167,8 @@

);   constructor() - ERC20("GovernanceToken", "GT") - ERC20Permit("GovernanceToken") + ERC20("QuickfundDAOToken", "QFD") + ERC20Permit("QuickfundDAOToken") { _mint(msg.sender, s_initialSupply); } @@ -190,8 +190,8 @@

super._mint(to, amount); }   - function mintToken(address to, uint256 amount) external { - _mint(to, amount); + function mintToken(address to, uint256 amount) external { + _mint(to, amount); }   function burnToken(address account, uint256 amount) external { @@ -211,7 +211,7 @@

diff --git a/coverage/contracts/GovernerContract.sol.html b/coverage/contracts/GovernerContract.sol.html index ff9f86d..7aebc65 100644 --- a/coverage/contracts/GovernerContract.sol.html +++ b/coverage/contracts/GovernerContract.sol.html @@ -233,7 +233,7 @@

      - +10×       @@ -242,7 +242,7 @@

      - +10×       @@ -251,7 +251,7 @@

      -24× +30×       @@ -260,7 +260,7 @@

      -50× +62×       @@ -269,10 +269,10 @@

      -10× +12×   - +10×       @@ -281,7 +281,7 @@

      - +10×       @@ -291,7 +291,7 @@

      - +       @@ -309,7 +309,7 @@

      -14× +18×       @@ -466,7 +466,7 @@

diff --git a/coverage/contracts/TimeLock.sol.html b/coverage/contracts/TimeLock.sol.html index c92b59f..8c6b4c6 100644 --- a/coverage/contracts/TimeLock.sol.html +++ b/coverage/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/contracts/index.html b/coverage/contracts/index.html index f6b60a9..5ec14f2 100644 --- a/coverage/contracts/index.html +++ b/coverage/contracts/index.html @@ -20,9 +20,9 @@

- 86.9% + 91.67% Statements - 73/84 + 77/84
77.27% @@ -30,14 +30,14 @@

17/22

- 80.49% + 85.37% Functions - 33/41 + 35/41
- 83.16% + 87.37% Lines - 79/95 + 83/95
@@ -60,28 +60,28 @@

FundProject.sol
87.88%58/66
92.42%61/66 75% 15/2078.26%18/2382.89%63/7682.61%19/2386.84%66/76
GovernanceToken.sol
85.71%6/7
100%7/7 100% 0/083.33%5/685.71%6/7100%6/6100%7/7
contracts/
86.9%73/84
91.67%77/84 77.27% 17/2280.49%33/4183.16%79/9585.37%35/4187.37%83/95
// SPDX-License-Identifier: MIT
@@ -715,11 +715,11 @@ 

} }   - function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { + function cancelApporovelFundingByDao(uint256 _projecID) external onlyOwner { // only dao can call it - _isApporovedByDao[_projecID] = false; - _isFunding[projectId] = false; - _ProjectFundingStatus[projectId] = ProjectFundingStatus.CANCELED; + _isApporovedByDao[_projecID] = false; + _isFunding[_projecID] = false; + _ProjectFundingStatus[_projecID] = ProjectFundingStatus.CANCELED; }   function checkUpkeep( @@ -898,7 +898,7 @@

diff --git a/coverage/lcov-report/contracts/GovernanceToken.sol.html b/coverage/lcov-report/contracts/GovernanceToken.sol.html index a8a70b4..6565d5a 100644 --- a/coverage/lcov-report/contracts/GovernanceToken.sol.html +++ b/coverage/lcov-report/contracts/GovernanceToken.sol.html @@ -20,9 +20,9 @@

- 85.71% + 100% Statements - 6/7 + 7/7
100% @@ -30,14 +30,14 @@

0/0

- 83.33% + 100% Functions - 5/6 + 6/6
- 85.71% + 100% Lines - 6/7 + 7/7
@@ -124,8 +124,8 @@

      -31× -31× +35× +35×       @@ -133,11 +133,11 @@

      - +       -  +       @@ -167,8 +167,8 @@

);   constructor() - ERC20("GovernanceToken", "GT") - ERC20Permit("GovernanceToken") + ERC20("QuickfundDAOToken", "QFD") + ERC20Permit("QuickfundDAOToken") { _mint(msg.sender, s_initialSupply); } @@ -190,8 +190,8 @@

super._mint(to, amount); }   - function mintToken(address to, uint256 amount) external { - _mint(to, amount); + function mintToken(address to, uint256 amount) external { + _mint(to, amount); }   function burnToken(address account, uint256 amount) external { @@ -211,7 +211,7 @@

diff --git a/coverage/lcov-report/contracts/GovernerContract.sol.html b/coverage/lcov-report/contracts/GovernerContract.sol.html index ff9f86d..7aebc65 100644 --- a/coverage/lcov-report/contracts/GovernerContract.sol.html +++ b/coverage/lcov-report/contracts/GovernerContract.sol.html @@ -233,7 +233,7 @@

      - +10×       @@ -242,7 +242,7 @@

      - +10×       @@ -251,7 +251,7 @@

      -24× +30×       @@ -260,7 +260,7 @@

      -50× +62×       @@ -269,10 +269,10 @@

      -10× +12×   - +10×       @@ -281,7 +281,7 @@

      - +10×       @@ -291,7 +291,7 @@

      - +       @@ -309,7 +309,7 @@

      -14× +18×       @@ -466,7 +466,7 @@

diff --git a/coverage/lcov-report/contracts/TimeLock.sol.html b/coverage/lcov-report/contracts/TimeLock.sol.html index c92b59f..8c6b4c6 100644 --- a/coverage/lcov-report/contracts/TimeLock.sol.html +++ b/coverage/lcov-report/contracts/TimeLock.sol.html @@ -94,7 +94,7 @@

diff --git a/coverage/lcov-report/contracts/index.html b/coverage/lcov-report/contracts/index.html index f6b60a9..5ec14f2 100644 --- a/coverage/lcov-report/contracts/index.html +++ b/coverage/lcov-report/contracts/index.html @@ -20,9 +20,9 @@

- 86.9% + 91.67% Statements - 73/84 + 77/84
77.27% @@ -30,14 +30,14 @@

17/22

- 80.49% + 85.37% Functions - 33/41 + 35/41
- 83.16% + 87.37% Lines - 79/95 + 83/95
@@ -60,28 +60,28 @@

FundProject.sol
87.88%58/66
92.42%61/66 75% 15/2078.26%18/2382.89%63/7682.61%19/2386.84%66/76
GovernanceToken.sol
85.71%6/7
100%7/7 100% 0/083.33%5/685.71%6/7100%6/6100%7/7
contracts/
86.9%73/84
91.67%77/84 77.27% 17/2280.49%33/4183.16%79/9585.37%35/4187.37%83/95